在适当排序的索引覆盖的单个范围内执行 MIN() 或 MAX() 时,SQL Server 执行 TOP() 并因此在仅获取一行后返回值。当搜索条件包含多个范围时,SQL Server 会从两个范围中获取所有索引值并进行流聚合,这比对每个子值执行 TOP() 慢得多。
例如,假设每个客户有大量订单,如下所示:
CREATE TABLE orders
(
customer_id int,
quantity int
)
Run Code Online (Sandbox Code Playgroud)
运行此查询:
SELECT MAX(quantity)
FROM orders
WHERE customer_id IN (1,2)
Run Code Online (Sandbox Code Playgroud)
将导致查询所需的时间是仅指定一个客户 ID 时的数倍。
执行上述查询的最有效方法是什么?相关地,如果需要单独的结果(即 GROUP BY customer_id),最好的方法是什么?
SQL小提琴:http ://sqlfiddle.com/#!3/ef0c6/1