У меня есть SQL-сервер 2008 года с большой таблицей, и мне нужно выполнить запрос COUNT DISTINCT на несколько столбцов вместе. Некоторые столбцы - varchar, а другие - int.Увеличение производительности при поиске в конкатенированных столбцах
Запрос до сих пор выглядит следующим образом:
SELECT
CAST(datepart(yyyy, [HistDate]) as varchar(4)) + '-' + CAST(datepart(mm, [HistDate]) as varchar(2)) + '-1' AS [DateSelector],
[Document] AS [Document],
-- This is the bit that needs optimizing
COUNT(DISTINCT(
Document +
Reference +
CONVERT(varchar(20),BatchID) + -- this is an int
ISNULL(CONVERT(varchar(20),ResetCount),'')) -- this is an int
FROM documents
GROUP BY
CAST(datepart(yyyy, [HistDate]) as varchar(4)) + '-' + CAST(datepart(mm, [HistDate]) as varchar(2)) + '-1' AS [DateSelector],
[Document] AS [Document],
ORDER BY ...
В настоящее время этот запрос занимает 23 сек, в то время как замена выше COUNT с COUNT (*) занимает несколько секунд. Я попытался добавить комбинированный индекс, который дал 0 улучшения. Какую оптимизацию можно сделать для ускорения поиска?
Я бы предложил создать вычисляемый столбец для _DateSelector_ и индексации его. Но это также добавит накладные расходы для операций DML. Какова скорость изменения/поиска для таблицы? –
@VishalGajjar, хотя это может немного помочь производительности, проблема с производительностью находится в другом месте кода в соответствии с вопросом и заголовком –