我有一个 1.2亿行的PostgreSQL数据库,试图让一个查询行一百万次的应用程序,并提供查询更大间隔的选项。
起初我只是轻松地查询一个百万到一千万的数据库;
现在我正在使用OFFSET
查询大型数据库ResultSet
需要很长时间才能生成。
// ...
stmt.setFetchSize(100000);
ResultSet rs = stmt.executeQuery("SELECT mmsi, report_timestamp, position_geom, ST_X(position_geom) AS Long, "
+ "ST_Y(position_geom) AS Lat FROM reports4 WHERE position_geom IS NOT NULL ORDER by report_timestamp ASC LIMIT "
+ limit + " OFFSET " + set);
所以ORDER BY
可能会占用我的执行时间,但是订购信息会让以后更容易。是否有更有效的方法来查询间隔中的行?
答案 0 :(得分:3)
对于此查询:
SELECT mmsi, report_timestamp, position_geom, ST_X(position_geom) AS Long, "
+ "ST_Y(position_geom) AS Lat
FROM reports4
WHERE position_geom IS NOT NULL
ORDER by report_timestamp ASC;
您应该能够在表达式上使用索引:
CREATE INDEX idx_reports4_position_ts ON reports4((position_geom IS NOT NULL), report_timestamp)
此索引应直接用于查询。
答案 1 :(得分:2)
您可以使用在数据库子集上构建的部分索引。
CREATE INDEX idx_reports4 ON reports4(position_geom, report_timestamp) where position_geom IS NOT NULL;
这会大大提高性能,因为您只是索引所需的数据库的一部分。