SQL2000到SQL2005。现在查询速度要慢得多

SQL2000到SQL2005。现在查询速度要慢得多,sql,sql-server,sql-server-2005,Sql,Sql Server,Sql Server 2005,这个查询过去在SQL2000中需要3秒,现在大约需要70秒。两个数据库给出相同的结果。2005数据库未在兼容模式下运行 目前,我们正在重建查询以在SQL2005中运行。。通过消除和理解逻辑的过程 然而,有人能看到我们错过的任何明显的东西吗 和/或是否有任何工具可在此提供帮助 我们一直在看执行计划。。。和剖析器。和索引调整向导 探查器指出,为了得到相同的结果,需要查询大量的记录 我知道这是一个很难在没有数据的情况下调试的问题。。。如果有什么明显的事情,另一双眼睛总是好的 干杯 --and dbo.

这个查询过去在SQL2000中需要3秒,现在大约需要70秒。两个数据库给出相同的结果。2005数据库未在兼容模式下运行

目前,我们正在重建查询以在SQL2005中运行。。通过消除和理解逻辑的过程

然而,有人能看到我们错过的任何明显的东西吗

和/或是否有任何工具可在此提供帮助

我们一直在看执行计划。。。和剖析器。和索引调整向导

探查器指出,为了得到相同的结果,需要查询大量的记录

我知道这是一个很难在没有数据的情况下调试的问题。。。如果有什么明显的事情,另一双眼睛总是好的

干杯

--and dbo.fn_UserCanSeeDoc(@UserID,D.Doc_ID)<>0

-- if exists(Select 1 from Omnibook where Omnibook_ID = @DocID) 
--      Begin
--          Set @ReturnVal =  1
--      End 
--  
--  else
--      Begin
--          if exists(
--              Select 1
--              from UserSecurityModule USM
--              Inner join DocSecurity DS
--              On USM.SecurityModuleID = DS.SecurityModuleID
--              where USM.UserID = @UserID
--              and DS.DocID = @DocID
--          )
--          
--              Set @ReturnVal =  1
--          
--          else
--                  
--              Set @ReturnVal = 0
--      End

AND D.Doc_ID IN (select DS.DocID from UserSecurityModule USM
                Inner join DocSecurity DS
                On USM.SecurityModuleID = DS.SecurityModuleID
                where USM.UserID = @UserID)
戴夫


你的统计数据有可能没有被人发现?在2k5数据库中?那么数据库没有制定好计划所需的信息?与旧数据库不同的是,旧数据库在表中有良好的统计数据,可以为数据选择更好的计划?

是否可能没有遇到您的统计数据?在2k5数据库中?那么数据库没有制定好计划所需的信息?与旧数据库不同,旧数据库在表中有良好的统计数据,可以为数据选择更好的计划?

当统计数据无法跟上数据时,我以前见过这种情况。在本例中,SQLServer2005使用的统计信息可能与SQLServer2000不同。尝试为查询中使用的表重建统计信息;因此,对于每个表:

UPDATE STATISTICS <table> WITH FULLSCAN

是的,我会添加完整扫描,除非您对数据了解得足够透彻,认为一个记录样本会给出足够好的结果。这会减慢统计数据的创建速度,但会使其更加准确。

当统计数据跟不上数据时,我以前见过这种情况。在本例中,SQLServer2005使用的统计信息可能与SQLServer2000不同。尝试为查询中使用的表重建统计信息;因此,对于每个表:

UPDATE STATISTICS <table> WITH FULLSCAN

是的,我会添加完整扫描,除非您对数据了解得足够透彻,认为一个记录样本会给出足够好的结果。这会减慢统计数据的创建速度,但会使其更加准确。

这可能是参数嗅探的问题,即SQL Server缓存为第一次执行提供的参数而优化的查询计划吗?

参数嗅探是否存在问题,即SQL Server缓存针对第一次执行提供的参数优化的查询计划?
一所大学想出了一个解决办法。。。关于将函数fn_UserCanSeeDoc带回SQL

下面显示的是旧的注释掉的函数代码,然后是它下面的新内联SQL。代码现在运行速度非常快,从1分钟到大约1秒钟

看着旧的SQL,我很惊讶SQL2000在运行它方面做得多么好

干杯

--and dbo.fn_UserCanSeeDoc(@UserID,D.Doc_ID)<>0

-- if exists(Select 1 from Omnibook where Omnibook_ID = @DocID) 
--      Begin
--          Set @ReturnVal =  1
--      End 
--  
--  else
--      Begin
--          if exists(
--              Select 1
--              from UserSecurityModule USM
--              Inner join DocSecurity DS
--              On USM.SecurityModuleID = DS.SecurityModuleID
--              where USM.UserID = @UserID
--              and DS.DocID = @DocID
--          )
--          
--              Set @ReturnVal =  1
--          
--          else
--                  
--              Set @ReturnVal = 0
--      End

AND D.Doc_ID IN (select DS.DocID from UserSecurityModule USM
                Inner join DocSecurity DS
                On USM.SecurityModuleID = DS.SecurityModuleID
                where USM.UserID = @UserID)

一所大学想出了一个解决办法。。。关于将函数fn_UserCanSeeDoc带回SQL

下面显示的是旧的注释掉的函数代码,然后是它下面的新内联SQL。代码现在运行速度非常快,从1分钟到大约1秒钟

看着旧的SQL,我很惊讶SQL2000在运行它方面做得多么好

干杯

--and dbo.fn_UserCanSeeDoc(@UserID,D.Doc_ID)<>0

-- if exists(Select 1 from Omnibook where Omnibook_ID = @DocID) 
--      Begin
--          Set @ReturnVal =  1
--      End 
--  
--  else
--      Begin
--          if exists(
--              Select 1
--              from UserSecurityModule USM
--              Inner join DocSecurity DS
--              On USM.SecurityModuleID = DS.SecurityModuleID
--              where USM.UserID = @UserID
--              and DS.DocID = @DocID
--          )
--          
--              Set @ReturnVal =  1
--          
--          else
--                  
--              Set @ReturnVal = 0
--      End

AND D.Doc_ID IN (select DS.DocID from UserSecurityModule USM
                Inner join DocSecurity DS
                On USM.SecurityModuleID = DS.SecurityModuleID
                where USM.UserID = @UserID)

如果您以文本格式发布查询计划,您可能会得到更多帮助,这样人们就可以看到查询运算符是什么以及它们的输入是什么。您还需要提供有关现有索引的信息。如果以文本格式发布查询计划,您可能会得到更多帮助,这样人们就可以看到查询运算符是什么以及它们的输入是什么。您还需要提供有关现有索引的信息。除此之外,您升级后是否更新了统计数据?仍然对SQL 2000如何做得如此出色感到困惑。。请参阅下面的代码:-除此之外,升级后您是否更新了统计数据?仍然对SQL 2000如何做得如此出色感到困惑。。请参阅下面的代码:-嗨-尝试了。。非常感谢:EXEC sp_MSforeachtable@command1=print'?'DBCC DBREINDEX'?','',80 EXEC sp_MSforeachtable@command1=updatestatistics?具有FULLSCAN@Dave-有什么不同吗?嗨-试过了。。非常感谢:EXEC sp_MSforeachtable@command1=print'?'DBCC DBREINDEX'?','',80 EXEC sp_MSforeachtable@command1=updatestatistics?具有FULLSCAN@Dave-有什么不同吗?