3

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:

enter image description here

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:

enter image description here

  • It seems to me like a proprietary replacement for analytical clause in ; the same result will be with SUM(salary) OVER (PARTITION BY id) ... – a1ex07 Jul 9 '15 at 15:19
4

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:

Accumulation

Copying

Alternate TDS result set generation

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.

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service, privacy policy and cookie policy

Not the answer you're looking for? Browse other questions tagged or ask your own question.