【问题标题】:SQL Server ORDER BY Performance AberrationSQL Server ORDER BY 性能异常
【发布时间】:2010-10-04 21:42:23
【问题描述】:

在 Windows Server Enterprise(?) Edition 2008 上运行的 SQL Server 2008

我有一个查询加入了 20 个奇怪的表(主要是 LEFT OUTER JOIN)。未过滤查询返回的完整数据集在不到 1 秒的时间内返回不到 1,000 行。当我应用 WHERE 子句过滤查询时,它会在不到 1 秒的时间内返回不到 300 行。

当我对查询应用 ORDER BY 子句时,它会在 90 秒内返回。

我检查了查询的结果,并注意到在用于排序的列中返回了许多 NULL 结果。我将查询修改为 COALESCE 一个 NULL 值到一个有效的搜索值,而对查询的性能没有任何改变。

然后我做了一个

SELECT * FROM
(
my query goes here
) qry
ORDER BY myOrderByHere

这产生了相同的结果。

当我 SELECT ... INTO #tempTable(没有 ORDER BY)然后从 #tempTable 中选择时,查询返回的顺序不到 1 秒。

此时真正奇怪的是,即使没有 ORDER BY,SELECT... INTO 也会花费 90 秒。

执行计划表明,当包含在主查询中时,SORT 占用了 98% 的执行时间。如果我正在执行 INSERT INTO,则说明计划表明实际插入临时表需要 99% 的执行时间。

为了解决服务器问题,我在 SQL Server 2008 的两个不同实例上运行了相同的测试,结果几乎相同。

非常感谢!

rjsjr

【问题讨论】:

    标签: sql-server performance


    【解决方案1】:

    听起来你的 tempdb 发生了一些奇怪的事情。在临时表中插入 1000 行应该很快,无论是用于排序的隐式假脱机,还是显式 select into

    检查您的 tempdb 的大小、它所在硬盘的运行状况以及它的恢复模式(应该是 simple,而不是 fullbulk logged。)

    【讨论】:

    • 在我的开发/测试服务器上,TempDB 有 400MB 大,有 400MB 可用空间。在恢复下,我看到页面验证选项设置为 CHECKSUM。我确保日志文件被截断并重新运行测试,结果没有变化。我还尝试将查询的主体移动到 VIEW 并在该视图上执行 SELECT 和 ORDER。这会产生相同的结果。
    【解决方案2】:

    排序操作通常是查询中代价高昂的步骤。因此,添加排序会增加时间也就不足为奇了。当您在步骤中加入临时表时,您可能会看到类似的结果。原始查询中的排序操作可能会使用 tempdb 来帮助进行排序,这可能是您比较的每个查询中的耗时步骤。

    如果您想详细了解正在运行的每个查询,可以查看查询计划输出。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-11-29
      • 2013-03-01
      • 1970-01-01
      相关资源
      最近更新 更多