2011-01-14 84 views
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)。这可能会影响性能?

感谢您的回复。

马修

+0

这两个版本的执行计划是什么样的? – 2011-01-14 18:14:13

回答

0

MSSQL服务器发生在每一个version.whenever你的数据库版本之间迁移,你应该看看已在新版本中所做的更改显著改善。