【问题标题】:Best index strategies for read-only table?只读表的最佳索引策略?
【发布时间】:2011-04-12 10:15:16
【问题描述】:

我在 SQL Server 中有一个表,它具有以下特征:

  • 将包含大约 120 万条记录。
  • first 为空,将批量插入多次(准确地说是 64 次),20-100k 条记录/条
  • 数据不会被更新或删除,只是被查询
  • 并发查询数多,每次查询只返回一条记录
  • 与ID无关(因为记录没有更新或删除)
  • 查询的关键是两个字段,PROVINCE_ID 和 CANDIDATE_NUMBER(在整个表中唯一)

我正在考虑在 ID 列上创建聚集索引,并在 (PROVINCE_ID,CANDIDATE_NUMBER) 中创建非聚集索引。会是最好的选择吗?你能给我另一个建议吗?请解释我为什么要这样做?

非常感谢!

【问题讨论】:

  • 表中还有多少其他字段?查询很可能只读取其中的一部分,还是全部读取?
  • @Tommi: 大概是其他10个字段,比如名字,姓氏,point1,2...6,总点数,所有的都是一样的@Mitch Wheat:我没有认为 54% 是一个糟糕的比率。每当一个答案解决了我的问题时,我都会立即接受。如果没有,我为什么要这样做?请查看我的问题列表
  • 通常问题的质量或不切实际的期望是因素。我认为 54% 的 99 个问题非常低。例如,您最初在这个问题中遗漏了一些明显需要的信息。
  • @Andrew Barber 是对的。如果你问了 100 个问题,但只有一半得到满意的答案,那么问题不在于其他人 :)

标签: sql-server database-design index


【解决方案1】:

如果ID列不用于数据检索,我建议你将聚集索引放在PROVINCE_ID、CANDIDATE_NUMBER列上。

如果与其他列相比,某些列的读取频率很高,请考虑添加带有 PROVINCE_ID、CANDIDATE_NUMBER 以及该列的索引。这样,查询就可以从索引本身获得所需的一切,而根本不需要查看表。

【讨论】:

  • 如果他聚集在Province_ID, Candidate_Number 上,那么所有数据都将在索引中(这就是聚集索引的本质)。
【解决方案2】:

如果您的WHERE 子句中除了这两个字段之外没有任何其他字段,那么一定要聚集在PROVINCE_ID, CANDIDATE_NUMBER 上。如果您有其他要选择的标准,请考虑使用覆盖索引。

上面还假设这两个字段都是INT 数据类型。如果它们是字符串类型(varcharcharnvarchar),则创建一个INT IDENTITY 字段并在其上进行聚类。如果您在字符串等宽数据类型上进行聚类,则每行使用 很多 更多空间,并且乘以您拥有的索引数(因为集群键位于每个非聚集索引)。

还请记住,如果您在 PROVINCE_ID, CANDIDATE_NUMBER 上进行集群并使用仅在 CANDIDATE_NUMBER 上过滤的 WHERE 子句,则根本不会使用索引。在这样的数据仓库情况下,您通常希望拥有一个涵盖所有查询的索引。

【讨论】:

    猜你喜欢
    • 2021-02-07
    • 2010-10-25
    • 2013-07-15
    • 2014-04-02
    • 1970-01-01
    • 1970-01-01
    • 2020-06-06
    • 2017-10-03
    • 1970-01-01
    相关资源
    最近更新 更多