gpt4 book ai didi

sql - Postgres - 这是在 bool 列上创建部分索引的正确方法吗?

转载 作者:行者123 更新时间:2023-11-29 11:25:05 33 4
gpt4 key购买 nike

我有下表:

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 子句中添加一个运算符,还是这个语法完全有效?希望这不是那些会被否决 30 次的 super 简单的 RTFM 问题之一。

更新:

我已经使用随机值向 RecipeMetadata 添加了 10,000 行。然后我在 table 上做了一个 ANALYZE 和一个 REINDEX 只是为了确定。当我运行查询时:

从 RecipeMetadata 中选择 recipeid,其中 diet_glutenfree;

我得到:

'Seq Scan on recipemetadata  (cost=0.00..214.26 rows=5010 width=16)'
' Filter: diet_glutenfree'

因此,它似乎在对表进行顺序扫描,即使只有大约一半的行具有此标志。索引被忽略。

如果我这样做:

从没有 diet_glutenfree 的 RecipeMetadata 中选择 recipeid;

我得到:

'Seq Scan on recipemetadata  (cost=0.00..214.26 rows=5016 width=16)'
' Filter: (NOT diet_glutenfree)'

所以无论如何,这个索引都没有被使用。

最佳答案

我已确认索引按预期工作。

我重新创建了随机数据,只是这次将 diet_glutenfree 设置为 random() > 0.9 所以只有 10% 的机会 on 位。

然后我重新创建了索引并再次尝试查询。

SELECT RecipeId from RecipeMetadata where diet_glutenfree;

返回:

'Index Scan using idx_recipemetadata_glutenfree on recipemetadata  (cost=0.00..135.15 rows=1030 width=16)'
' Index Cond: (diet_glutenfree = true)'

和:

SELECT RecipeId from RecipeMetadata where NOT diet_glutenfree;

返回:

'Seq Scan on recipemetadata  (cost=0.00..214.26 rows=8996 width=16)'
' Filter: (NOT diet_glutenfree)'

看来我的第一次尝试被污染了,因为 PG 估计如果它无论如何都必须加载超过一半的行,那么扫描整个表而不是命中索引会更快。

但是,我想我会在列的完整索引上得到这些确切的结果。有没有办法验证部分索引中索引的行数?

更新

索引在40k左右。我为同一列创建了一个完整索引,它超过 200k,因此看起来肯定是部分索引。

关于sql - Postgres - 这是在 bool 列上创建部分索引的正确方法吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8514923/

33 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com