正如此評論所推薦的,我建立了一個 intarray GIN 索引。我什至set local enable_seqscan = 'off';. 不過,當EXPLAIN我查詢時,它正在執行順序掃描。為了演示,我創建了一個名為deletethis.
devapp=>
devapp=> \d deletethis;
Table "public.deletethis"
Column | Type | Collation | Nullable | Default
-------- ----------- ----------- ---------- ---------
col1 | integer[] | | |
Indexes:
"deletethis_idx" gin (col1 gin__int_ops)
devapp=>
devapp=>
devapp=> BEGIN; set local enable_seqscan = False; SHOW enable_seqscan; EXPLAIN SELECT * from deletethis where 1 = ANY(col1); COMMIT;
BEGIN
SET
enable_seqscan
----------------
off
(1 row)
QUERY PLAN
-------------------------------------------------------------------------------
Seq Scan on deletethis (cost=10000000000.00..10000000040.60 rows=7 width=32)
Filter: (1 = ANY (col1))
(2 rows)
COMMIT
devapp=>
enable_seqscan為什么盡管已設定為 ,但它仍在進行 Seq Scan 并且不使用索引off?
uj5u.com熱心網友回復:
正如我在您參考的同一問題的另一個答案中提到的那樣,該ANY構造無法利用 GIN 索引:
- PostgreSQL 可以索引陣列列嗎?
這可以使用您的索引:
SELECT * FROM deletethis WHERE col1 @> '{1}';
'{1}'作為一個陣列文字。陣列建構式( ) 或任何型別的ARRAY[1]變數或列integer[]也可以作業。
看:
- 檢查 Postgres 陣列中是否存在值
- 無法插入:錯誤:陣列值必須以“{”或維度資訊開頭
輸入的顯式型別轉換是可選的,因為文字的賦值轉換以及建構式的默認型別恰好對我們有用。
但是在使用附加模塊的運算子類時intarray,請注意使用integer( int4) 進行操作,不要使用其他操作。有關的:
- 比較陣列是否相等,忽略元素的順序
- smallint[] 列上的 GIN 索引未使用或錯誤“操作員不是唯一的”
轉載請註明出處,本文鏈接:https://www.uj5u.com/houduan/464500.html
標籤:数据库 PostgreSQL 索引
上一篇:表中有重復記錄,我們需要使用sql中的groupby或window函式僅選擇按日期的最新記錄
下一篇:如何保持更改后的值?
