在我的办公室,我们有一个非常丑陋的查询,但在生产环境和开发环境(分别为20秒和4秒)中运行得很好。但是,在我们的测试环境中,它需要4个小时以上。SQL2005(+最新补丁程序)正在生产和开发中。SQL2008R2正在测试中。
我看了一下查询计划,它表明SQL2008R2通过表假脱机(惰性假脱机)使用TempDB来存储从链接服务器返回的行。下一步显示嵌套循环(左半连接)占用了查询的96.3%。两家运营商之间的界限为5,398MB!
SQL 2005的查询计划不使用tempdb,也不使用左反半联接。
下面是经过清理的代码,执行计划顶部是2005年计划,底部是2008R2。
是什么导致急剧的减速和变化?我期望看到一个不同的执行计划,所以这不会打扰我。查询时间的急剧下降是困扰我的原因。
由于2008R2版本使用的是tempdb,因此我是否必须查看底层硬件,所以我必须查看如何优化其用法?
有没有更好的方法来编写查询?
谢谢您的帮助。
INSERT INTO Table1_GroupLock (iGroupID, dLockedDate)
SELECT
Table1.iGroupID,
GETDATE()
FROM Table1
WHERE
NOT EXISTS (
SELECT 1
FROM LinkedServer.Database.Table2 Alias2
WHERE
(
Alias2.FirstName + Alias2.LastName = dbo.fnRemoveNonLetter(Table1.FullName)
AND NOT dbo.fnRemoveNonLetter(Table1.FullName) IS NULL
AND NOT Alias2.FirstName IS NULL
AND NOT Alias2.LastName IS NULL
) OR (
Alias2.FamilyName = dbo.fnRemoveNonLetter(Table1.FamilyName)
AND Alias2.Child1Name = dbo.fnRemoveNonLetter(Table1.Child1Name)
AND NOT dbo.fnRemoveNonLetter(Table1.FamilyName) IS NULL
AND NOT dbo.fnRemoveNonLetter(Table1.Child1Name) IS NULL
AND NOT Alias2.Familyname IS NULL
AND NOT Alias2.Child1Name IS NULL
) OR (
Alias2.StepFamilyName = dbo.fnRemoveNonLetter(Table1.StepFamilyName)
AND Alias2.StepFamilyNameChild1 = dbo.fnRemoveNonLetter(Table1.StepFamilyNameChild2)
AND NOT Alias2.StepFamilyName IS NULL
AND NOT Alias2.StepFamilyNameChild1 IS NULL
AND NOT dbo.fnRemoveNonLetter(Table1.StepFamilyName) IS NULL
AND NOT dbo.fnRemoveNonLetter(Table1.StepFamilyNameChild2) IS NULL
)
) AND NOT EXISTS (
SELECT 1
FROM Table3
INNER JOIN Table4
ON Table4.FirstNameType = Table3.FirstNameType
INNER JOIN table5
ON table5.LastNameType = Table3.LastNameType
WHERE
Table3.iGroupID = Table1.iGroupID
AND Table3.bIsClosed = 0
AND Table4.sNameTypeConstant = 'new_lastname'
AND table5.sFirstNameConstant = 'new_firstname'
)
::编辑:: 从不同的SQL2005实例执行查询,该执行计划与“好实例”几乎相同。仍然不确定两个2005版本在2008R2链接服务器上的运行情况如何好于2008R2实例到2008R2实例的运行情况。
虽然我不否认代码可以使用一些工作,但是如果代码是问题所在,我是否会在所有试用中看到相同的执行计划?不论SQL版本如何?
::编辑:: 我已经将SP1和CU3应用于两个2008R2实例,但仍然没有骰子。我专门在链接服务器中设置了搭配,没有骰子。我专门将我的用户acct的权限设置为在两个实例上均为sysadmin,没有骰子。我还记得我的sql server 2008内部和疑难解答,我们将看看我是否可以对此进行跟踪。
感谢大家的帮助和提示。
::编辑:: 我对链接服务器进行了各种权限更改。我使用过SQL登录名,域登录名,已经模拟了用户,并且使用了“使用此安全上下文进行”选项。我在链接服务器的两边都创建了对服务器具有sysadmin权限的用户。我没主意。
我仍然想知道为什么SQL2005执行查询的原因与SQL2008R2截然不同。如果查询不好,我将在SQL2005和SQL2008R2上看到4小时以上的运行时间。