我运行以下查询:
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.CODE
或ORDER BY A.NAME
,则查询会在20秒内返回。
我无法理解为什么排序250行数据需要这么长时间。如果订单列是类似A.ID的整数,则不存在此行为。
答案 0 :(得分:3)
原因是您强制SQL Server按顺序返回行。
排序可能很昂贵,因为它可以在执行操作之前消耗大部分联接表
群集/非群集索引已经提供了某种顺序,因此优化程序可以确定顺序。
通常情况下,SQL Server只会抓取匹配的前250行而不关心顺序或顺序行,而是使用Query完成。
但是,由于您现在坚持要按特定顺序返回前250行,因此优化程序现在必须在表之间使用排序操作,然后才能获取250个请求的行。
这就是为什么你会看到性能受到影响的原因,因为SQL Server现在必须将大部分匹配的表加载到要处理的内存中。
至于为什么你没有在ID列上注意到这一点,那是因为订单至少基于聚簇索引,所以已经有一种保证的排序顺序,所以优化器不需要加载那么多得到250行。