Присоединяйтесь к запросам, которые занимают больше времени выполнения, чем их соответствующие вложенные запросы - PullRequest
0 голосов
/ 30 ноября 2009

У меня есть 2 таблицы Person_Organization и Person_Organization_other, а вложенный запрос:

SELECT 
    Person_Organization_id 
FROM 
    Person_Organization_other 
WHERE  
   company_name IN (SELECT company_name 
                    FROM Person_Organization_other
                    WHERE Person_Organization_id IN (SELECT Person_Organization_Id 
                                                     FROM Person_Organization 
                                                     WHERE person_id = 117 
                                                       AND delete_flag = 0)
                  )

Принимая во внимание, что соответствующий запрос вышеупомянутого запроса с соединением, который я пробовал: -

SELECT  
    poo.Person_Organization_id 
FROM 
    Person_Organization_other poo, Person_Organization_other poo1, Person_Organization po
WHERE
    poo1.Person_Organization_id = po.Person_Organization_Id 
    AND po.person_id = 117 
    AND po.delete_flag = 0 
    AND poo.company_name = poo1.company_name
GROUP BY 
    poo.Person_Organization_id

Однако выясняется, что вложенный запрос занимает меньше времени по сравнению с соответствующим запросом с объединениями. Я использовал трассировку SQL Profiler для сравнения времени выполнения запросов. Для вложенного запроса это заняло 30 с лишним мс. Для объединенного запроса потребовалось 41 нечетное мс

У меня сложилось впечатление, что, как правило, вложенные запросы менее перфоманны и их следует "выравнивать" с помощью объединений.

Может кто-нибудь объяснить, что я делаю не так?

С уважением Нитин

Ответы [ 4 ]

1 голос
/ 30 ноября 2009

Вы используете перекрестные соединения. Попробуйте внутренние соединения.

select poo.Person_Organization_id 
from Person_Organization po 
 INNER JOIN Person_Organization_other poo ON
  poo.Person_Organization_id=po.Person_Organization_Id
 INNER JOIN Person_Organization_other poo1 ON
  poo1.Person_Organization_id=po.Person_Organization_Id AND   
  poo.company_name=poo1.company_name
 where po.person_id=117 AND po.delete_flag=0 
 group by poo.Person_Organization_id
0 голосов
/ 22 февраля 2012

Ваш порядок таблиц может снизить производительность, в которой порядок таблиц должен быть в порядке возрастания количества строк

0 голосов
/ 30 ноября 2009

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

Фактически SQL-сервер оптимизирует все выполняемые запросы, сводя их к дереву выполнения - часто запросы, использующие JOIN, заканчиваются идентичными деревьями выполнения с эквивалентными операторами SQL, которые вместо этого используют вложенные запросы.

В этом случае время их выполнения действительно очень мало - разницу можно объяснить так же легко, как и из-за того, что кеши и т. Д. Не заполнены.

Мой совет - использовать любой синтаксис, который имеет для вас больший смысл - если у вас проблемы с производительностью, непременно вернитесь и проверьте, не является ли вложенный подзапрос причиной вашей проблемы, однако я определенно не буду потратьте время на то, чтобы "сгладить" запросы, которые не вызывают проблем.

0 голосов
/ 30 ноября 2009

Разделяя таблицы запятыми, вы фактически объединяете их. Я попытался бы сделать явные ВНУТРЕННИЕ СОЕДИНЕНИЯ между таблицами и посмотреть, помогает ли это производительность.

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