当前位置: 首页 > 面试题库 >

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

仲孙磊
2023-03-14
问题内容

我有下表:

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)'

因此,无论如何,都不会使用该索引。


问题答案:

我已经确认索引可以正常工作。

我重新创建了随机数据,只是这次设置为零diet_glutenfreerandom() > 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,因此看起来绝对是部分索引。



 类似资料:
  • 问题内容: 我有一个CHAR(250)列用作varchar(24)列的外键。 在MySQL中,我记得我可以创建一个指定column(24)的索引,以便在最左边的24个字符上创建索引。在MS SQL Server上似乎无法实现。 我的问题是这样的: 是否可以在SQL Server 2008上使用索引视图为该列的子字符串建立索引,如果是,则它会对表的性能产生任何副作用吗? 问题答案: 您可以创建一个持

  • 问题内容: SQLAlchemy支持在postgresql中创建部分索引。 是否可以通过SQLAlchemy创建部分 唯一 索引 ? 像这样想象一个表/模型: 我想要一个唯一的索引,对于给定的发票,该索引只能有一个“活动”的ScheduledPayment。 我可以在postgres中手动创建它: 我想知道如何使用SQLAlchemy 0.9将其添加到我的SQLAlchemy模型中。 问题答案:

  • 问题内容: 尽管至少有两个 关于如何在Python的库中为DataFrame编制索引的优秀教程,但我仍然无法找到一种优雅的方法来编写多个列。 我已经发现(我认为是)这样一种不太优雅的方式 但这并不漂亮,可读性得分很低(我认为)。 有没有更好,更Python风格的方法? 问题答案: 这是一个优先运算符问题。 您应该添加额外的括号以使多条件测试正常工作: 您提到的教程的这一部分显示了带有几个布尔条件的

  • 在我的一个项目中,我有一个表,其中保存了某种设备的固件更新信息。最初,任何固件更新进程都处于排队状态。更新过程可能有其他状态值,例如正在进行、已完成、失败。对于单个设备,可能存在状态为“已完成”和“已失败”的多行(已完成的更新过程,最终状态!)。但在任何时候,处于排队或正在进行状态的每个设备都必须只有一个更新过程——新固件的推出应该只适用于没有“活动/非最终”更新过程的设备。我试图用Postgre

  • 本文向大家介绍怎样正确创建MySQL索引的方法详解,包括了怎样正确创建MySQL索引的方法详解的使用技巧和注意事项,需要的朋友参考一下 索引类似大学图书馆建书目索引,可以提高数据检索的效率,降低数据库的IO成本。MySQL在300万条记录左右性能开始逐渐下降,虽然官方文档说500~800w记录,所以大数据量建立索引是非常有必要的。MySQL提供了Explain,用于显示SQL执行的详细信息,可以进

  • 问题内容: 我不了解pymongo和pymongo之间的区别。在MongoDB索引页面上,它说 您可以通过调用 但是在pymongo中,有两个不同的命令和,创建索引的文档包括: 与create_index()尝试无条件创建索引的方法不同,sure_index()利用驱动程序中的某些缓存,以便仅尝试创建可能不存在的索引。当PyMongo创建(或确保)索引时,将在ttl秒内“记住”该索引。在此期限内重