Sql server SQL Server 2000和SQL Server 2005之间的查询性能差异
最近,我们正在将SQLServer2000中的一个遗留数据库移动到SQLServer2005 我做了以下几件事: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
- 在SQL 2005 server上恢复SQL 2000 DB
- 将新数据库的兼容模式设置为SQL 2005
- 在所有表上重建所有索引,更新所有统计信息
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子句中相比,在性能上会有差异
MathieuMSSQL Server在每个版本中都有显著的改进。当您在数据库版本之间迁移时,您应该查看在较新版本中所做的更改。这两个版本的执行计划是什么样的?