Разница в производительности запросов между SQL Server 2000 и SQL Server 2005 - PullRequest
0 голосов
/ 14 января 2011

недавно перемещал устаревшую базу данных в SQL Server 2000 в SQL Server 2005.

Я сделал следующие вещи:

  • Восстановление базы данных SQL 2000 на сервере SQL 2005
  • Установить режим совместимости новой БД для SQL 2005
  • Перестроены все индексы, обновлена ​​вся статистика по всем таблицам

Одна из проблем, с которыми я столкнулся, заключалась в том, что один запрос, казалось, занимал годы (фактически, около 5 минут) в восстановленной базе данных SQL 2005, тогда как в исходной базе данных SQL 2000 он занимал 3 секунды.

Это конкретный запрос:

SELECT *
FROM Users
LEFT OUTER JOIN STAFF_Movement
ON Users.USERS_ID = STAFF_Movement.MOVEM_USERS_ID
WHERE
(
 (
  STAFF_Movement.MOVEM_Date = (
               SELECT MAX(MOVEM_Date)
               FROM STAFF_Movement sm
                   WHERE sm.MOVEM_USERS_ID = Users.USERS_ID
              )
 )
OR
 (
  STAFF_Movement.MOVEM_Date IS NULL
 )
)
AND (Users.USERS_IsUser = 1)
ORDER BY Users.USERS_LastName, Users.USERS_FirstName

После некоторого разбора, проб и ошибок я обнаружил, что когда я переписывал этот запрос, например, следующий за базой данных SQL 2005, он снова выполнялся очень быстро, как и в SQL 2000:

SELECT *
FROM Users u1
LEFT JOIN  STAFF_Movement sm1 ON u1.USERS_ID = sm1.MOVEM_USERS_ID
AND
(
(
sm1.MOVEM_Date = (
                SELECT MAX(sm.MOVEM_Date)
                FROM STAFF_Movement sm
                WHERE sm.MOVEM_USERS_ID = u1.USERS_ID
                )
)
OR
(
sm1.MOVEM_Date IS NULL
)

)

WHERE 
(u1.USERS_IsUser = 1)
ORDER BY u1.USERS_LastName, u1.USERS_FirstName

Итак, по сути, я выбрал критерии из условия where и интегрировал их в логику LEFT JOIN.

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

  • почему существует разница между SQL 2000 и SQL 2005 в отношении этого запроса?
  • почему существует разница в производительности при помещении критериев фильтра в логику JOIN, а не в предложение WHERE?

Одна важная вещь, которую я должен добавить: все первичные ключи в этой базе данных имеют GUID типа данных (не мой дизайн, я лично никогда не использовал бы GUID). Может ли это повлиять на производительность?

Спасибо за любые ответы.

Матье

1 Ответ

0 голосов
/ 14 января 2011

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

...