在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
答案 0 :(得分:1)
听起来你的tempdb发生了一些奇怪的事情。在临时表中插入1000行应该很快,无论是用于排序的隐式假脱机,还是显式的select into
。
检查tempdb的大小,硬盘的运行状况及其恢复模式(应为simple
,而不是full
或bulk logged
。)
答案 1 :(得分:0)
排序操作通常是查询中的一个昂贵的步骤。因此,添加排序会增加时间并不奇怪。在步骤中合并临时表时,可能会看到类似的结果。原始查询中的排序操作可能使用tempdb来帮助进行排序,这可能是您比较的每个查询中耗时的步骤。
如果您想了解有关正在运行的每个查询的详情,可以查看查询计划输出。