我正在嘗試僅使用索引掃描來制作 Postgis,但它正在將位圖索引掃描執行到位圖堆掃描中。
我得到了下表 - 包含 50k 行:
CREATE TABLE IF NOT EXISTS public.forme_iris
(
code_iris character varying(20) COLLATE pg_catalog."default" NOT NULL,
geometry geometry,
CONSTRAINT forme_iris_pkey PRIMARY KEY (code_iris)
)
我創建了這個索引:
CREATE INDEX forme_iris_geometry_idx1
ON public.forme_iris USING gist
(geometry, code_iris)
TABLESPACE pg_default;
我不能使用正確的覆寫索引和INCLUDE陳述句,Postgis 告訴我這是不支持的。
執行請求:
SELECT geometry, code_iris
FROM forme_iris iris
WHERE ST_Intersects(iris.geometry, ST_SetSrid(ST_GeomFromGeoJson('<geojson>'), 4326))
它回傳 821 行,我在執行請求之前已經對表進行了真空處理 分析。
PostgreSQL 版本:x86_64-pc-linux-gnu 上的 PostgreSQL 11.12,由 gcc (GCC) 7.3.1 20180712 (Red Hat 7.3.1-12) 編譯,64 位
Postgis 版本:2.5 USE_GEOS=1 USE_PROJ=1 USE_STATS=1
EXPLAIN ANALYZE輸出:https ://explain.dalibo.com/plan/TJQt
謝謝 !
uj5u.com熱心網友回復:
我也不能讓它做 IOS,即使是 INCLUDE(它在 v12 中被 GiST 支持)。
然而,在我看來,CPU 一直在檢查你的幾何列與你的怪物 geojson,我認為即使你能夠獲得僅索引掃描,仍然必須完成。因此,即使您可以讓它使用僅索引掃描,它實際上也可能對您沒有幫助。
uj5u.com熱心網友回復:
PostGIS GiST 索引壓縮值(它們存盤邊界框)并且沒有“獲取”方法,因此它們不能進行僅索引掃描:
SELECT opf.opfname,
amp.amprocnum,
amp.amproc::regproc
FROM pg_opfamily AS opf
JOIN pg_amproc AS amp ON opf.oid = amp.amprocfamily
JOIN pg_am ON opf.opfmethod = pg_am.oid
WHERE pg_am.amname = 'gist'
AND amp.amprocnum IN (3, 9) -- 3 is "compress", 9 is "fetch"
AND opf.opfname LIKE '%geometry%';
opfname │ amprocnum │ amproc
══════════════════════╪═══════════╪═══════════════════════════
gist_geometry_ops_2d │ 3 │ geometry_gist_compress_2d
gist_geometry_ops_nd │ 3 │ geometry_gist_compress_nd
(2 rows)
請參閱檔案:
GiST 的索引運算子類必須提供五種方法,其中六種是可選的。[...]
compress將資料項轉換為適合索引頁中物理存盤的格式。如果
compress省略該方法,則資料項將不加修改地存盤在索引中。[...]
fetch將資料項的壓縮索引表示轉換為原始資料型別,用于僅索引掃描。回傳的資料必須是原始索引值的精確、無損副本。
檔案沒有涵蓋這些方法的編號,您必須查閱源代碼。
轉載請註明出處,本文鏈接:https://www.uj5u.com/houduan/450560.html
標籤:PostgreSQL 索引 地理信息系统 复合键 覆盖指数
下一篇:使用內部聯接根據日期范圍創建計數
