【问题标题】:Postgres: Do non-selected rows affect performance?Postgres:未选择的行会影响性能吗?
【发布时间】:2017-03-07 17:29:53
【问题描述】:

我的主要问题是,在单个表中,未包含在 WHERE 子句中的记录数是否会影响 SELECTINSERTUPDATE 的查询性能?

假设我有一个包含 2000 万行的表,并且该表有一个索引 error 字符串列。

假设其中 19,950,000 条记录为此列设置了 0,50,000 条记录设置为 NULL

我的查询是SELECT * FROM pending_emails WHERE error IS NULL

在我的应用程序中执行一些逻辑之后,我需要按 ID 更新这些相同的记录以设置它们的错误:

UPDATE "pending_emails" SET "error" = '0' WHERE "pending_emails"."id" = 46
UPDATE "pending_emails" SET "error" = '0' WHERE "pending_emails"."id" = 50

我正在尝试确定是否可以在数据库中保留“已完成”记录而不影响我正在使用的活动记录的性能,或者我是否应该删除它们(不是首选)。

【问题讨论】:

    标签: database postgresql indexing


    【解决方案1】:

    通常不会。这就是索引的目的。您可能需要考虑对此列的过滤索引:https://www.postgresql.org/docs/current/static/indexes-partial.html 然后您的索引甚至根本没有索引“0”行。

    【讨论】:

    • 哇很有趣。所以,我在这张表上有第二个索引:[:priority, :id],它满足我的ORDER BY priority ASC, id ASC。我也可以为此使用部分索引吗?
    • 是的 - 请参阅他们给出的示例“示例 11-2。设置部分索引以排除不感兴趣的值”
    • 添加到表的每个索引都会减慢它的速度,因此如果您出于其他目的查询“0”行,这可能会无缘无故地减慢更新速度。但是,如果几乎不查询“0”行(即历史存档),您可以将大部分其他索引移动到过滤索引。
    • @CadeRoux:您能否将您的链接指向文档的当前版本? postgresql.org/docs/current/static/indexes-partial.html
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2012-09-18
    • 2019-11-04
    • 1970-01-01
    • 2021-04-29
    • 2012-02-04
    • 2011-01-28
    • 1970-01-01
    相关资源
    最近更新 更多