недавно перемещал устаревшую базу данных в 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). Может ли это повлиять на производительность?
Спасибо за любые ответы.
Матье