Execution plan for COMPUTE BY
-
28-09-2020 - |
سؤال
I understand that the COMPUTE BY
feature is deprecated. Out of curiosity I would like to know how the query processor executes a COMPUTE BY
query. The execution plan does not contain any hint:
How does the query processor execute COMPUTE BY
and how can I obtain an accurate execution plan?
Here is some T-SQL to play with:
create table employee(
ID int,
name nvarchar (10),
salary int,
start_date datetime,
city nvarchar (10),
region char (1))
GO
insert into employee (ID, name, salary, start_date, city, region)
values (1, 'Jason', 40420, '02/01/94', 'New York', 'W')
insert into employee (ID, name, salary, start_date, city, region)
values (2, 'Robert',14420, '01/02/95', 'Vancouver','N')
GO
insert into employee (ID, name, salary, start_date, city, region)
values (3, 'Celia', 24020, '12/03/96', 'Toronto', 'W')
insert into employee (ID, name, salary, start_date, city, region)
values (4, 'Linda', 40620, '11/04/97', 'New York', 'N')
GO
insert into employee (ID, name, salary, start_date, city, region)
values (5, 'David', 80026, '10/05/98', 'Vancouver','W')
GO
insert into employee (ID, name, salary, start_date, city, region)
values (6, 'James', 70060, '09/06/99', 'Toronto', 'N')
GO
insert into employee (ID, name, salary, start_date, city, region)
values (7, 'Alison',90620, '08/07/00', 'New York', 'W')
GO
insert into employee (ID, name, salary, start_date, city, region)
values (8, 'Chris', 26020, '07/08/01', 'Vancouver','N')
GO
insert into employee (ID, name, salary, start_date, city, region)
values (9, 'Mary', 60020, '06/09/02', 'Toronto', 'W')
GO
select * from employee
GO
/*
ID name salary start_date city region
----------- ---------- ----------- ----------------------- ---------- ------
1 Jason 40420 1994-02-01 00:00:00.000 New York W
2 Robert 14420 1995-01-02 00:00:00.000 Vancouver N
3 Celia 24020 1996-12-03 00:00:00.000 Toronto W
4 Linda 40620 1997-11-04 00:00:00.000 New York N
5 David 80026 1998-10-05 00:00:00.000 Vancouver W
6 James 70060 1999-09-06 00:00:00.000 Toronto N
7 Alison 90620 2000-08-07 00:00:00.000 New York W
8 Chris 26020 2001-07-08 00:00:00.000 Vancouver N
9 Mary 60020 2002-06-09 00:00:00.000 Toronto W
*/
-- COMPUTE BY
SELECT salary, Name
FROM Employee
ORDER BY ID, Name
COMPUTE SUM(Salary)
GO
/*
salary Name
----------- ----------
40420 Jason
14420 Robert
24020 Celia
40620 Linda
80026 David
70060 James
90620 Alison
26020 Chris
60020 Mary
sum
===========
446226
*/
GO
drop table employee
(Source)
The results from this single SELECT
are:
المحلول
How does the query processor execute COMPUTE BY?
It is a hard-coded sequence of operations at the top of the execution tree. There is a simple stream accumulation (hence the ordering requirement), some logic to detect the start of a new group, a little computation and data value copying, and direct calls to construct the alternate TDS result sets per group. Some example call stacks from a query using COMPUTE BY
are shown below:
and how can I obtain an accurate execution plan?
You can't, because COMPUTE BY
is not implemented in the same way as other plan operations. The replacement ROLLUP
support does use the regular execution framework, automatically providing showplan information. An additional benefit of ROLLUP
is that it does not use alternate TDS result sets, providing better client compatibility. In short, no one will miss COMPUTE
.