相关查询的效率

时间:2019-04-30 01:41:02

标签: sql

只是有关查询效率的一个问题。 假设我要针对名为O1的OrderValues视图实例编写外部查询;在SELECT列表中,将当前值除以一个相关子查询的结果,该子查询返回第二个OrderValues实例的总值,该实例称为O2,用于当前客户。这是完整的解决方案查询。

SELECT orderid, custid, val,
 CAST(100. * val / (SELECT SUM(O2.val)
 FROM Sales.OrderValues AS O2
 WHERE O2.custid = O1.custid)
 AS NUMERIC(5,2)) AS pct
FROM Sales.OrderValues AS O1
ORDER BY custid, orderid;
orderid custid val pct
----------- ----------- ---------- ------
10643 1 814.50 19.06
10692 1 878.00 20.55
10702 1 330.00 7.72
10835 1 845.80 19.79
10952 1 471.20 11.03
11011 1 933.50 21.85
10308 2 88.80 6.33
10625 2 479.75 34.20
10759 2 320.00 22.81
10926 2 514.40 36.67 

但是对于查询SELECT SUM(O2.val) FROM Sales.OrderValues AS O2 WHERE O2.custid = O1.custid,它仅需对每个商誉执行一次,例如,商誉为1的第一行,在第一行之后,我们已经拥有商誉1的总销售额,对于第二行,无论是否重复,相关查询的结构似乎每次都会再次执行内部查询。

1 个答案:

答案 0 :(得分:1)

这称为相关子查询,它可以提高效率-尤其是在使用正确索引的情况下。

但这最好使用窗口函数编写:

SELECT orderid, custid, val,
       CAST(100. * val / SUM(SUM(O2.val)) OVER (PARTITION BY custid)  AS NUMERIC(5,2)) AS pct
FROM Sales.OrderValues ov
ORDER BY custid, orderid;