Выбор Azure MS SQL занимает более 10 минут - PullRequest
0 голосов
/ 05 октября 2018

У меня проблема с производительностью запросов, иногда выполнение запроса Select занимает более 10 минут. Размер таблицы составляет 26 ГБ с 8 миллионами данных.Запрос:

SELECT X.[PRIMARY], E.[COLUMN_2], E.[COLUMN_3], E.[COLUMN_4], E.[COLUMN_5]...E.[COLUMN_N]
FROM(
SELECT E.[PRIMARY], ROW_NUMBER() OVER(ORDER BY COLUMN_SORT DESC) AS RowNumber
FROM dbo.[TABLE]E WITH(NOLOCK) WHERE COLUMN_WHERE_1 = 11943 AND COLUMN_WHERE_2 = 0) X
JOIN dbo.[TABLE] E WITH(NOLOCK) on E.[PRIMARY] = X.[PRIMARY]
WHERE RowNumber > 150 AND RowNumber <= 200
ORDER BY COLUMN_SORT

У меня есть некластеризованный INDEX (COLUMN_WHERE_1, COLUMN_WHERE_2) INCLUDE (COLUMN_SORT).

План выполнения выглядит следующим образом:

enter image description here

У вас есть идея, как оптимизировать запрос или индекс?

Ответы [ 2 ]

0 голосов
/ 05 октября 2018

Начните с этого:

SELECT E.[PRIMARY], E.[COLUMN_2], E.[COLUMN_3], E.[COLUMN_4], E.[COLUMN_5]...E.[COLUMN_N]
FROM(
    SELECT E.[PRIMARY], E.[COLUMN_2], E.[COLUMN_3], E.[COLUMN_4], E.[COLUMN_5]...E.[COLUMN_N],
        ROW_NUMBER() OVER(ORDER BY COLUMN_SORT DESC) AS RowNumber
    FROM dbo.[TABLE]E
    WHERE COLUMN_WHERE_1 = 11943 AND COLUMN_WHERE_2 = 0
) X
WHERE RowNumber > 150 AND RowNumber <= 200
ORDER BY RowNumber
  • избегайте ненужного самостоятельного объединения
  • удалите вторую сортировку по тому же столбцу - у вас уже есть RowNumber с тем же ORDER BY опция
0 голосов
/ 05 октября 2018

Если индекс создается с ключевыми столбцами, которые соответствуют столбцам в запросе ORDER BY ( вложенный в вашем случае ), SORT оператор может быть исключен в плане запроса, а план запроса более эффективен.Таким образом, можно создать следующий индекс NONCLUSTERED :

CREATE NONCLUSTERED INDEX IDX_ColumnSort  
ON dbo.[TABLE]  
    (COLUMN_SORT DESC, COLUMN_WHERE_1, COLUMN_WHERE_2); 
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...