Может ли порядок отдельных операндов влиять на возможность использования выражения SQL? - PullRequest
3 голосов
/ 25 марта 2019

Мой коллега, который, как правило, хорошо разбирается в SQL, сказал мне, что порядок операндов в выражении> или = может определять, можно ли выразить выражение. В частности, с запросом, оператор которого содержит:

CASE
when (select count(i.id)
            from inventory i
            inner join orders o on o.idinventory = i.idInventory
            where o.idOrder = @order) > 1 THEN 2
            ELSE 1

и ему было приказано изменить порядок операндов к эквивалентному

CASE
when 1 < (select count(i.id)
            from inventory i
            inner join orders o on o.idinventory = i.idInventory
            where o.idOrder = @order) THEN 2
            ELSE 1

для проблем проходимости. Я не нашел никакой разницы в планах запросов, хотя в конечном итоге я сделал изменения ради соблюдения стандартов командного кодирования. Верно ли то, что мой коллега сказал в некоторых случаях? Влияет ли порядок операндов в выражении на время его выполнения? Это не согласуется с тем, как я понимаю сочувствие к работе.

Ответы [ 2 ]

1 голос
/ 25 марта 2019

Если вы говорите о самых популярных современных базах данных, таких как Microsoft SQL, Oracle, Postgres, MySql, Teradata, ответ однозначно NO .


Что такое запрос SARGable?

Запрос SARGable - это тот, который стремится сузить число строк, которые должна обработать база данных, чтобы получить ожидаемый результат. Что я имею в виду, например:

Рассмотрим этот запрос:

select * from table where column1 <> 'some_value';

Очевидно, что использование индекса в этом случае бесполезно, поскольку база данных наверняка должна будет просмотреть все строки в таблице, чтобы получить ожидаемые строки.

Но что, если мы сменим оператора?

select * from table where column1 = 'some_value';

В этом случае индекс может обеспечить хорошую производительность и возвращать ожидаемые строки почти мгновенно.

Операторы SARGable: =, <,>, <=,> =, LIKE (без%), МЕЖДУ
Операторы без SARGable: <>, IN, OR

Теперь вернемся к вашему делу.
Ваша проблема проста. У вас есть X, и у вас есть Y. X> Y или Y

P.S. Конечно, я признаю, что может быть базами данных с очень плохими оптимизаторами, где этот вид подделки мог бы сыграть свою роль. Но, как я уже говорил, в современных базах данных вам не стоит об этом беспокоиться.

1 голос
/ 25 марта 2019

Для Postgres ответ определенно таков: "Нет." ( был добавлен позже.)

Планировщик запросов может переключаться между левым и правым операндами оператора, если определено COMMUTATOR, что имеет место для всех экземпляров < и >. (Операторы фактически определяются самим оператором и его принятыми операндами.) И планировщик запросов сделает это, чтобы сделать выражение "sargable". Соответствующий ответ с подробным объяснением:

Отличается для других операторов без COMMUTATOR. Пример для ~~ (LIKE):

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...