我有一个我已经继承的SQL 2005数据库,其中一个表在大约15年的时间里已经增长到大约1700万条记录,现在速度非常慢。
表格布局如下所示:
id_column = nvarchar(20),indexed, not unique
column2 = nvarchar(20), indexed, not unique
column3 = nvarchar(10), indexed, not unique
column4 = nvarchar(10), indexed, not unique
column5 = numeric(8,0), indexed, not unique
column6 = numeric(8,0), indexed, not unique
column7 = nvarchar(20), indexed, not unique
column8 = nvarchar(10), indexed, not unique
(还有大约5列看起来几乎相同,没有编入索引)
' id' field是最终用户在前端应用程序中输入的值。
没有已定义的主键,也没有可以组合成唯一行的列(除非组合所有列)。该表实际上是一个'详细信息'表到另一个表,但没有约束确保参照完整性。
每一栏都大量使用'其中'查询中的条款,这就是为什么我假设每个人都有一个索引,或者是为了加快另一个DBA加速工作的绝望尝试。
说了这么多,我的问题是:在这一点上添加聚集索引能不能给我带来任何好处?
如果我确实添加了聚簇索引,我认为它必须是一个新列,即一个标识列?基本上,这值得吗?
感谢任何建议。
答案 0 :(得分:1)
我想说只有在需要它的推理时才添加聚集索引。所以问这些问题;
数据的顺序是否有意义?
数据的插入方式是否有连续值?
我是否需要使用需要具有聚簇索引的功能,例如全文索引?
如果这些问题的答案都是“否”而不是聚集索引可能对良好的非聚集索引策略没有任何额外的帮助。相反,您可能需要考虑更新统计信息的方式和时间,刷新索引以及过滤的索引是否在您的情况下有意义。看一下这个例子你很难说,但也许有必要进一步规范化表并使用数字键代替nvarchar。
http://www.mssqltips.com/sqlservertip/3041/when-sql-server-nonclustered-indexes-are-faster-than-clustered-indexes/ 这篇文章是非聚集索引可能更有意义的一个很好的例子。
答案 1 :(得分:1)
我建议添加聚集索引,即使它是一个标识列有三个原因:
假设您现有的查询每次都必须经过整个表格clustered index scan is still faster than a table scan。
该表是其他表的子项。通过一些额外的工作,您可以使用新的child_id
加入父表。这使得聚簇索引搜索在某些情况下比扫描快得多。
取决于它们的设置方式,现有指数可能没有多大好处。我发现了一些可怕的索引,每个索引包含1列,或者索引不包含相应的列,导致代价高昂的Key Looks操作。 Check your index stats以查看它们是否被使用。