Я уже давно борюсь с этим. У меня есть сохраненный процесс, который принимает 3 параметра, которые используются для фильтрации. Если определенное значение передается, я хочу фильтровать по этому. Если передано -1, дай мне все.
Я пробовал это двумя способами:
Первый способ:
SELECT field1, field2...etc
FROM my_view
WHERE
parm1 = CASE WHEN @PARM1= -1 THEN parm1 ELSE @PARM1 END
AND parm2 = CASE WHEN @PARM2 = -1 THEN parm2 ELSE @PARM2 END
AND parm3 = CASE WHEN @PARM3 = -1 THEN parm3 ELSE @PARM3 END
Второй способ:
SELECT field1, field2...etc
FROM my_view
WHERE
(@PARM1 = -1 OR parm1 = @PARM1)
AND (@PARM2 = -1 OR parm2 = @PARM2)
AND (@PARM3 = -1 OR parm3 = @PARM3)
Я где-то читал, что второй путь будет иметь короткое замыкание и никогда не оценивать вторую часть, если это правда. Мой администратор БД сказал, что это вызывает сканирование таблицы. Я не проверял это, но в некоторых случаях он работает медленнее.
Основная таблица, из которой выбирается это представление, содержит где-то около 1,5 миллиона записей, и представление продолжает объединяться примерно с 15 другими таблицами, чтобы собрать кучу другой информации.
Оба эти метода медленные ... отводят меня от мгновенного до где-то от 2-40 секунд, что в моей ситуации совершенно неприемлемо.
Есть ли лучший способ, который не предусматривает разбиение его на каждый отдельный случай конкретного против -1?
Любая помощь приветствуется. Спасибо.