SQL Server ORDER BY性能异常

时间:2010-10-04 21:42:24

标签: sql-server performance

在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

这产生了相同的结果。

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

在这一点上真正奇怪的是,即使没有ORDER BY,SELECT ... INTO也将花费90秒。

执行计划表示SORT在主查询中包含98%的执行时间。如果我正在执行INSERT INTO,那么解释计划会说实际插入临时表需要99%的执行时间。

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

非常感谢!

rjsjr

2 个答案:

答案 0 :(得分:1)

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

检查tempdb的大小,硬盘的运行状况及其恢复模式(应为simple,而不是fullbulk logged。)

答案 1 :(得分:0)

排序操作通常是查询中的一个昂贵的步骤。因此,添加排序会增加时间并不奇怪。在步骤中合并临时表时,可能会看到类似的结果。原始查询中的排序操作可能使用tempdb来帮助进行排序,这可能是您比较的每个查询中耗时的步骤。

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