Производительность рекомендаций по индексам SQL Server - PullRequest
0 голосов
/ 16 января 2010

Я ищу несколько советов о том, как улучшить работу индексов в этом запросе ... SQL Server 2005/8 у некоторых клиентов есть 5, около 8 ...

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 мил строк. Существуют и другие подобные варианты, но я надеюсь, что благодаря совету ускорить его (это самое важное) я могу настроить несколько других.

Большое спасибо!

Ответы [ 3 ]

2 голосов
/ 16 января 2010

Если у вас есть запрос в SQL Server Management Studio, просто выберите «Анализировать запрос в помощнике по настройке базы данных» в контекстном меню, и все готово!

alt text

Имейте в виду: это только изменяет этот единственный запрос в изоляции! Добавление здесь индексов для ускорения этого одного запроса может отрицательно повлиять на другие части вашего приложения. Индекс всегда идет с накладными расходами - вставки и удаления, как правило, медленнее.

Кроме того, не слепо выполняйте все рекомендации DTA - используйте свое собственное суждение относительно того, имеет ли смысл индекс или нет.

И наконец: измерить, измерить, измерить! Измеряйте свою производительность до каких-либо изменений в качестве базового уровня, затем измеряйте снова и снова после внесения изменений и сравнивайте.

0 голосов
/ 16 января 2010

От макушки головы Я бы начал с

INDEX (BonType, Del, BonDate)

Или даже просто

INDEX (BonType, BonDate)

Я бы рекомендовал использовать различные комбинации Index Analyzer, Proflier и Benchmarking.

0 голосов
/ 16 января 2010

Мой лучший совет - выполнить этот запрос через SQL Profiler. Он порекомендует вам несколько индексов.

Также вы можете попытаться настроить секционированную таблицу и использовать один из столбцов GROUP BY в качестве ключа секционирования.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...