【发布时间】:2011-12-15 03:56:59
【问题描述】:
我有下表:
CREATE TABLE recipemetadata
(
--Lots of columns
diet_glutenfree boolean NOT NULL,
);
大多数每一行都将设置为FALSE,除非有人想出一些疯狂的新无麸质饮食风靡全国。
我需要能够非常快速地查询该值为 true 的行。我已经创建了索引:
CREATE INDEX IDX_RecipeMetadata_GlutenFree ON RecipeMetadata(diet_glutenfree) WHERE diet_glutenfree;
它似乎有效,但是我不知道如何判断它是否确实只是索引值为 true 的行。我想确保它不会做一些愚蠢的事情,比如索引任何具有任何值的行。
我应该在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)'
所以无论如何,这个索引并没有被使用。
【问题讨论】:
-
请从存档中添加一个指向您的 PostgreSQL 邮件列表帖子的链接,以便人们可以将这个讨论与那个讨论联系起来。如果您也可以在邮件列表帖子中发布一个带有此链接的后续内容,那就太好了。如果您要在多个地方交叉发布,请说明以防止人们重复工作。
-
没问题,我以后会这样(我一般不会在这两个地方发帖)..
-
顺便说一句,我认为您的问题的简短回答是“是”...但是如果您担心,请在表格中填写一些虚拟数据,
ANALYZE表格,然后使用 @987654330 @ 检查应该命中部分索引的一些查询的计划。 -
是的,现在确实这样做了..
标签: sql postgresql postgresql-9.1