Производительность между предложением IN с несколькими значениями и меньше или больше, чем - PullRequest
1 голос
/ 27 марта 2019

Попытка понять влияние на производительность использования оператора case, который включает в себя предложение IN, содержащее несколько значений (запрос 1 ниже), а не один логический оператор меньше (запрос 2 ниже).Должно ли предложение IN выполнять несколько логических проверок для данного поля?Например, предполагая, что строка не соответствует критериям первого запроса, равным 1, должна ли следующая запись проверять свое поле first_rating_number на 2, затем 3 и 4, если ни один из них не присутствует?Это будет медленнее, чем first_rating_number <5 (как во втором запросе)?</p>

Я запустил план выполнения, и Oracle говорит мне, что стоимость эквивалентна и что байты немного выше во втором запросе.Это не имеет смысла для меня.Спасибо всем заранее.

Изменить - Дополнительная информация: Вчера я получал разные байты, первый запрос показывал меньше.Сегодня оба плана показывают идентичную информацию плана объяснения.

Количество рядов: 1 261 914

Запрос 1 Объяснить план: Стоимость - 22 134;Байт - 3 785 742

Запрос 2 Объяснить план: Стоимость - 22 134;Байт - 3 785 742

SELECT 
  CASE  WHEN first_rating_number = 1 THEN 'AAA' 
         WHEN first_rating_number IN (2,3,4) THEN 'AA' 
         WHEN first_rating_number IN (5,6,7) THEN 'A' 
         WHEN first_rating_number IN (8,9,10) THEN 'BBB' 
         WHEN first_rating_number IN (11,12,13) THEN 'BB'
         WHEN first_rating_number IN (14,15,16) THEN 'B'
         WHEN first_rating_number IN (17,18,19) THEN 'CCC'        
         WHEN first_rating_number IN (20) THEN 'CC'                     
         WHEN first_rating_number IN (22) THEN 'D'  END first_rating_category_test
  FROM tbl_IN_CLAUSE;

SELECT 
  CASE  WHEN first_rating_number = 1 THEN 'AAA' 
         WHEN first_rating_number <5 THEN 'AA' 
         WHEN first_rating_number <8 THEN 'A' 
         WHEN first_rating_number <11 THEN 'BBB' 
         WHEN first_rating_number <14 THEN 'BB'
         WHEN first_rating_number <17 THEN 'B'
         WHEN first_rating_number <20 THEN 'CCC'        
         WHEN first_rating_number = 20 THEN 'CC'                     
         WHEN first_rating_number = 22 THEN 'D'  END first_rating_category_test
  FROM tbl_LESS_THAN;  

1 Ответ

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

Вы можете настроить тест для этого, если хотите, но логика предполагает, что подход неравенств должен быть быстрее.(НАМНОГО быстрее вы можете узнать это только путем тестирования.)

Почему?

Потому что неравенство - это единственный тест.Напротив, x in (3, 4, 5, 6, 7) - это пять тестов, и все пять должны быть проверены по порядку, если x = 7 или x нет в списке.Условие in переписывается как x = 3 or x = 4 or x = 5 ..., и эти тесты нельзя запускать параллельно - они проверяются по одному.

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