0
最近在SQL Server 2000中移动旧的数据库到SQL Server 2005查询性能差2005
我以下的事情:
- 在SQL恢复SQL 2000数据库新的DB的2005服务器
- 设置兼容模式SQL 2005
- 重建所有索引,更新了所有的统计,在所有表
我偶然发现的其中一个问题是,一个查询似乎在恢复的SQL 2005数据库上花费了很长时间(实际上,如5分钟),而在原始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
一些headscratching和反复试验后,我发现,当我改写了这个查询关键词,比如下面的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)。这可能会影响性能?
感谢您的回复。
马修
这两个版本的执行计划是什么样的? – 2011-01-14 18:14:13