Что вы помещаете в часть выбора подзапроса, когда ей предшествует Exists? - PullRequest
1 голос
/ 06 октября 2009

Что вы помещаете в часть выбора подзапроса, когда ей предшествует Exists?

Select *  
  From some_table  
 Where Exists (Select 1  
                From some_other_table  
               Where some_condition )

Я обычно использую 1, я ставил *, но понял, что это может добавить некоторые бесполезные накладные расходы Что вы положили? Есть ли более эффективный способ, чем положить 1 или любое другое фиктивное значение?

Ответы [ 3 ]

1 голос
/ 06 октября 2009

Я думаю, что эффективность зависит от вашей платформы. В Oracle SELECT * и SELECT 1 в предложении EXISTS генерируют идентичные планы объяснения с одинаковыми затратами памяти. Нет никакой разницы. Однако другие платформы могут отличаться.

В порядке личных предпочтений я использую

  SELECT *

Поскольку ВЫБОР определенного поля может ввести читателя в заблуждение, что я забочусь об этом конкретном поле, а также позволяет мне скопировать / вставить этот подзапрос и запустить его без изменений, чтобы посмотреть на вывод.

Тем не менее, предложение EXISTS в операторе SQL немного напоминает запах кода, IMO. Бывают моменты, когда они являются лучшим и наиболее понятным способом получить то, что вы хотите, но их почти всегда можно выразить как объединение, что оптимизирует ядро ​​базы данных.

SELECT *
FROM SOME_TABLE ST
WHERE EXISTS(
  SELECT 1
  FROM SOME_OTHER_TABLE SOT
  WHERE SOT.KEY_VALUE1 = ST.KEY_VALUE1
    AND SOT.KEY_VALUE2 = ST.KEY_VALUE2
  ) 

Логически идентичен:

SELECT *
FROM
  SOME_TABLE ST
  INNER JOIN
  SOME_OTHER_TABLE SOT
  ON ST.KEY_VALUE1 = SOT.KEY_VALUE1
    AND ST.KEY_VALUE2 = SOT.KEY_VALUE2
1 голос
/ 06 октября 2009

Использование:

WHERE EXISTS (SELECT NULL
                FROM some_other_table  
               WHERE ... )

EXISTS возвращает true, если один или несколько указанных критериев соответствуют - не имеет значения, действительно ли столбцы возвращены в предложении SELECT. NULL просто указывает, что сравнения нет, а 1 / etc может быть допустимым значением, ранее использованным в предложении IN.

1 голос
/ 06 октября 2009

Я также использую 1. Я видел некоторых разработчиков, которые используют нуль. Я думаю, что 1 эффективнее по сравнению с выбором из любого поля, так как запрос не должен получать фактическое значение из физического loc, когда он выполняет предложение select подзапроса.

...