Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/377.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/postgresql/10.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/actionscript-3/6.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 如何提高PostgreSQL数据库中大量数据的查询效率?_Java_Postgresql_Jdbc_Postgresql Performance - Fatal编程技术网

Java 如何提高PostgreSQL数据库中大量数据的查询效率?

Java 如何提高PostgreSQL数据库中大量数据的查询效率?,java,postgresql,jdbc,postgresql-performance,Java,Postgresql,Jdbc,Postgresql Performance,我有一个拥有12亿行的PostgreSQL数据库,试图创建一个一次查询一百万行的应用程序,并可以选择查询更大的间隔。 起初我只是轻松地查询一个100万到1000万的数据库现在我正在查询一个带有偏移量的大型数据库,结果集需要很长时间才能生成。 // ... stmt.setFetchSize(100000); ResultSet rs = stmt.executeQuery("SELECT mmsi, report_timestamp, position_geom, ST_X(p

我有一个拥有12亿行的PostgreSQL数据库,试图创建一个一次查询一百万行的应用程序,并可以选择查询更大的间隔。 起初我只是轻松地查询一个100万到1000万的数据库
现在我正在查询一个带有
偏移量的大型数据库,
结果集
需要很长时间才能生成。

   // ...
   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); 
因此,
orderby
可能会占用我的执行时间,但将信息有序化会使以后的工作更轻松。是否有一种更有效的方法来按时间间隔查询行

对于此查询:

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)

此索引应直接用于查询。

您可以使用在数据库子集上构建的部分索引

CREATE INDEX idx_reports4 ON reports4(position_geom, report_timestamp) where position_geom IS NOT NULL;

这将大大提高性能,因为您只需对所需数据库的一部分进行索引。

您的表中有哪些索引?如果您的表是在
report\u timestamp
上进行索引的,这几乎是不可行的。我想也有部分索引可以精确匹配
where
子句。非常感谢@Gordon Linoff,我不知道索引,我将做一些阅读:)这将索引划分为“is null”和“is not null”两种情况;用一个@guy_唤醒者:哇,12亿行,你从来没有需要创建索引吗?你一定有一些非常强大的硬件。。。