Оптимизация запросов для конкретной таблицы

У меня есть стол, и я ищу способ улучшить его производительность. Ниже приведен список запросов, которые должны быть выполнены.

dbo.CustomersSmallOrders
(
    ID INT NOT NULL IDENTITY(1,1) PRIMARY KEY CLUSTERED,
    CustomerName VARCHAR(MAX) NOT NULL,
    OrderDate DATETIME NOT NULL,
    Quantity INT NOT NULL,
    Amount DECIMAL(15,2) NOT NULL,
    AvailableAmount DECIMAL(15,2) NOT NULL,
    Type TINYINT NOT NULL,
    Status TINYINT NOT NULL
)

Не могли бы вы помочь мне переписать приведенные ниже запросы и добавить индексы в таблицу, чтобы повысить ее производительность?

SELECT *
FROM CustomersSmallOrders
WHERE Left(CustomerName, 4) = 'Levis'

SELECT *
FROM CustomersSmallOrders
WHERE DateDiff(month, OrderDate, GetDate()) >= 30

SELECT *
FROM CustomersSmallOrders
WHERE Quantity * 2 < 3400

SELECT 
    SUM(CASE 
            WHEN Type = 2 AND STATUS IN (0, 1, 2) THEN Amount 
            ELSE 0 
        END)
    ,SUM(CASE 
             WHEN Type = 1 AND STATUS IN (0, 1) THEN Amount 
             ELSE 0 
         END)
    ,SUM(CASE 
             WHEN Type = 2 AND STATUS IN (0, 1) THEN Amount - AvailableAmount 
             ELSE 0 
         END)
FROM CustomersSmallOrders
WHERE STATUS IN (0, 1, 2)

1 ответ

Решение

Улучшения запросов:

Как сказал Мартин Смит, первый запрос можно преобразовать в

SELECT TOP 0 * FROM CustomersSmallOrders

Из-за противоречия.

Если бы это было

WHERE Left(CustomerName, 5) = 'Levis'

затем изменив условие на

WHERE CustomerName LIKE 'Levis%'

будет держать запрос sargable и разрешить использование индекса.

Второй запрос можно улучшить, изменив условие и добавив индекс для OrderDate:

SELECT *
FROM CustomersSmallOrders
WHERE OrderDate <= DATEADD(Mounth, -30, GetDate()) 

3-й (добавление индекса по количеству):

SELECT *
FROM CustomersSmallOrders
WHERE Quantity < 1700

четвертое - добавление индекса для STATUS, который также содержит Type, Amount и AvailableAmount (хотя я не понимаю, почему он хочет получить Amount дважды. Я думаю, что это, вероятно, ошибка, и он хочет вывод только 1 столбца):

SELECT 
SUM(CASE 
        WHEN Type = 2 THEN Amount 
        ELSE 0 
    END)
,SUM(CASE 
         WHEN Type = 1 AND STATUS IN (0, 1) THEN Amount 
         ELSE 0 
     END)
,SUM(CASE 
         WHEN Type = 2 AND STATUS IN (0, 1) THEN Amount - AvailableAmount 
         ELSE 0 
     END)
FROM CustomersSmallOrders
WHERE STATUS IN (0, 1, 2)
Другие вопросы по тегам