我们有一个表shops
,其列名为location
的列GEOMETRY(POINT,4326)
和类型为version
的tinyint
和一张桌子version
,其中一行包含整数。
为什么下面的查询未使用GIST(位置)的索引?
SELECT * FROM shops
WHERE ("version" IN (SELECT "version" FROM "version"))
ORDER BY (location <-> '0020000001000010e64029d460d2a8aee0404bc8bb0955ea17'::geometry) LIMIT 10;
与没有IN
的同一查询一样,does使用索引?
SELECT * FROM shops
WHERE ("version" = (SELECT "version" FROM "version" LIMIT 1))
ORDER BY (location <-> '0020000001000010e64029d460d2a8aee0404bc8bb0955ea17'::geometry) LIMIT 10;
这影响了我们,因为我们从Postgres 9更新到11。我能够追溯到上面的选择。
编辑:添加qry分析
第一次查询(无索引应用程序:)>
"Limit (cost=25260.30..25260.32 rows=10 width=1275) (actual time=254.809..254.814 rows=10 loops=1)" " -> Sort (cost=25260.30..25260.39 rows=36 width=1275) (actual time=254.807..254.809 rows=10 loops=1)" " Sort Key: ((shops.location <-> '0101000020E6100000E0AEA8D260D4294017EA5509BBC84B40'::geometry))" " Sort Method: top-N heapsort Memory: 54kB" " -> Nested Loop (cost=41.88..25259.52 rows=36 width=1275) (actual time=0.099..215.201 rows=58179 loops=1)" " Join Filter: (shops.version = version.version)" " -> HashAggregate (cost=41.88..43.88 rows=200 width=4) (actual time=0.014..0.016 rows=1 loops=1)" " Group Key: version.version" " -> Seq Scan on version (cost=0.00..35.50 rows=2550 width=4) (actual time=0.009..0.010 rows=1 loops=1)"
第二个查询:
"Limit (cost=0.28..440.04 rows=10 width=1275) (actual time=0.194..0.233 rows=10 loops=1)" " -> Nested Loop Semi Join (cost=0.28..1574995.44 rows=35815 width=1275) (actual time=0.193..0.230 rows=10 loops=1)" " Join Filter: (shop.version = version.version)" " -> Index Scan using shop_location_idx on shops (cost=0.28..101549.81 rows=71630 width=1267) (actual time=0.182..0.213 rows=10 loops=1)" " Order By: (location <-> '0101000020E6100000E0AEA8D260D4294017EA5509BBC84B40'::geometry)" " -> Materialize (cost=0.00..48.25 rows=2550 width=4) (actual time=0.001..0.001 rows=1 loops=10)" " -> Seq Scan on version (cost=0.00..35.50 rows=2550 width=4) (actual time=0.006..0.006 rows=1 loops=1)"
已解决
感谢@JimJones和@JimMacaulay,请参阅下面的答案
[我们有一个桌子商店,其列名为GEOMETRY(POINT,4326)类型的位置和tinyint类型的版本,以及带有一行包含整数的表版本。为什么下面的查询不使用...
以某种方式在版本表上添加索引也有助于Postgres使用location
列上的索引。