查询SQL Server 2000和SQL Server 2005之间的性能差异

最近一直将SQL Server 2000中的遗留数据库移至SQL Server 2005。

我做了以下事情:

  • 在SQL 2005服务器上还原SQL 2000数据库
  • 将新数据库的兼容模式设置为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
    

    在经历了一些头疼的尝试和错误之后,我发现当我像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)。 这可能会影响性能?

    感谢您的回复。

    马蒂厄


    MSSQL Server在每个版本中都会有显着的改进。无论何时在数据库版本之间进行迁移,您都应该查看新版本中所做的更改。

    链接地址: http://www.djcxy.com/p/95649.html

    上一篇: Query performance difference between SQL Server 2000 and SQL Server 2005

    下一篇: Mass Insert Into Sql Server