【问题标题】:After SQL Server 2008 upgrade, query with UNION runs very slowlySQL Server 2008 升级后,使用 UNION 的查询运行速度很慢
【发布时间】:2011-11-07 20:39:29
【问题描述】:

我们从 SQL Server 2000 迁移到 2008,当我们使用 UNION 运算符时,针对某些用户(在某些数据库角色中)的查询运行非常缓慢。我用 UNION ALL 试过了

查询如下

SELECT  'PONumber'= '','POId'=''

UNION 

SELECT DISTINCT 
                'PONumber'=PONumber, 
                'POId'=RTRIM(CONVERT(varchar(32),po.POId) )
FROM  PurchaseOrder po JOIN  ... JOIN ..... JOIN ...................

如果我只是删除第一部分(和 UNION)并运行第二个查询,结果会立即返回。

有什么建议吗?

【问题讨论】:

  • 更新前相同的查询是如何执行的?我会检查执行计划并重建受影响的索引以防万一。
  • 您需要查看执行计划。看起来你不是架构限定你的对象(例如dbo.PurchaseOrder所以我认为这可以解释为什么不同的用户得到不同的计划)
  • 不知道是否有帮助注意连接表之一使用 sysusers 和 sysmembers 系统表 uid 列,因为我们在整个数据库中使用 SQL Server 内置安全性

标签: sql-server-2008 sql-server-2000 performance


【解决方案1】:

我不知道它在 SQL 2000 中会如何反应,但使用 UNION 而不是 UNION ALL 会在两个查询的结果合并时导致排序操作(以消除重复) .这可能需要大量处理,具体取决于结果集的大小。

此外,在 SQL 2000 和 SQL 2008 之间,tempdb 的使用变化非常显着。排序操作可能会使用 tempdb,因此您应该检查您的 tempdb 的介质并确保它有足够的空间等。

【讨论】:

  • 是的。 tempdb 现在只使用 640 MB,还剩下 400 MB。不确定是否需要注意其中一个联接表使用 sysusers 和 sysmembers 系统表 uid 列,因为我们在整个数据库中使用 SQL Server 内置安全性
  • 我会尝试在另一台具有更多tempdb 空间的服务器上测试代码,看看是否有帮助。
猜你喜欢
  • 1970-01-01
  • 2018-04-17
  • 2012-06-25
  • 1970-01-01
  • 1970-01-01
  • 2016-02-29
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多