вложенные существующие предложения против смежных существующих предложений - PullRequest
0 голосов
/ 30 сентября 2011

Может кто-нибудь сказать, пожалуйста, какой из этих двух запросов лучше другого и почему?Стоит ли использовать вместо этого соединение?

select * from grandChildTable gct
where exists(
    select * from childTable ct
    where some condition
    and gct.parentId = ct.Id
    and exists(
        select * from Table t
        where some other condition
        and ct.parentId = t.Id))

select * from grandChildTable gct
where exists(
    select * from childTable ct
    where some condition
    and gct.parentId = ct.Id)
and exists(
    select * from Table t
    where some other condition
    and gct.grandParentId = t.Id)

ПРИМЕЧАНИЯ: GrandChildTable имеет идентификаторы для ChildTable и Table, поскольку идентификаторы составные.

Таблицы нене имеет ссылок на любые другие.

Отношения между таблицами:

GrandChild to Child
n:1

Child to Table
n:1

1 Ответ

0 голосов
/ 30 сентября 2011

В этом случае (по сравнению с родительскими таблицами, где у вас меньше строк, чем у дочерних), при использовании JOIN может быть мало различий.Однако EXISTS обычно быстрее и провереннее.

Я бы также ожидал, что оптимизатор сгенерирует идентичные планы для 2-х основанных на EXISTS: изучит планы запросов и выяснит, есть ли различия (также это ссылка на Красные Ворота ).Если нет, перейдите на удобочитаемость.

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