1

我在 SQL Server 2008 中有一个包含数千万条记录的表。第一列 (ID) 是主键。其他列不可索引。

需要列出 ID 为 30 的倍数的所有记录。所以我写道:

SELECT ID,... FROM table1 WHERE (ID between value1 AND value2) AND (ID % 30 = 0)

这个查询太慢了,即使结果只包含 100 条记录。因此,除非我找到更快的解决方案,否则我的数据库毫无用处。

我的数据库的特殊功能是:

  1. 我从不更新此表中的值。只有插入和选择。

  2. 每条新记录的 ID (INSERT) 都比表中所有先前存在的 ID 多。(ID 以升序排列)。

4

1 回答 1

2

您可以使用的只有索引。所以你必须用 B 树、键顺序和范围来表达问题。要减少执行时间,您必须减少查询扫描的行范围。有几种可能的方法:

  • 过滤索引ID您可以为谓词创建过滤索引ID % 30 = 0并包含投影列。这适用于WHERE ID % 30 = 0
  • 持久计算列。您可以为聚簇索引创建一个持久化计算列ID % 30并将其添加为最左边的键(由于选择性低)。这将适用于WHERE ID % 30 =0但也适用于WHERE ID % 30 = 1WHERE ID % 30 = 29例如。但不会为WHERE ID % 29=0.

如您所见,选项并不是那么好。该需求非常不寻常,我实际上怀疑它是否来自一个严肃的业务需求,它似乎更像是为更通用的需求选择实现的工件。如果您能说明您的业务需求,我们可能会提供更好的解决方案。

于 2013-07-08T09:04:22.017 回答