Оптимизация запросов для конкретной таблицы
У меня есть стол, и я ищу способ улучшить его производительность. Ниже приведен список запросов, которые должны быть выполнены.
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)