Имеет ли смысл заменять подзапросы соединением? - PullRequest
2 голосов
/ 23 декабря 2010

Например, у меня есть такой запрос.

select col1 from t1 where col2>0 and col1 in (select col1 from t2 where col2>0)

Насколько я понимаю, я могу заменить его следующим запросом:

select t1.col1 from t1
join (select col1 from t2 where col2>0) as t2
on t1.col1=t2.col1
where t1.col2>0

ДОБАВЛЕНО

В некоторых ответах я вижу join в других inner join. Оба правы? Или они даже идентичны?

Ответы [ 8 ]

2 голосов
/ 23 декабря 2010

Объединение, как правило, быстрее, но лучший способ - это тестирование.

1 голос
/ 23 декабря 2010

Что имеет смысл, зависит от ваших стандартов кодирования.

Я бы избегал сравнительного анализа подзапросов и объединений, пока сам запрос не был оптимизирован (удаление лишних объединений, тавтологичных предложений where, чрезмерное извлечение столбцов) И профилирование демонстрирует необходимость оптимизации конкретного запроса.

Даже тогда ваше время, вероятно, будет лучше потрачено на определение хороших индексов, которые СУБД будет использовать во время выполнения.

1 голос
/ 23 декабря 2010

С такой проблемой вы должны пойти на объединение в любом случае

select t1.col1 
from t1 join t2 On t1.col1 = t2.col1
where t1.col2 > 0 and t2.col2 > 0

, и нет никакой разницы между «соединением» и «внутренним объединением».«Внутренний» может быть опущен, потому что это по умолчанию;только «внешний» с его типом должен быть указан.Тем не менее, "join" также может быть опущен, если вы напишите его так:

select t1.col1 
from t1, t2 
where t1.col2 > 0 and t2.col2 > 0 
  and t1.col1 = t2.col1
1 голос
/ 23 декабря 2010

на самом деле этого достаточно

select t1.col1 
from t1 join t2 On t2.col1 = t1.col1
Where t1.col2 > 0
   and t2.col2 > 0

Что касается того, что быстрее, единственный способ убедиться в этом - это проверить.Но я хотел бы предположить, что если производительность не является реальной проблемой взаимодействия с пользователем, более важной проблемой является долгосрочная ремонтопригодность, для которой ясность SQL является главным фактором.И подход подзапроса, на мой взгляд, выражает функцию, которую вы реализуете более четко

1 голос
/ 23 декабря 2010

Еще лучше:

select t1.col1
    from t1
        inner join t2
            on t1.col1 = t2.col1
    where t1.col2>0
        and t2.col2>0
1 голос
/ 23 декабря 2010

Это то, что вы пытаетесь сделать?

select col1 from t1 
inner join t2 ON t2.col1 = t1.col1
where t1.col2>0 and t2.col2>0

СОЕДИНЕНИЕ - определенно способ пойти сюда

0 голосов
/ 24 декабря 2010

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

0 голосов
/ 23 декабря 2010

А как на счет этого:

select t1.col1 from t1 join t2 On t2.col1 = t1.col1<br> AND t1.col2 > 0

...