SQL CASE何时SQL Server 2005上的<Value> IN慢,但不是2000

Ory*_*ryx 2 sql sql-server database-administration

我有一个非常简单的查询,这让我绝对疯狂.

情况如下:

  • 我有两个数据库服务器.
  • 一个是旧的SQL Server 2000(VM),资源非常少.
  • 另一个是非常大的SQL Server 2005企业集群,其中可用的资源非常荒谬.
  • 我有一小部分较大的查询在3秒内执行,并在SQL Server 2000上返回50,000多行数据
  • 这个相同的小查询在SQL Server 2005上返回1000行需要15分钟以上
  • 我正在使用的数据库是这两台服务器上的镜像.相同的表,表中的相同数据,表上的相同索引等.

我已经尝试在SQL Server 2005表上创建不同的索引,对存在的所有索引进行碎片整理,更新表统计信息等.没有什么能够使这个查询在SQL Server 2005上运行得更快.目前没有其他任何针对SQL运行Server 2005服务器和我们的DBA向我保证,这不是配置问题或与SQL Server 2000和SQL Server 2005之间的功能弃用有关.

查询如下:

SELECT (CASE 
             WHEN TeamMember.ID IN  (SELECT DISTINCT ProjMgrID FROM ProjMgr)
                THEN 'Yes' 
                ELSE 'No' 
        END) AS OnProjAsMgr 
FROM TeamMember
Run Code Online (Sandbox Code Playgroud)

因此,返回所有ProjMgrs的不同列表,如果TeamMember在该列表上,则为OnProjAsMgr值指定"Yes".

我是一个完整的SQL新手,这是由前任编写的代码.我不知道是否有更好的方法来编写它,但我无法弄清楚为什么它在SQL Server 2000上运行得很好但在SQL Server 2005上完全崩溃.

Aar*_*and 5

DISTINCT导致排序,IN导致整个查询被评估.这个版本是如何工作的:

SELECT OnProjAsMgr = CASE WHEN EXISTS 
  (SELECT 1 FROM dbo.ProjMgr WHERE ProjMgrID = TeamMember.ID)
  THEN 'Yes' 
  ELSE 'No' 
  END
FROM dbo.TeamMember;
Run Code Online (Sandbox Code Playgroud)

如果这不是更好,那么我怀疑索引丢失,如果没有它们,任何查询都无法正常运行.