使用group by子句在sql server 2000查询中建立索引策略

时间:2014-02-10 14:13:15

标签: sql-server sql-server-2008 sql-server-2005 sql-server-2008-r2 indexing

我有一个如下所示的查询,它在其中一列[Generated_red_ident]上有聚集索引。下面提到的查询的哪些列必须是非聚集索引?

我可以理解Episode_Number是非聚集索引的一个很好的候选者。 如何列dbd和start_date1?

另外,我是否还必须在group by子句中的所有列上创建非聚集索引?

请sugest

SELECT [ID],
       [Number],
       [Age],
       [Start_Date],
       [Pr],
       [Mthd],
       [Identifier],
       CASE
         WHEN [methd] IN ( 21, 22, 23, 24,28) THEN 'er'
       END AS 'ner',
       CASE
         WHEN Datepart(dw, [Start_Date1]) in (1,7) THEN 'Weekend'
         END AS 'weekday'
FROM   [PPL_Data]
WHERE  [Episode_Number] = 1
GROUP  BY [ID],
       [Number],
       [Age],
       [Start_Date],
       [Pr],
       [Mthd],
       [Identifier]

2 个答案:

答案 0 :(得分:1)

是的,理想情况下,您应该在查询中的所有列上创建索引。 您可以使用覆盖索引。 见Covered Index

答案 1 :(得分:0)

两件事,NC-Index的表现很大程度上取决于该指数第一列的基数。所以你应该想一下列[Episode_Number]的基数是什么。应使用具有高基数的列。另外,在SELECT期间使用DATEPART函数,如果查询落入75%的使用场景,则该值将作为新列保留在表中。 最后一件事是,如果将前7列作为Cover Index Vs包含在内,只有少数几个列,你可以试着看看性能有多大提升。