У меня есть ситуация, когда довольно простой запрос выбора занимает несколько минут; это утверждение выглядит следующим образом:SQL - Приоритезация условий WHERE
SELECT *
FROM MyView
WHERE MyFunction(Col_1, Col_2, Col_3, Col_4) = 1
AND Col_8 = 20
;
Теперь время распределяется (примерно) в 1/3 для выбора и 2/3 для вызова MyFunction
(измеряется просто комментируя вызов функции и сравнение с полным выберите время).
Теперь второе условие (т. Е. Col_8 = 20
) уже уменьшает количество записей.
Я попытался выполнить тот же запрос дважды, сначала запустив вызов функции и получив его вторым, и оба возвратили одинаковые значения (конечно), но также заняли одинаковое время.
мне было интересно, как предотвратить вызов функции, если первое условие уже не удалось, и мысль о двух альтернатив:
Установите первое условие, как
Col_8 = 20
и второй как случай первого (т. е. если первый неудачный возврат FALSE в противном случае вызывает функцию),Создайте запрос как выбор в пределах выбора.
Best (для майских причинам!) Должен был бы иметь что-то вроде в некоторых языках программирования (Ada является первым, что пришло), где вы можете написать что-то вроде:
<condition 1> AND THEN <condition 2>...
Любая полезная дума быть оцененным.
Если добавить индекс 'col_8' время выполнения должно сокращаться только до времени, необходимого функции –
Похоже, вы используете скалярнозначную функцию. Знаете ли вы, что SVF - это дьявол, а использование встроенных табличных функций (TVF) - лучшая идея почти во всех случаях? –
Спасибо @juergend. Что касается названия, то это, конечно, вопрос. Реальная база данных имеет более значимые имена. Как индекс индекса, предположим, что ** view ** является заданным и не может быть изменен. – FDavidov