我们有一个大表(4.5亿行,包含34列数字或日期时间数据),目前有大约十几个推荐的查询路径。该表目前有17个索引,我没有权限更改此表的结构,但我能够提供索引策略。
我看到的第一个问题是没有聚集索引,这表明该表具有由2列组成的唯一键。我以为我可以改变那个集群然后处理其他索引。由于有大约十几种查询表的常用方法,我认为为每个查询方法添加索引将是一件好事。所以说通过CustomerId查询表的常用方法之一是,我会在客户ID上添加一个索引。那将是一个非聚集索引,但仍然是相当低效的吗?如果我使该索引包含CustomerId和聚集索引中的2列,该怎么办?这会使SQL Server在执行计划中更有效率还是无用的任务?
答案 0 :(得分:5)
我认为最好的策略始终是在数据库上运行SQL Server Profiler一段时间。一旦你有一个体面的跟踪存储在文件或专用的跟踪表中,你就可以运行SQL Server数据库调优顾问,根据数据库的实际使用情况获得真实的统计数据和索引建议,而不是假设你如何看待查找你的数据库上的行为。
实际情况可能是您的表上存在某些昂贵的查询,这些查询当前完全绕过您不知道的现有配置索引。该工具将帮助您追踪最佳组合。
以下是实践中的一个例子:
答案 1 :(得分:2)
索引用于高效的数据检索。
您应该查看针对大表运行的查询,并确定哪些列最常用。
以下是输出索引的一些经验法则:
在仓库环境中,datetime列是聚簇索引的理想选择,因为它们在WHERE子句中经常使用。
那你怎么知道这一切呢?
运行SQL Server Profiler。这将帮助您查找针对您的表运行的查询。然后,通过查看运行次数和查询成本,找出在给定时间段内使用最多资源的那些资源。按照两条路径之一来更好地建立索引
答案 2 :(得分:1)
聚集索引具有Range查询的优势(WHERE KeyColumn BETWEEN(...))
在您的CustomerId示例中,添加主列绝对没有任何好处。非聚簇索引将包含对集群页面的item-ref。
实际上,您的问题并未包含任何基于良好建议的信息。你最好从剖析开始找出任何瓶颈。
答案 3 :(得分:0)
如果根据聚簇列顺序插入数据,则仅更改为使用聚簇索引。如果您使用的列不是唯一的,则数据库将向表中添加一个4字节的唯一符号列,因此请确保它们是唯一的。