按条款排序,性能大幅下降

时间:2017-09-04 06:23:49

标签: sql sql-server

我运行以下查询:

SELECT A.ID, A.CODE, A.NAME, (SUBQUERY CALCULATING SALES)
FROM PRODUCTS A
JOIN PRODUCTSALES B ON A.ID = B.ID

查询在不到一秒的时间内返回250行。如果我在末尾添加ORDER BY A.CODEORDER BY A.NAME,则查询会在20秒内返回。

我无法理解为什么排序250行数据需要这么长时间。如果订单列是类似A.ID的整数,则不存在此行为。

1 个答案:

答案 0 :(得分:3)

原因是您强制SQL Server按顺序返回行。

  • 排序可能很昂贵,因为它可以在执行操作之前消耗大部分联接表

  • 群集/非群集索引已经提供了某种顺序,因此优化程序可以确定顺序。

通常情况下,SQL Server只会抓取匹配的前250行而不关心顺序或顺序行,而是使用Query完成。

但是,由于您现在坚持要按特定顺序返回前250行,因此优化程序现在必须在表之间使用排序操作,然后才能获取250个请求的行。

这就是为什么你会看到性能受到影响的原因,因为SQL Server现在必须将大部分匹配的表加载到要处理的内存中。

至于为什么你没有在ID列上注意到这一点,那是因为订单至少基于聚簇索引,所以已经有一种保证的排序顺序,所以优化器不需要加载那么多得到250行。