Пожалуйста, помогите улучшить производительность этого запроса - PullRequest
0 голосов
/ 11 октября 2019

Следующий запрос к 16-миллионной таблице строк выполняется очень медленно. Продолжительность более 30 минут.

Я создал некластеризованный индекс для столбцов.

SELECT ColA, ColB, ColC, ColD, COUNT(ColE)
FROM   TABLE
WHERE (ColF > N'00007000000') AND ColD IS NOT NULL
GROUP BY ColA, ColB, ColC, ColD, ColE

Есть ли способ улучшить производительность запроса, пожалуйста?

Ответы [ 3 ]

0 голосов
/ 11 октября 2019

Вы можете использовать ключевое слово (nolock) без блокировки, и проверьте столбец индекса ColF. Поскольку сортировка столбцов типов nvarchar выполняется медленнее, чем целочисленных типов.

SELECT ColA, ColB, ColC, ColD, COUNT(ColE)
FROM   TABLE **with(nolock)**
WHERE (ColF > N'00007000000') AND ColD IS NOT NULL
GROUP BY ColA, ColB, ColC, ColD, ColE

PS: с (nolock) опасное ключевое слово, потому что при использовании этого ключевого слова для получения незавершенных данных транзакции ..

0 голосов
/ 11 октября 2019

С учетом предоставленной вами информации только мы можем предложить ограниченные решения по эффективности этого запроса. Правильный индекс для этого запроса будет похож на следующий, потому что этот индекс будет охватывать все необходимые столбцы и где условия

CREATE NONCLUSTERED INDEX [Performance_Index] ON [dbo].TABLE
(
    [ColD] ASC,
    [ColF] ASC
)
INCLUDE([COLA],[COLB],[ColC],[ColE])
  • COLD и COLF должны быть помещены в ключевые столбцы индекса
  • COLA , COLB , COLC и COLE находиться во включенных столбцах ключевых столбцов индекса.

    Однако, если план выполнения не использует этот индекс, вы сталкиваетесь с проблемой неявного преобразования . Эта проблема связана с проблемами производительности в запросах. В запросе не удалось использовать правильный индекс, поскольку в запросе имеется несоответствующий тип данных. Вы можете идентифицировать эту проблему с помощью следующего запроса:

    SELECT DB_NAME(t.[dbid]) AS [Database Name], t.text AS [Query Text] FROM sys.dm_exec_query_stats AS qs WITH (NOLOCK) CROSS APPLY sys.dm_exec_sql_text(plan_handle) AS t CROSS APPLY sys.dm_exec_query_plan(plan_handle) AS qp WHERE CAST(query_plan AS NVARCHAR(MAX)) LIKE ('%CONVERT_IMPLICIT%') AND t.[dbid] = DB_ID() ORDER BY qs.total_worker_time DESC OPTION (RECOMPILE)

За исключением этих параметров;

  • Фрагментация индекса
  • Обновление статистики
0 голосов
/ 11 октября 2019

Попробуйте удалить знак UNICODE:

SELECT ColA, ColB, ColC, ColD, COUNT(ColE)
FROM   TABLE
WHERE (ColF > '00007000000') AND ColD IS NOT NULL
GROUP BY ColA, ColB, ColC, ColD, ColE

, поскольку NVarchar является 16-битным, а правила сравнения Unicode намного сложнее, чем ASCII - специальные символы для различных языков, которые поддерживаются одновременнотребуется цитата еще немного обработки

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