我有下表:
CREATE TABLE recipemetadata
(
--Lots of columns
diet_glutenfree boolean NOT NULL,
);
FALSE
除非有人想出一些疯狂的新的无麸质饮食风靡全国,否则几乎每一行都将设置为。
我需要能够非常快速地查询该值为真的行。我创建了索引:
CREATE INDEX IDX_RecipeMetadata_GlutenFree ON RecipeMetadata(diet_glutenfree) WHERE diet_glutenfree;
它似乎有效,但是我不知道如何判断它是否确实只是索引值为真的行。我想确保它不会做一些愚蠢的事情,比如索引任何具有任何值的行。
我应该在子句中添加一个运算符WHERE
,还是这种语法完全有效?希望这不是那些会被否决 30 次的超级简单的 RTFM 问题之一。
更新:
我已经继续并使用随机值向 RecipeMetadata 添加了 10,000 行。然后我在桌子上做了一个分析和一个 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)'
所以无论如何,这个索引都没有被使用。