Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/sql-server-2005/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sql server SQL Server 2000和SQL Server 2005之间的查询性能差异_Sql Server_Sql Server 2005_Tsql_Sql Server 2000 - Fatal编程技术网

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

Sql server SQL Server 2000和SQL Server 2005之间的查询性能差异,sql-server,sql-server-2005,tsql,sql-server-2000,Sql Server,Sql Server 2005,Tsql,Sql Server 2000,最近,我们正在将SQLServer2000中的一个遗留数据库移动到SQLServer2005 我做了以下几件事: 在SQL 2005 server上恢复SQL 2000 DB 将新数据库的兼容模式设置为SQL 2005 在所有表上重建所有索引,更新所有统计信息 我偶然发现的一个问题是,在恢复的SQL 2005数据库中,一个查询似乎需要花费很长时间(实际上,大约5分钟),而在原始SQL 2000数据库中则需要3秒钟 这是具体的查询: SELECT * FROM Users LEFT OUTER

最近,我们正在将SQLServer2000中的一个遗留数据库移动到SQLServer2005

我做了以下几件事:

  • 在SQL 2005 server上恢复SQL 2000 DB
  • 将新数据库的兼容模式设置为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
经过一些headcratch和反复试验,我发现当我在SQL 2005 DB上像下面这样重写此查询时,它再次执行得非常快,就像在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子句中取出标准,并将其集成到左连接逻辑中

因此,尽管我自己找到了解决方案,但我仍然有以下问题没有回答:

  • 为什么SQL 2000和SQL 2005在该查询方面存在差异
  • 为什么将筛选条件放在连接逻辑中与放在WHERE子句中相比,在性能上会有差异
我必须补充一件重要的事情:这个数据库中的所有主键都是数据类型GUID(不是我的设计,…我个人从来不使用GUID)。这会影响性能吗

谢谢你的回复


Mathieu

MSSQL Server在每个版本中都有显著的改进。当您在数据库版本之间迁移时,您应该查看在较新版本中所做的更改。

这两个版本的执行计划是什么样的?