2010-01-16 76 views
0

我正在寻找一些建议如何获得索引对这个查询运行的更好... 的SQL Server 2005/8一些客户有5某些8 ...的SQL Server索引建议性能

SELECT sales.ChainStoreId, 
      sales.CashBoxId, 
      dbo.DateOnly2(sales.BonDate), 
      MAX(sales.BonDate), 
      SUM(sales.SumPrice) 
FROM  [BACK_CDM_CLEAN_BOLTEN].[dbo].[CashBoxSales] sales 
WHERE  sales.BonType in ('B','P','W')    
AND  Del = 0 
AND  sales.BonDate >= @minDate 
GROUP BY sales.ChainStoreId, 
      sales.CashBoxId, 
      dbo.DateOnly2(sales.BonDate) 

表如下所示

CREATE TABLE [dbo].[CashBoxSales](
    [SalesRowId] [int] IDENTITY(1,1) NOT NULL, 
    [ChainStoreId] [int] NOT NULL, 
    [CashBoxId] [int] NOT NULL, 
    [BonType] [char](1) NOT NULL, 
    [BonDate] [datetime] NOT NULL, 
    [BonNr] [nvarchar](20) NULL, 
    [SumPrice] [money] NOT NULL, 
    [Discount] [money] NOT NULL, 
    [EmployeeId] [int] NULL, 
    [DayOfValidity] [datetime] NOT NULL, 
    [ProcStatus] [int] NOT NULL, 
    [Del] [int] NOT NULL, 
    [InsertedDate] [datetime] NOT NULL, 
    [LastUpdate] [datetime] NOT NULL, 

什么是索引列的正确排序,覆盖或复合材料等 表有多达10万行。还有其他类似的选择,但我希望从建议得到这个速度(最重要的),我可以调整一些其他人。

非常感谢!

+0

我应该补充说Del列只有值0,1,而bontype有大约5个值。 Dateonly2函数返回给定日期时间的日期,我应该确定列索引(?)。我也知道关于分析器,分析器和DTA等。宁愿有原则性的答案,基于逻辑比工具...干杯 – alex 2010-01-16 14:13:56

+0

好吧,我有事情下降到不到2秒使用顾问和索引 CREATE NONCLUSTERED INDEX [ Alex_index_] ON [dbo]。[CashBoxSales] ( \t [BonType] ASC, \t [删除] ASC, \t [BonDate] ASC, \t [ChainStoreId] ASC, \t [CashBoxId] ASC ) INCLUDE([SumPrice]) 现在谁可以向我解释为什么这个事情是按照这个顺序排序的,为什么del 2值Bontype 3值的索引有帮助...我理解bondate,并且理解include中的sumprice,不需要额外的查找,所有列需要在那里,但..... – alex 2010-01-16 18:00:57

回答

2

当您在SQL Server Management Studio中进行查询时,只需从上下文菜单中选择“分析数据库优化顾问中的查询”,然后关闭!

alt text http://i50.tinypic.com/2ihrwc2.png

提醒你:这只是调整这一个单一的查询孤立!在这里添加索引以加快查询速度可能会对应用程序的其他部分产生不利影响。索引总是伴随开销 - 插入和删除通常会变慢。

此外,不要盲目实施DTA的所有建议 - 根据您自己的判断来确定索引是否有意义。

最后:测量,测量,测量!在作为基线进行任何更改之前测量您的表现,然后在做出更改并进行比较后再次进行测量。

+0

目前寻找一个很好的答案,因为它导致了正确的答案...现在我需要明白为什么... – alex 2010-01-16 18:02:15

0

我最好的建议是通过SQL事件探查器运行此查询。它会推荐一些索引供你试用。

另外,您可以尝试设置分区表并使用其中一个GROUP BY列作为分区键。

+0

是的,按日期分区是在计划中... – alex 2010-01-16 18:03:54

0

把我的头顶部我会

INDEX (BonType, Del, BonDate) 

甚至开始只是

INDEX (BonType, BonDate) 

我会建议使用指数分析仪,Proflier和标杆的各种组合。