У меня есть приложение для построения диаграмм, которое динамически генерирует запросы SQL Server для вычисления значений для каждой серии в данной диаграмме. Обычно это работает довольно хорошо, но я столкнулся с конкретной ситуацией, в которой сгенерированный запрос очень медленный. Запрос выглядит так:
SELECT
[dateExpr] AS domainValue,
(SELECT COUNT(*) FROM table1 WHERE [dateExpr]=[dateExpr(maintable)] AND column2='A') AS series1
FROM table1 maintable
GROUP BY [dateExpr]
ORDER BY domainValue
Я сократил [dateExpr], потому что это комбинация функций CAST и DATEPART, которые преобразуют поле datetime в строку в форме 'yyyy-MM-dd', так что я могу легко группировать по всем значениям в календарный день , Приведенный выше запрос возвращает оба значения yyyy-MM-dd в качестве меток для оси x диаграммы и значения из ряда данных "series1" для отображения на диаграмме. Предполагается, что в серии данных учитывается количество записей, приходящихся на этот календарный день, которые также содержат определенное значение в [column2]. Выражение «[dateExpr] = [dateExpr (maintable)]» выглядит так:
CAST(DATEPART(YEAR,dateCol) AS VARCHAR)+'-'+CAST(DATEPART(MONTH,dateCol) AS VARCHAR) =
CAST(DATEPART(YEAR,maintable.dateCol) AS VARCHAR)+'-'+CAST(DATEPART(MONTH,maintable.dateCol) AS VARCHAR)
с дополнительным сроком на день (опущено выше для экономии места). Это источник медлительности запроса, но я не знаю, как переписать запрос, чтобы он возвращал тот же результат более эффективно. У меня есть полный контроль над генерацией запроса, поэтому, если бы я мог найти более эффективный SQL, который дал бы те же результаты, я мог бы соответствующим образом изменить генератор запросов. Любые указатели будут с благодарностью.