Postgresql
不使用 PostgreSQL 部分索引取決於布爾比較
我需要幫助理解為什麼部分索引會在一個查詢中使用,而不會在第二個查詢中使用,這實際上是相同的。
我有下表:
Column | Type | Collation | Nullable | Default ----------------+--------------------------+-----------+----------+------------- id | text | | not null | field1 | text | | not null | field2 | text | | not null | field3 | boolean | | not null | false
使用部分索引:
CREATE INDEX idx__my_table_index ON my_table(field1, field2) WHERE field3 IS FALSE;
以及以下兩個查詢:
postgres=> explain select distinct field1, field2 from my_table where not field3; -[ RECORD 1 ]---------------------------------------------------------------------------- QUERY PLAN | Unique (cost=113849.28..113849.66 rows=36 width=29) -[ RECORD 2 ]---------------------------------------------------------------------------- QUERY PLAN | -> Sort (cost=113849.28..113849.37 rows=38 width=29) -[ RECORD 3 ]---------------------------------------------------------------------------- QUERY PLAN | Sort Key: field1, field2 -[ RECORD 4 ]---------------------------------------------------------------------------- QUERY PLAN | -> Seq Scan on my_table (cost=0.00..113848.28 rows=38 width=29) -[ RECORD 5 ]---------------------------------------------------------------------------- QUERY PLAN | Filter: (NOT field3)
第二個:
postgres=> explain select distinct field1, field2 from my_table where field3 IS FALSE; -[ RECORD 1 ]----------------------------------------------------------------------------------------------------------------------- QUERY PLAN | Unique (cost=0.14..13.03 rows=36 width=29) -[ RECORD 2 ]----------------------------------------------------------------------------------------------------------------------- QUERY PLAN | -> Index Only Scan using idx__my_table_index on reservation (cost=0.14..12.75 rows=38 width=29)
PS 我正在使用 PostgreSQL 9.6
遊戲的確切規則可以在手冊的部分索引章節中找到:
準確地說,只有當系統能夠辨識出
WHERE
查詢的條件在數學上暗示了索引的謂詞時,才能在查詢中使用部分索引。PostgreSQL 沒有一個複雜的定理證明器可以辨識以不同形式編寫的數學等價表達式。(不僅這樣的一般定理證明器極難創建,而且可能太慢而無法真正使用。)系統可以辨識簡單的不等式含義,例如“x < 1”意味著“x < 2”;否則謂詞條件必須與查詢條件的一部分完全匹配,WHERE
否則索引將不會被辨識為可用。大膽強調我的。
因此,查詢謂詞
where not field3
不被辨識為與索引謂詞匹配where field3 IS FALSE
,因此查詢計劃器不考慮它。