2016-11-17 8 views
-3

У меня есть три таблицы, которые мне нужны, чтобы JOIN получить значения из двух столбцов. Эти столбцы: GRN_STATUS и STATUS Я написал некоторый SQL, который дает желаемый результат, но мне сообщили, что использование IN очень неэффективно и вместо этого я должен использовать EXISTS.Самый эффективный SQL-запрос: существует vs IN

Мне просто интересно, это правда в моей ситуации? и каково было бы решение с использованием EXISTS вместо IN?

SQL:

SELECT c.GRN_STATUS, a.STATUS 
FROM 
    TableA a 
     INNER JOIN 
    TableB b 
     ON a.ORD_NO = b.ORD_NO 
     AND a.COMPANY_ID = b.COMPANY_ID 
     INNER JOIN 
    TableC c 
     ON b.GRN_NO = c.GRN_NO 
     AND b.COMPANY_ID = c.COMPANY_ID 
AND a.STATUS IN ('B', 'C', 'D', 'E') 
AND c.GRN_STATUS = 'A'; 
+0

В зависимости от размера списка для проверки. В вашем случае «IN» и «EXSITS» должны иметь одинаковую производительность. –

+1

Я думаю, что ответ на часть эффективности вашего вопроса может быть специфичным для базы данных. Как вы сказали, какую базу данных вы используете? –

+0

Предполагая, что список может стать очень большим, будет ли «EXSITS' преформа лучше? – Johntk

ответ

1

В общем, это зависит от реализации в СУБД.

EXISTS в основном останавливается и возвращается в первом матче, поэтому МОЖЕТ быть более эффективным, но это не имеет смысла, когда у вас есть список констант.

Поскольку SQL является декларативным языком, вы не можете сообщить СУБД , как, просто что. Вы описываете ожидаемый результат, и именно сервер должен попытаться найти наиболее эффективный способ выполнить ваш запрос.

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

Так EXISTS может работать лучше на огромном таблица, хотя и не влияет на более мелкие (или наоборот).

Лучше всего на самом деле проверить оценочные планы запросов или попробовать их.

Мое личное мнение - использовать СУЩЕСТВУЮЩИЕ, когда данные не требуются, и ПРИСОЕДИНИТЕСЬ, когда требуются данные. IN - для постоянных списков.

+0

Интересно, что я пропустил, чтобы получить снисхождение. Не из-за точек на сайте, а просто из любопытства. – Pred

+0

Проголосовало (извините за задержку с объяснением). IN, основанный на подзапросе и его эквивалент EXIST имеет точно такое же логическое значение, поэтому может быть реализовано точно так же. Утверждение о том, что существуют различия в производительности, без упоминания о версии поставщика, версии и ** плана выполнения **, непрофессионально. Постскриптум В разных базах данных вы можете сообщить базе данных, как или нет, или, по крайней мере, подразумеваете. –

+0

P.s. Я призываю вас подумать, что означает «остановки и возвращения в первом матче» для хеш-соединения и объединения. –