我有如下表:Postgres - 這是在布爾列上創建部分索引的正確方法嗎?
CREATE TABLE recipemetadata
(
--Lots of columns
diet_glutenfree boolean NOT NULL,
);
大多數,除非有人能拿出符合席捲全國一些瘋狂的新的無麩質飲食的每一行都將被設置爲FALSE
。
我需要能夠非常快速地查詢這個值爲真的行。我創建了索引:
CREATE INDEX IDX_RecipeMetadata_GlutenFree ON RecipeMetadata(diet_glutenfree) WHERE diet_glutenfree;
這似乎是工作,但我無法弄清楚如何判斷它的確唯一索引行,其中的值是true。我想確保它沒有做任何愚蠢的事情,比如索引任何具有任何值的行。
我應該在WHERE
子句中添加一個運算符,還是該語法完全有效?希望這不是那些超級簡單的RTFM問題,它將被壓低30次。
UPDATE:
我已經先行一步,並添加10,000行到RecipeMetadata隨機值。然後我在桌子上做了一次ANALYZE,然後做了一次REINDEX。當我運行查詢:
select recipeid from RecipeMetadata where diet_glutenfree;
我得到:
'Seq Scan on recipemetadata (cost=0.00..214.26 rows=5010 width=16)'
' Filter: diet_glutenfree'
所以,這似乎是在做一個順序掃描在桌子上,即使只有大約一半的行具有該標誌。索引被忽略。
如果我做的:
select recipeid from RecipeMetadata where not diet_glutenfree;
我得到:
'Seq Scan on recipemetadata (cost=0.00..214.26 rows=5016 width=16)'
' Filter: (NOT diet_glutenfree)'
所以不管是什麼,不使用此索引。
請從檔案中添加一個PostgreSQL郵件列表文章的鏈接,以便人們可以將此討論與該討論聯繫起來。如果您將郵件列表帖子的鏈接發佈到此郵件列表中,那就太好了。如果你要在多個地方交叉發帖,請這麼說,以防止人們重複工作。 – 2011-12-15 05:45:00
不是問題,我將來會這樣做(我通常不會在這兩個地方發帖)。 – 2011-12-15 05:47:35
順便說一句,我認爲你的問題的簡短答案是「是」...但如果你擔心,用一些虛擬數據填充一個表,`ANALYZE`表,然後使用`EXPLAIN ANALYZE`來檢查一些查詢的計劃,這些查詢應該會觸及部分索引。 – 2011-12-15 05:56:20