В настоящее время я работаю над системой отчетов для нашего архива данных. Цель состоит в том, чтобы выбрать данные за каждый 1-й месяц, за каждый полный час и т. д. Итак, у меня есть куча параметров для выбора данных до одного часа.
Чтобы добиться этого, я использовал операторы CASE для корректировки выбора следующим образом:
SELECT
MIN(cd.Timestamp) as Mintime,
--Hours
CASE
WHEN
@SelHour IS NOT NULL
THEN
DATEPART(HOUR, cd.Timestamp)
END as Hour,
... -- more CASES up to DATEPART(YEAR, cd.Timestamp)
FROM dbo.CustomerData cd
... -- filter data and other stuff
Этот оператор работает хорошо для меня пока, но я немного беспокоюсь о производительности хранимой процедуры. Потому что я не знаю, как сервер будет вести себя с этим «изменяющимся» утверждением. Результат может варьироваться от 20 строк до 250 000 строк и более. В зависимости от заданных параметров. Насколько я знаю, сервер sql сохраняет план запроса и повторно использует его для будущего выполнения. Когда он сохраняет план для результата 20 рядов, производительность для результата 250.000, вероятно, довольно плохая.
Теперь мне интересно, какой подход лучше. Используя эту хранимую процедуру или создайте оператор внутри моего c# бэкэнда и передайте «скорректированный» оператор на сервер sql?
Спасибо и приветствия