我有桌子

CREATE TABLE BulkContainers 
( objectId int PRIMARY KEY NOT NULL,
  geometryType VARCHAR(10) NOT NULL, 
  geodata geometry NOT NULL, 
  timeFrom time, 
  timeTo time, 
  cityDistrict VARCHAR(25), 
  street VARCHAR(60),
  trashTypeName VARCHAR(20), 
  payer VARCHAR(40), 
  day date);

表包含约60k条记录,其中地理数据仅为点.

我在地理数据属性上创建了GIST索引.

不幸的是,查询速度非常慢.我测试了查询集合,其中我使用了ST_Intersects函数,并获得了~20Q/s的吞吐量.

查询示例:

SELECT * FROM BulkContainers WHERE ST_Intersects('POLYGON((14.435818094927747 50.117437918784645,14.435860110788347 50.100516737473654,14.436327451178308 50.105539453354766,14.43664241497306 50.100437942566366,14.437047791355718 50.11031766846078,14.437714063262893 50.105611788231904,14.439779334511888 50.11428054963237,14.438273887651917 50.119529142381225,14.43732995152818 50.11984052052608,14.435818094927747 50.117437918784645))', geodata) IS TRUE;

索引创建为:

CREATE INDEX iindex ON BulkContainers USING gist(geodata); 

解释计划如下:

"QUERY PLAN"
"Seq Scan on public.bulkcontainers  (cost=0.00..3823.65 rows=20 width=124) (actual time=27.961..27.961 rows=0 loops=1)"
"  Output: objectid, geometrytype, geodata, timefrom, timeto, citydistrict, street, trashtypename, payer, day"
"  Filter: (((bulkcontainers.geodata && '010300000001000000040000001F85EB51B8DE2C40022B8716D90E4940AC1C5A643BDF2C4077BE9F1A2F0D4940C74B378941E02C40CDCCCCCCCC0C49401F85EB51B8DE2C40022B8716D90E4940'::geometry) AND _st_intersects(bulkcontainers.geodata, '010300000001000000040000001F85EB51B8DE2C40022B8716D90E4940AC1C5A643BDF2C4077BE9F1A2F0D4940C74B378941E02C40CDCCCCCCCC0C49401F85EB51B8DE2C40022B8716D90E4940'::geometry)) IS TRUE)"
"  Rows Removed by Filter: 67084"
"  Buffers: shared hit=1308"
"Planning time: 2.168 ms"
"Execution time: 28.207 ms"

推荐答案

这是真的,搞砸了索引的使用.只需编写裸露的st_intersects函数调用.它的意思是一样的,但它的书写方式让索引机器感到兴奋.

我有时会发现,即使没有is true,我也无法使用索引,但这是不可重现的.我认为当我有一个混蛋安装时,它会发生,其中PostgreSQL被重新编译并安装在以前的安装之上,但postgis没有被重新编译和重新安装.因此,存在报头不匹配.

Postgresql相关问答推荐

使用regexp获取表名

在Postgres中,如何删除包含N个自然数的表,并替换为生成子查询?

Postgres 对 WHERE 子句并行使用两个索引

PostgreSQL 连接字符串的正则表达式

Postgres 使用不同元素数据类型的订单数据

PG 16 的 AGE 安装抛出错误:无法创建 src/backend/parser/ag_scanner.c

Postgres 唯一 JSON 数组聚合值

如何将两条线几何连接成一条记录?

如何 Select 任意行的相邻行(在 sql 或 postgresql 中)?

我应该使用哪个 postgresql 包?

在执行 postgresql 函数时提交事务

SQL:当谈到 NOT IN 和 NOT EQUAL TO 时,哪个更有效,为什么?

在 PostgreSQL 中将时间转换为秒

需要将整个 postgreSQL 数据库加载到 RAM 中

'active' 标志与否?

PostgreSQL如何连接间隔值'2天'

在 postgreSQL 中更改序列名称

使用 Homebrew 安装 icu4c 版本 63

调用 getNextException 来查看原因:如何让 Hibernate / JPA 显示异常的数据库服务器消息

使用python将数据从csv复制到postgresql