gpt4 book ai didi

SQL CASE WHEN IN 在 SQL Server 2005 上运行缓慢,但在 2000 上运行缓慢

转载 作者:行者123 更新时间:2023-12-02 22:30:21 25 4
gpt4 key购买 nike

我有一个非常简单的查询,它让我非常抓狂。

情况是这样的:

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

我已经尝试在 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

因此返回所有 ProjMgrs 的不同列表,如果 TeamMember 在该列表中,则将"is"分配给 OnProjAsMgr 值。

我是一个彻头彻尾的SQL新手,这是前辈写的代码。我不知道是否有更好的编写方法,但我不明白为什么它在 SQL Server 2000 上运行良好但在 SQL Server 2005 上完全崩溃。

最佳答案

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

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

如果情况没有好转,那么我怀疑缺少索引,没有它们,任何查询都无法正常执行。

关于SQL CASE WHEN <Value> IN 在 SQL Server 2005 上运行缓慢,但在 2000 上运行缓慢,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12377461/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com