SQL Server 2008 R2 - казалось бы, конфликтующие объединения приводят к очень медленным запросам - PullRequest
1 голос
/ 01 декабря 2011

Этот запрос занимает 16 секунд для выполнения

SELECT 
    WO.orderid
FROM 
    WebOrder as WO
    INNER JOIN Addresses AS A ON WO.AddressID = A.AddressID
    LEFT JOIN SalesOrders as SO on SO.SO_Number = WO.SalesOrderID   

Если я закомментирую любое из объединений, он выполняется за небольшую долю секунды.Пример:

SELECT 
    WO.orderid
FROM 
    WebOrder as WO
    INNER JOIN Addresses AS A ON WO.AddressID = A.AddressID
    -- LEFT JOIN SalesOrders as SO on SO.SO_Number = WO.SalesOrderID    

или

SELECT 
    WO.orderid
FROM 
    WebOrder as WO
    -- INNER JOIN Addresses AS A ON WO.AddressID = A.AddressID
    LEFT JOIN SalesOrders as SO on SO.SO_Number = WO.SalesOrderID

Примечания

  • В таблицах SalesOrders и около 40 000 записей каждаяAdddresses.
  • У меня есть индексы или PKeys для всех полей, используемых в предложениях ON.

План выполнения для медленной версии (SalesOrders Join закомментирован)

enter image description here

План выполнения для быстрой версии

enter image description here



Почему этиСоединения при использовании в сочетании друг с другом приводят к тому, что значение увеличивается с ~ 0,01 до 16 секунд?

1 Ответ

2 голосов
/ 01 декабря 2011

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

  • Перестройка индексов
  • Обновление статистики
  • DBCC FREEPROCCACHE

Лично я не ожидал бы, что последний что-то сделает - похоже, у вас есть разумный план запросов, как он есть.

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