【问题标题】:Should I create an index for partition with fixed key?我应该为具有固定键的分区创建索引吗?
【发布时间】:2009-09-04 00:13:23
【问题描述】:

几天前,我开始使用分区来处理大量数据。

我按照文档的建议创建了主表,创建了一些从主表继承的子表,然后为每个子表添加了一个约束来定义允许的键值。约束就像:

检查(site_id = 'google.com')

现在这是我的问题:

在阅读文档时,我遇到了以下建议:“对于每个分区,在键列上创建一个索引”

如果整个分区的密钥相同,我应该这样做吗?在 site_id 列上建立索引会有什么好处吗?

当我第一次阅读它时,我决定如果所有行都有相同的键(比如 site_id = 'google_com'),那么就不需要索引了。


这是说明数据库结构和典型用法的 SQL:

创建表网站 ( site_id varchar(50) 主键, 描述文本 );

-- req 是主表
创建表请求 ( site_id varchar(50), 时间戳时间戳 );

-- 现在让我们创建几个子表

INSERT INTO 网站 (site_id) VALUES ('google_com'); 创建表 req_google_com ( 检查(site_id = 'google_com') ) 继承 (req);

插入网站 (site_id) 值 ('twitter_com'); 创建表 req_twitter_com ( 检查(site_id = 'twitter_com') ) 继承 (req);

-- 现在写一些请求:
插入 req_google_com 值 ('google_com', now()), ('google_com', now());

【问题讨论】:

    标签: sql optimization postgresql


    【解决方案1】:

    是的,如果表中的所有数据都具有相同的列值,则不需要索引。事实上,您根本不需要该列。

    如果您确实有一个索引,并且它确实被使用(例如作为 WHERE 子句的结果), 这实际上可能会减慢速度。只有当您最终选择了整个表的一小部分(有人说最多 10%)时,通过索引来过滤行才是有益的。访问索引然后以其中的每一行结束都是浪费能源。

    阅读文档时我来了 跨越以下建议:“对于 每个分区,创建一个索引 关键列”

    您确定文档是在讨论分区键吗?不是全局主键?

    【讨论】:

    • 我刚刚编辑了原始帖子以显示数据库结构。我无法摆脱 site_id 列。虽然 site_id 的值对于给定的片段总是相同的,但对于另一个片段来说是不同的,并且将在 WHERE 子句中以透明的方式(通过从主请求表中选择)访问数据。
    • 我已将其阅读为“对于每个分区,在 site_id 列上创建一个索引”。抱歉,我不明白“全局主键”和“分区键”的区别
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2021-04-18
    • 2021-01-20
    • 1970-01-01
    • 1970-01-01
    • 2011-12-22
    • 2018-07-05
    • 1970-01-01
    相关资源
    最近更新 更多