SlideShare a Scribd company logo
GROUPING SETS 
CCUBE, ROLLUP, and Friends 
SFPUG 2014/11/18 
Copyright© 2014 
David Fetter 
Tuesday, November 18, 14
Thanks, 
Tuesday, November 18, 14
Why?!? 
Tuesday, November 18, 14
Analyzing 
Tuesday, November 18, 14
Reporting 
Tuesday, November 18, 14
Tuesday, November 18, 14
• CUBE (Power set/Ring the changes) 
• ROLLUP (Hierarchy) 
• GROUPING SETS (Precision) 
Tuesday, November 18, 14
Shhh. A little code. 
Tuesday, November 18, 14
CREATE TABLE employee ( 
id SERIAL PRIMARY KEY, 
first_name TEXT, 
last_name TEXT 
); 
CREATE TABLE sales ( 
employee_id INTEGER NOT NULL, 
sale_closed TIMESTAMPTZ NOT NULL DEFAULT NOW(), 
sale_amount MONEY, /* We need to do fix this */ 
FOREIGN KEY(employee_id) REFERENCES employee(id) 
); 
Tables 
Tuesday, November 18, 14
Data 
INSERT INTO employee (first_name, last_name) 
VALUES ('Larry', 'Ellison'), 
('Bill', 'Gates'), 
('Vladimir', 'Yulianov'); 
Tuesday, November 18, 14
Moar Data 
INSERT INTO sales 
SELECT 
floor(random()*3)+1, /* Who */ 
'2014-01-01 00:00:00+00'::timestamptz + 
random() * interval '1 year', /* When */ 
(random() * 1000)::numeric(8,2)::MONEY /* ¿Cuando? */ 
FROM generate_series(1,1000); 
Tuesday, November 18, 14
How much did each sell each quarter? 
Tuesday, November 18, 14
SIMPLE! 
Tuesday, November 18, 14
SELECT 
employee_id, 
date_trunc('Quarter', sale_closed) AS "Quarter", 
SUM(sale_amount) 
FROM sales 
GROUP BY 
employee_id, 
date_trunc('Quarter', sale_closed) 
ORDER BY 
employee_id, 
date_trunc('Quarter', sale_closed); 
* I left out some formatting. 
Tuesday, November 18, 14
Results: 
!"""""""""""""#"""""""""#""""""""""""$ 
% employee_id % Quarter % sum % 
&"""""""""""""'"""""""""'""""""""""""( 
% 1 % 2014-Q1 % $42,227.43 % 
% 1 % 2014-Q2 % $42,974.71 % 
% 1 % 2014-Q3 % $41,364.66 % 
% 1 % 2014-Q4 % $33,910.34 % 
% 2 % 2014-Q1 % $38,733.24 % 
% 2 % 2014-Q2 % $40,480.96 % 
% 2 % 2014-Q3 % $43,875.72 % 
% 2 % 2014-Q4 % $42,041.28 % 
% 3 % 2014-Q1 % $45,351.14 % 
% 3 % 2014-Q2 % $36,672.08 % 
% 3 % 2014-Q3 % $33,468.46 % 
% 3 % 2014-Q4 % $42,793.36 % 
)"""""""""""""*"""""""""*""""""""""""+ 
(12 rows) 
Tuesday, November 18, 14
That's nice, BUT 
(We all grimace when we hear that) 
Tuesday, November 18, 14
How about annual totals? 
Tuesday, November 18, 14
Old way: 
UNION ALL 
Tuesday, November 18, 14
( 
SELECT employee_id, to_char(date_trunc('Quarter', sale_closed), 
'YYYY-"Q"Q') AS "Quarter", sum(sale_amount) 
FROM sales 
GROUP BY employee_id, date_trunc('Quarter', sale_closed) 
ORDER BY employee_id, date_trunc('Quarter', sale_closed) 
) 
UNION ALL 
( 
SELECT employee_id, to_char(date_trunc('Year', sale_closed), 
'YYYY') AS "Year", sum(sale_amount) 
FROM sales 
GROUP BY employee_id, date_trunc('Year', sale_closed) 
ORDER BY employee_id, date_trunc('Year', sale_closed) 
); 
Still Doable...Kinda 
Tuesday, November 18, 14
Results 
!"""""""""""""#"""""""""#"""""""""""""$ 
% employee_id % Quarter % sum % 
&"""""""""""""'"""""""""'"""""""""""""( 
% 1 % 2014-Q1 % $42,227.43 % 
% 1 % 2014-Q2 % $42,974.71 % 
% 1 % 2014-Q3 % $41,364.66 % 
% 1 % 2014-Q4 % $33,910.34 % 
% 2 % 2014-Q1 % $38,733.24 % 
% 2 % 2014-Q2 % $40,480.96 % 
% 2 % 2014-Q3 % $43,875.72 % 
% 2 % 2014-Q4 % $42,041.28 % 
% 3 % 2014-Q1 % $45,351.14 % 
% 3 % 2014-Q2 % $36,672.08 % 
% 3 % 2014-Q3 % $33,468.46 % 
% 3 % 2014-Q4 % $42,793.36 % 
% 1 % 2014 % $160,477.14 % 
% 2 % 2014 % $165,131.20 % 
% 3 % 2014 % $158,285.04 % 
)"""""""""""""*"""""""""*"""""""""""""+ 
(15 rows) 
Tuesday, November 18, 14
That's nice, BUT 
Tuesday, November 18, 14
Can't we look at each sales rep 
with each of their quarterly 
totals? 
Tuesday, November 18, 14
ARGHH!!!!!! 
Tuesday, November 18, 14
Tuesday, November 18, 14
These requests are reasonable! 
Tuesday, November 18, 14
But the code...not so much. 
Tuesday, November 18, 14
Take it from the top! 
Tuesday, November 18, 14
CUBE...ring the changes... 
Tuesday, November 18, 14
Quick stare 
SELECT 
employee_id, 
to_char( 
date_trunc('Quarter', sale_closed), 
'YYYY-"Q"Q' 
) AS "Quarter", 
sum(sale_amount) 
FROM sales 
GROUP BY CUBE ( 
employee_id, 
date_trunc('Quarter', sale_closed) 
) 
ORDER BY employee_id, date_trunc('Quarter', sale_closed); 
Tuesday, November 18, 14
Results: 
!"""""""""""""#"""""""""#"""""""""""""$ 
% employee_id % Quarter % sum % 
&"""""""""""""'"""""""""'"""""""""""""( 
% 1 % 2014-Q1 % $42,227.43 % 
% 1 % 2014-Q2 % $42,974.71 % 
% 1 % 2014-Q3 % $41,364.66 % 
% 1 % 2014-Q4 % $33,910.34 % 
% 1 % % $160,477.14 % 
% 2 % 2014-Q1 % $38,733.24 % 
% 2 % 2014-Q2 % $40,480.96 % 
% 2 % 2014-Q3 % $43,875.72 % 
% 2 % 2014-Q4 % $42,041.28 % 
% 2 % % $165,131.20 % 
% 3 % 2014-Q1 % $45,351.14 % 
% 3 % 2014-Q2 % $36,672.08 % 
% 3 % 2014-Q3 % $33,468.46 % 
% 3 % 2014-Q4 % $42,793.36 % 
% 3 % % $158,285.04 % 
% % 2014-Q1 % $126,311.81 % 
% % 2014-Q2 % $120,127.75 % 
% % 2014-Q3 % $118,708.84 % 
% % 2014-Q4 % $118,744.98 % 
% % % $483,893.38 % 
)"""""""""""""*"""""""""*"""""""""""""+ 
(20 rows) 
Tuesday, November 18, 14
That's nice, BUT 
Tuesday, November 18, 14
We don't care 
about undifferentiated 
quarterly totals. 
Tuesday, November 18, 14
Results: 
!"""""""""""""#"""""""""#"""""""""""""$ 
% employee_id % Quarter % sum % 
&"""""""""""""'"""""""""'"""""""""""""( 
% 1 % 2014-Q1 % $42,227.43 % 
% 1 % 2014-Q2 % $42,974.71 % 
% 1 % 2014-Q3 % $41,364.66 % 
% 1 % 2014-Q4 % $33,910.34 % 
% 1 % % $160,477.14 % 
% 2 % 2014-Q1 % $38,733.24 % 
% 2 % 2014-Q2 % $40,480.96 % 
% 2 % 2014-Q3 % $43,875.72 % 
% 2 % 2014-Q4 % $42,041.28 % 
% 2 % % $165,131.20 % 
% 3 % 2014-Q1 % $45,351.14 % 
% 3 % 2014-Q2 % $36,672.08 % 
% 3 % 2014-Q3 % $33,468.46 % 
% 3 % 2014-Q4 % $42,793.36 % 
% 3 % % $158,285.04 % 
% % 2014-Q1 % $126,311.81 % 
% % 2014-Q2 % $120,127.75 % 
% % 2014-Q3 % $118,708.84 % 
% % 2014-Q4 % $118,744.98 % 
% % % $483,893.38 % 
)"""""""""""""*"""""""""*"""""""""""""+ 
(20 rows) 
Tuesday, November 18, 14
ROLLUP...hierarchy... 
Tuesday, November 18, 14
Let's try that! 
Tuesday, November 18, 14
SELECT 
employee_id, 
to_char( 
date_trunc('Quarter', sale_closed), 
'YYYY-"Q"Q' 
) AS "Quarter", 
sum(sale_amount) 
FROM sales 
GROUP BY ROLLUP( 
employee_id, 
date_trunc('Quarter', sale_closed) 
) 
ORDER BY 
employee_id, 
date_trunc('Quarter', sale_closed); 
Tuesday, November 18, 14
Hmmm... 
!"""""""""""""#"""""""""#"""""""""""""$ 
% employee_id % Quarter % sum % 
&"""""""""""""'"""""""""'"""""""""""""( 
% 1 % 2014-Q1 % $42,227.43 % 
% 1 % 2014-Q2 % $42,974.71 % 
% 1 % 2014-Q3 % $41,364.66 % 
% 1 % 2014-Q4 % $33,910.34 % 
% 1 % % $160,477.14 % 
% 2 % 2014-Q1 % $38,733.24 % 
% 2 % 2014-Q2 % $40,480.96 % 
% 2 % 2014-Q3 % $43,875.72 % 
% 2 % 2014-Q4 % $42,041.28 % 
% 2 % % $165,131.20 % 
% 3 % 2014-Q1 % $45,351.14 % 
% 3 % 2014-Q2 % $36,672.08 % 
% 3 % 2014-Q3 % $33,468.46 % 
% 3 % 2014-Q4 % $42,793.36 % 
% 3 % % $158,285.04 % 
% % % $483,893.38 % 
)"""""""""""""*"""""""""*"""""""""""""+ 
(16 rows) 
Tuesday, November 18, 14
That's nice, BUT 
Tuesday, November 18, 14
There was an extra line. 
Tuesday, November 18, 14
!"""""""""""""#"""""""""#"""""""""""""$ 
% employee_id % Quarter % sum % 
&"""""""""""""'"""""""""'"""""""""""""( 
% 1 % 2014-Q1 % $42,227.43 % 
% 1 % 2014-Q2 % $42,974.71 % 
% 1 % 2014-Q3 % $41,364.66 % 
% 1 % 2014-Q4 % $33,910.34 % 
% 1 % % $160,477.14 % 
% 2 % 2014-Q1 % $38,733.24 % 
% 2 % 2014-Q2 % $40,480.96 % 
% 2 % 2014-Q3 % $43,875.72 % 
% 2 % 2014-Q4 % $42,041.28 % 
% 2 % % $165,131.20 % 
% 3 % 2014-Q1 % $45,351.14 % 
% 3 % 2014-Q2 % $36,672.08 % 
% 3 % 2014-Q3 % $33,468.46 % 
% 3 % 2014-Q4 % $42,793.36 % 
% 3 % % $158,285.04 % 
% % % $483,893.38 % 
)"""""""""""""*"""""""""*"""""""""""""+ 
(16 rows) 
Tuesday, November 18, 14
Hierarchies: 
Top to Bottom 
Tuesday, November 18, 14
We didn't want the top. 
Tuesday, November 18, 14
GROUPING SETS... 
Precision 
Tuesday, November 18, 14
SELECT 
employee_id, 
to_char( 
date_trunc('Quarter', sale_closed), 
'YYYY-"Q"Q' 
) AS "Quarter", 
sum(sale_amount) 
FROM sales 
GROUP BY GROUPING SETS( 
(employee_id, date_trunc('Quarter', sale_closed)), 
(employee_id) 
) 
ORDER BY employee_id, date_trunc('Quarter', sale_closed); 
Tuesday, November 18, 14
Results: 
!"""""""""""""#"""""""""#"""""""""""""$ 
% employee_id % Quarter % sum % 
&"""""""""""""'"""""""""'"""""""""""""( 
% 1 % 2014-Q1 % $42,227.43 % 
% 1 % 2014-Q2 % $42,974.71 % 
% 1 % 2014-Q3 % $41,364.66 % 
% 1 % 2014-Q4 % $33,910.34 % 
% 1 % % $160,477.14 % 
% 2 % 2014-Q1 % $38,733.24 % 
% 2 % 2014-Q2 % $40,480.96 % 
% 2 % 2014-Q3 % $43,875.72 % 
% 2 % 2014-Q4 % $42,041.28 % 
% 2 % % $165,131.20 % 
% 3 % 2014-Q1 % $45,351.14 % 
% 3 % 2014-Q2 % $36,672.08 % 
% 3 % 2014-Q3 % $33,468.46 % 
% 3 % 2014-Q4 % $42,793.36 % 
% 3 % % $158,285.04 % 
)"""""""""""""*"""""""""*"""""""""""""+ 
(15 rows) 
Tuesday, November 18, 14
There we go! 
Tuesday, November 18, 14
HOW?!? 
Tuesday, November 18, 14
Extant Planner/Executor 
Tuesday, November 18, 14
Extant Planner/Executor 
•HashAgg 
Tuesday, November 18, 14
Extant Planner/Executor 
•HashAgg 
•GroupAgg 
Tuesday, November 18, 14
HashAgg 
Result Group Intermediate State 
Tuesday, November 18, 14
HashAgg 
• One pass: 
• Update hash value for each row 
• Output final value at the end 
Tuesday, November 18, 14
HashAgg 
• Not yet in GROUPING SETS 
• Algorithmic speedup opportunity: 
• O(n) vs. O(n log n) 
Tuesday, November 18, 14
HashAgg-- :-( 
• Non-hashable data types 
• Aggregate functions with LOTS of state 
• Ordered aggs 
• Distinct aggs 
• No spill-to-disk 
Tuesday, November 18, 14
GroupAgg 
• Sorts all input to the agg node to 
• Detect group boundary 
• Output that group 
• Results before end-of-scan 
Tuesday, November 18, 14
Phase I 
Tuesday, November 18, 14
GroupAgg for ROLLUP 
Tuesday, November 18, 14
GroupAgg for ROLLUP 
• Sort for the heirarchy 
Tuesday, November 18, 14
GroupAgg for ROLLUP 
• Sort for the heirarchy 
• Output results at each boundary 
Tuesday, November 18, 14
GroupAgg for ROLLUP 
• Sort for the heirarchy 
• Output results at each boundary 
• k for the price of one! 
Tuesday, November 18, 14
Phase II 
Tuesday, November 18, 14
GroupAgg !ROLLUP 
Tuesday, November 18, 14
GroupAgg !ROLLUP 
Tuesday, November 18, 14
GroupAgg !ROLLUP 
• Re-plan input to sort with >1 order 
Tuesday, November 18, 14
GroupAgg !ROLLUP 
• Re-plan input to sort with >1 order 
• Plan keeps tons of global state 
Tuesday, November 18, 14
GroupAgg !ROLLUP 
• Re-plan input to sort with >1 order 
• Plan keeps tons of global state 
• Does NOT like to be called >1x/plan 
Tuesday, November 18, 14
Tuesday, November 18, 14
GROUPING SETS ~ 
WINDOW 
Tuesday, November 18, 14
WINDOW 
implementation 
Tuesday, November 18, 14
Shuffle a deck of WindowAgg and Sort nodes. 
Tuesday, November 18, 14
WindowAgg → Sort → WindowAgg → Sort ... 
Tuesday, November 18, 14
Similar pattern 
Tuesday, November 18, 14
Tuesday, November 18, 14
• Expand all GROUPING SETS 
Tuesday, November 18, 14
• Expand all GROUPING SETS 
• Arrange into fewest ROLLUPs 
Tuesday, November 18, 14
• Expand all GROUPING SETS 
• Arrange into fewest ROLLUPs 
• Shuffle Sort and ChainAgg 
Tuesday, November 18, 14
GroupAgg → 
Sort → 
ChainAgg → 
Sort → 
(input data) 
Tuesday, November 18, 14
ChainAgg?!? 
Tuesday, November 18, 14
ChainAgg Nodes 
• Pass input state through unchanged 
• Update aggregate state 
• Put rows into a chain-wide shared 
tuplestore when they hit a group boundary 
Tuesday, November 18, 14
The Last GroupAgg 
• Produces its normal output until end-of-data 
• Outputs the shared tuplestore 
Tuesday, November 18, 14
Phase III 
Tuesday, November 18, 14
Future 
Tuesday, November 18, 14
• HashAgg 
• Alone? 
• With ChainAggs? 
• Agg Associativity (A + B) + C = A + (B + C) 
• Make CUBE a reserved word? 
Tuesday, November 18, 14
Questions? 
Comments? 
Tuesday, November 18, 14
Thanks! 
SFPUG 2014/11/18 
Copyright© 2014 
David Fetter 
Tuesday, November 18, 14

More Related Content

More from David Fetter

PostgreSQL Hooks for Fun and Profit
PostgreSQL Hooks for Fun and ProfitPostgreSQL Hooks for Fun and Profit
PostgreSQL Hooks for Fun and Profit
David Fetter
 
Tree tricks osdc_melbourne_20101124
Tree tricks osdc_melbourne_20101124Tree tricks osdc_melbourne_20101124
Tree tricks osdc_melbourne_20101124
David Fetter
 
Rdbms roadmap 20140130
Rdbms roadmap 20140130Rdbms roadmap 20140130
Rdbms roadmap 20140130David Fetter
 
Slides pg conf_eu_20131031
Slides pg conf_eu_20131031Slides pg conf_eu_20131031
Slides pg conf_eu_20131031David Fetter
 
Federation with foreign_data_wrappers_pg_conf_eu_20131031
Federation with foreign_data_wrappers_pg_conf_eu_20131031Federation with foreign_data_wrappers_pg_conf_eu_20131031
Federation with foreign_data_wrappers_pg_conf_eu_20131031David Fetter
 
Intergalactic data speak_highload++_20131028
Intergalactic data speak_highload++_20131028Intergalactic data speak_highload++_20131028
Intergalactic data speak_highload++_20131028
David Fetter
 
G so c_and_commitfests_and_pointy_hair_oh_my_sfpug_20131008
G so c_and_commitfests_and_pointy_hair_oh_my_sfpug_20131008G so c_and_commitfests_and_pointy_hair_oh_my_sfpug_20131008
G so c_and_commitfests_and_pointy_hair_oh_my_sfpug_20131008David Fetter
 
Ct es past_present_future_nycpgday_20130322
Ct es past_present_future_nycpgday_20130322Ct es past_present_future_nycpgday_20130322
Ct es past_present_future_nycpgday_20130322David Fetter
 
Universal data access_with_sql_med
Universal data access_with_sql_medUniversal data access_with_sql_med
Universal data access_with_sql_medDavid Fetter
 
Lightning sf perl_mongers_20120327
Lightning sf perl_mongers_20120327Lightning sf perl_mongers_20120327
Lightning sf perl_mongers_20120327David Fetter
 
Threat modeling sf_perl_mongers_20130227
Threat modeling sf_perl_mongers_20130227Threat modeling sf_perl_mongers_20130227
Threat modeling sf_perl_mongers_20130227David Fetter
 
Security revolutionized fosdem_20120205
Security revolutionized fosdem_20120205Security revolutionized fosdem_20120205
Security revolutionized fosdem_20120205David Fetter
 
Writeable ct es_pgcon_may_2011
Writeable ct es_pgcon_may_2011Writeable ct es_pgcon_may_2011
Writeable ct es_pgcon_may_2011
David Fetter
 
View triggers pg_east_20110325
View triggers pg_east_20110325View triggers pg_east_20110325
View triggers pg_east_20110325
David Fetter
 
PL/Parrot San Francisco Perl Mongers 2010/05/25
PL/Parrot San Francisco Perl Mongers 2010/05/25PL/Parrot San Francisco Perl Mongers 2010/05/25
PL/Parrot San Francisco Perl Mongers 2010/05/25David Fetter
 

More from David Fetter (15)

PostgreSQL Hooks for Fun and Profit
PostgreSQL Hooks for Fun and ProfitPostgreSQL Hooks for Fun and Profit
PostgreSQL Hooks for Fun and Profit
 
Tree tricks osdc_melbourne_20101124
Tree tricks osdc_melbourne_20101124Tree tricks osdc_melbourne_20101124
Tree tricks osdc_melbourne_20101124
 
Rdbms roadmap 20140130
Rdbms roadmap 20140130Rdbms roadmap 20140130
Rdbms roadmap 20140130
 
Slides pg conf_eu_20131031
Slides pg conf_eu_20131031Slides pg conf_eu_20131031
Slides pg conf_eu_20131031
 
Federation with foreign_data_wrappers_pg_conf_eu_20131031
Federation with foreign_data_wrappers_pg_conf_eu_20131031Federation with foreign_data_wrappers_pg_conf_eu_20131031
Federation with foreign_data_wrappers_pg_conf_eu_20131031
 
Intergalactic data speak_highload++_20131028
Intergalactic data speak_highload++_20131028Intergalactic data speak_highload++_20131028
Intergalactic data speak_highload++_20131028
 
G so c_and_commitfests_and_pointy_hair_oh_my_sfpug_20131008
G so c_and_commitfests_and_pointy_hair_oh_my_sfpug_20131008G so c_and_commitfests_and_pointy_hair_oh_my_sfpug_20131008
G so c_and_commitfests_and_pointy_hair_oh_my_sfpug_20131008
 
Ct es past_present_future_nycpgday_20130322
Ct es past_present_future_nycpgday_20130322Ct es past_present_future_nycpgday_20130322
Ct es past_present_future_nycpgday_20130322
 
Universal data access_with_sql_med
Universal data access_with_sql_medUniversal data access_with_sql_med
Universal data access_with_sql_med
 
Lightning sf perl_mongers_20120327
Lightning sf perl_mongers_20120327Lightning sf perl_mongers_20120327
Lightning sf perl_mongers_20120327
 
Threat modeling sf_perl_mongers_20130227
Threat modeling sf_perl_mongers_20130227Threat modeling sf_perl_mongers_20130227
Threat modeling sf_perl_mongers_20130227
 
Security revolutionized fosdem_20120205
Security revolutionized fosdem_20120205Security revolutionized fosdem_20120205
Security revolutionized fosdem_20120205
 
Writeable ct es_pgcon_may_2011
Writeable ct es_pgcon_may_2011Writeable ct es_pgcon_may_2011
Writeable ct es_pgcon_may_2011
 
View triggers pg_east_20110325
View triggers pg_east_20110325View triggers pg_east_20110325
View triggers pg_east_20110325
 
PL/Parrot San Francisco Perl Mongers 2010/05/25
PL/Parrot San Francisco Perl Mongers 2010/05/25PL/Parrot San Francisco Perl Mongers 2010/05/25
PL/Parrot San Francisco Perl Mongers 2010/05/25
 

Recently uploaded

Data_and_Analytics_Essentials_Architect_an_Analytics_Platform.pptx
Data_and_Analytics_Essentials_Architect_an_Analytics_Platform.pptxData_and_Analytics_Essentials_Architect_an_Analytics_Platform.pptx
Data_and_Analytics_Essentials_Architect_an_Analytics_Platform.pptx
AnirbanRoy608946
 
一比一原版(UofS毕业证书)萨省大学毕业证如何办理
一比一原版(UofS毕业证书)萨省大学毕业证如何办理一比一原版(UofS毕业证书)萨省大学毕业证如何办理
一比一原版(UofS毕业证书)萨省大学毕业证如何办理
v3tuleee
 
Algorithmic optimizations for Dynamic Levelwise PageRank (from STICD) : SHORT...
Algorithmic optimizations for Dynamic Levelwise PageRank (from STICD) : SHORT...Algorithmic optimizations for Dynamic Levelwise PageRank (from STICD) : SHORT...
Algorithmic optimizations for Dynamic Levelwise PageRank (from STICD) : SHORT...
Subhajit Sahu
 
一比一原版(UniSA毕业证书)南澳大学毕业证如何办理
一比一原版(UniSA毕业证书)南澳大学毕业证如何办理一比一原版(UniSA毕业证书)南澳大学毕业证如何办理
一比一原版(UniSA毕业证书)南澳大学毕业证如何办理
slg6lamcq
 
Adjusting OpenMP PageRank : SHORT REPORT / NOTES
Adjusting OpenMP PageRank : SHORT REPORT / NOTESAdjusting OpenMP PageRank : SHORT REPORT / NOTES
Adjusting OpenMP PageRank : SHORT REPORT / NOTES
Subhajit Sahu
 
一比一原版(Dalhousie毕业证书)达尔豪斯大学毕业证如何办理
一比一原版(Dalhousie毕业证书)达尔豪斯大学毕业证如何办理一比一原版(Dalhousie毕业证书)达尔豪斯大学毕业证如何办理
一比一原版(Dalhousie毕业证书)达尔豪斯大学毕业证如何办理
mzpolocfi
 
The Building Blocks of QuestDB, a Time Series Database
The Building Blocks of QuestDB, a Time Series DatabaseThe Building Blocks of QuestDB, a Time Series Database
The Building Blocks of QuestDB, a Time Series Database
javier ramirez
 
Best best suvichar in gujarati english meaning of this sentence as Silk road ...
Best best suvichar in gujarati english meaning of this sentence as Silk road ...Best best suvichar in gujarati english meaning of this sentence as Silk road ...
Best best suvichar in gujarati english meaning of this sentence as Silk road ...
AbhimanyuSinha9
 
Levelwise PageRank with Loop-Based Dead End Handling Strategy : SHORT REPORT ...
Levelwise PageRank with Loop-Based Dead End Handling Strategy : SHORT REPORT ...Levelwise PageRank with Loop-Based Dead End Handling Strategy : SHORT REPORT ...
Levelwise PageRank with Loop-Based Dead End Handling Strategy : SHORT REPORT ...
Subhajit Sahu
 
做(mqu毕业证书)麦考瑞大学毕业证硕士文凭证书学费发票原版一模一样
做(mqu毕业证书)麦考瑞大学毕业证硕士文凭证书学费发票原版一模一样做(mqu毕业证书)麦考瑞大学毕业证硕士文凭证书学费发票原版一模一样
做(mqu毕业证书)麦考瑞大学毕业证硕士文凭证书学费发票原版一模一样
axoqas
 
Analysis insight about a Flyball dog competition team's performance
Analysis insight about a Flyball dog competition team's performanceAnalysis insight about a Flyball dog competition team's performance
Analysis insight about a Flyball dog competition team's performance
roli9797
 
一比一原版(Adelaide毕业证书)阿德莱德大学毕业证如何办理
一比一原版(Adelaide毕业证书)阿德莱德大学毕业证如何办理一比一原版(Adelaide毕业证书)阿德莱德大学毕业证如何办理
一比一原版(Adelaide毕业证书)阿德莱德大学毕业证如何办理
slg6lamcq
 
一比一原版(Deakin毕业证书)迪肯大学毕业证如何办理
一比一原版(Deakin毕业证书)迪肯大学毕业证如何办理一比一原版(Deakin毕业证书)迪肯大学毕业证如何办理
一比一原版(Deakin毕业证书)迪肯大学毕业证如何办理
oz8q3jxlp
 
Chatty Kathy - UNC Bootcamp Final Project Presentation - Final Version - 5.23...
Chatty Kathy - UNC Bootcamp Final Project Presentation - Final Version - 5.23...Chatty Kathy - UNC Bootcamp Final Project Presentation - Final Version - 5.23...
Chatty Kathy - UNC Bootcamp Final Project Presentation - Final Version - 5.23...
John Andrews
 
原版制作(swinburne毕业证书)斯威本科技大学毕业证毕业完成信一模一样
原版制作(swinburne毕业证书)斯威本科技大学毕业证毕业完成信一模一样原版制作(swinburne毕业证书)斯威本科技大学毕业证毕业完成信一模一样
原版制作(swinburne毕业证书)斯威本科技大学毕业证毕业完成信一模一样
u86oixdj
 
Adjusting primitives for graph : SHORT REPORT / NOTES
Adjusting primitives for graph : SHORT REPORT / NOTESAdjusting primitives for graph : SHORT REPORT / NOTES
Adjusting primitives for graph : SHORT REPORT / NOTES
Subhajit Sahu
 
Unleashing the Power of Data_ Choosing a Trusted Analytics Platform.pdf
Unleashing the Power of Data_ Choosing a Trusted Analytics Platform.pdfUnleashing the Power of Data_ Choosing a Trusted Analytics Platform.pdf
Unleashing the Power of Data_ Choosing a Trusted Analytics Platform.pdf
Enterprise Wired
 
一比一原版(UIUC毕业证)伊利诺伊大学|厄巴纳-香槟分校毕业证如何办理
一比一原版(UIUC毕业证)伊利诺伊大学|厄巴纳-香槟分校毕业证如何办理一比一原版(UIUC毕业证)伊利诺伊大学|厄巴纳-香槟分校毕业证如何办理
一比一原版(UIUC毕业证)伊利诺伊大学|厄巴纳-香槟分校毕业证如何办理
ahzuo
 
Everything you wanted to know about LIHTC
Everything you wanted to know about LIHTCEverything you wanted to know about LIHTC
Everything you wanted to know about LIHTC
Roger Valdez
 
Enhanced Enterprise Intelligence with your personal AI Data Copilot.pdf
Enhanced Enterprise Intelligence with your personal AI Data Copilot.pdfEnhanced Enterprise Intelligence with your personal AI Data Copilot.pdf
Enhanced Enterprise Intelligence with your personal AI Data Copilot.pdf
GetInData
 

Recently uploaded (20)

Data_and_Analytics_Essentials_Architect_an_Analytics_Platform.pptx
Data_and_Analytics_Essentials_Architect_an_Analytics_Platform.pptxData_and_Analytics_Essentials_Architect_an_Analytics_Platform.pptx
Data_and_Analytics_Essentials_Architect_an_Analytics_Platform.pptx
 
一比一原版(UofS毕业证书)萨省大学毕业证如何办理
一比一原版(UofS毕业证书)萨省大学毕业证如何办理一比一原版(UofS毕业证书)萨省大学毕业证如何办理
一比一原版(UofS毕业证书)萨省大学毕业证如何办理
 
Algorithmic optimizations for Dynamic Levelwise PageRank (from STICD) : SHORT...
Algorithmic optimizations for Dynamic Levelwise PageRank (from STICD) : SHORT...Algorithmic optimizations for Dynamic Levelwise PageRank (from STICD) : SHORT...
Algorithmic optimizations for Dynamic Levelwise PageRank (from STICD) : SHORT...
 
一比一原版(UniSA毕业证书)南澳大学毕业证如何办理
一比一原版(UniSA毕业证书)南澳大学毕业证如何办理一比一原版(UniSA毕业证书)南澳大学毕业证如何办理
一比一原版(UniSA毕业证书)南澳大学毕业证如何办理
 
Adjusting OpenMP PageRank : SHORT REPORT / NOTES
Adjusting OpenMP PageRank : SHORT REPORT / NOTESAdjusting OpenMP PageRank : SHORT REPORT / NOTES
Adjusting OpenMP PageRank : SHORT REPORT / NOTES
 
一比一原版(Dalhousie毕业证书)达尔豪斯大学毕业证如何办理
一比一原版(Dalhousie毕业证书)达尔豪斯大学毕业证如何办理一比一原版(Dalhousie毕业证书)达尔豪斯大学毕业证如何办理
一比一原版(Dalhousie毕业证书)达尔豪斯大学毕业证如何办理
 
The Building Blocks of QuestDB, a Time Series Database
The Building Blocks of QuestDB, a Time Series DatabaseThe Building Blocks of QuestDB, a Time Series Database
The Building Blocks of QuestDB, a Time Series Database
 
Best best suvichar in gujarati english meaning of this sentence as Silk road ...
Best best suvichar in gujarati english meaning of this sentence as Silk road ...Best best suvichar in gujarati english meaning of this sentence as Silk road ...
Best best suvichar in gujarati english meaning of this sentence as Silk road ...
 
Levelwise PageRank with Loop-Based Dead End Handling Strategy : SHORT REPORT ...
Levelwise PageRank with Loop-Based Dead End Handling Strategy : SHORT REPORT ...Levelwise PageRank with Loop-Based Dead End Handling Strategy : SHORT REPORT ...
Levelwise PageRank with Loop-Based Dead End Handling Strategy : SHORT REPORT ...
 
做(mqu毕业证书)麦考瑞大学毕业证硕士文凭证书学费发票原版一模一样
做(mqu毕业证书)麦考瑞大学毕业证硕士文凭证书学费发票原版一模一样做(mqu毕业证书)麦考瑞大学毕业证硕士文凭证书学费发票原版一模一样
做(mqu毕业证书)麦考瑞大学毕业证硕士文凭证书学费发票原版一模一样
 
Analysis insight about a Flyball dog competition team's performance
Analysis insight about a Flyball dog competition team's performanceAnalysis insight about a Flyball dog competition team's performance
Analysis insight about a Flyball dog competition team's performance
 
一比一原版(Adelaide毕业证书)阿德莱德大学毕业证如何办理
一比一原版(Adelaide毕业证书)阿德莱德大学毕业证如何办理一比一原版(Adelaide毕业证书)阿德莱德大学毕业证如何办理
一比一原版(Adelaide毕业证书)阿德莱德大学毕业证如何办理
 
一比一原版(Deakin毕业证书)迪肯大学毕业证如何办理
一比一原版(Deakin毕业证书)迪肯大学毕业证如何办理一比一原版(Deakin毕业证书)迪肯大学毕业证如何办理
一比一原版(Deakin毕业证书)迪肯大学毕业证如何办理
 
Chatty Kathy - UNC Bootcamp Final Project Presentation - Final Version - 5.23...
Chatty Kathy - UNC Bootcamp Final Project Presentation - Final Version - 5.23...Chatty Kathy - UNC Bootcamp Final Project Presentation - Final Version - 5.23...
Chatty Kathy - UNC Bootcamp Final Project Presentation - Final Version - 5.23...
 
原版制作(swinburne毕业证书)斯威本科技大学毕业证毕业完成信一模一样
原版制作(swinburne毕业证书)斯威本科技大学毕业证毕业完成信一模一样原版制作(swinburne毕业证书)斯威本科技大学毕业证毕业完成信一模一样
原版制作(swinburne毕业证书)斯威本科技大学毕业证毕业完成信一模一样
 
Adjusting primitives for graph : SHORT REPORT / NOTES
Adjusting primitives for graph : SHORT REPORT / NOTESAdjusting primitives for graph : SHORT REPORT / NOTES
Adjusting primitives for graph : SHORT REPORT / NOTES
 
Unleashing the Power of Data_ Choosing a Trusted Analytics Platform.pdf
Unleashing the Power of Data_ Choosing a Trusted Analytics Platform.pdfUnleashing the Power of Data_ Choosing a Trusted Analytics Platform.pdf
Unleashing the Power of Data_ Choosing a Trusted Analytics Platform.pdf
 
一比一原版(UIUC毕业证)伊利诺伊大学|厄巴纳-香槟分校毕业证如何办理
一比一原版(UIUC毕业证)伊利诺伊大学|厄巴纳-香槟分校毕业证如何办理一比一原版(UIUC毕业证)伊利诺伊大学|厄巴纳-香槟分校毕业证如何办理
一比一原版(UIUC毕业证)伊利诺伊大学|厄巴纳-香槟分校毕业证如何办理
 
Everything you wanted to know about LIHTC
Everything you wanted to know about LIHTCEverything you wanted to know about LIHTC
Everything you wanted to know about LIHTC
 
Enhanced Enterprise Intelligence with your personal AI Data Copilot.pdf
Enhanced Enterprise Intelligence with your personal AI Data Copilot.pdfEnhanced Enterprise Intelligence with your personal AI Data Copilot.pdf
Enhanced Enterprise Intelligence with your personal AI Data Copilot.pdf
 

Grouping sets sfpug_20141118

  • 1. GROUPING SETS CCUBE, ROLLUP, and Friends SFPUG 2014/11/18 Copyright© 2014 David Fetter Tuesday, November 18, 14
  • 7. • CUBE (Power set/Ring the changes) • ROLLUP (Hierarchy) • GROUPING SETS (Precision) Tuesday, November 18, 14
  • 8. Shhh. A little code. Tuesday, November 18, 14
  • 9. CREATE TABLE employee ( id SERIAL PRIMARY KEY, first_name TEXT, last_name TEXT ); CREATE TABLE sales ( employee_id INTEGER NOT NULL, sale_closed TIMESTAMPTZ NOT NULL DEFAULT NOW(), sale_amount MONEY, /* We need to do fix this */ FOREIGN KEY(employee_id) REFERENCES employee(id) ); Tables Tuesday, November 18, 14
  • 10. Data INSERT INTO employee (first_name, last_name) VALUES ('Larry', 'Ellison'), ('Bill', 'Gates'), ('Vladimir', 'Yulianov'); Tuesday, November 18, 14
  • 11. Moar Data INSERT INTO sales SELECT floor(random()*3)+1, /* Who */ '2014-01-01 00:00:00+00'::timestamptz + random() * interval '1 year', /* When */ (random() * 1000)::numeric(8,2)::MONEY /* ¿Cuando? */ FROM generate_series(1,1000); Tuesday, November 18, 14
  • 12. How much did each sell each quarter? Tuesday, November 18, 14
  • 14. SELECT employee_id, date_trunc('Quarter', sale_closed) AS "Quarter", SUM(sale_amount) FROM sales GROUP BY employee_id, date_trunc('Quarter', sale_closed) ORDER BY employee_id, date_trunc('Quarter', sale_closed); * I left out some formatting. Tuesday, November 18, 14
  • 15. Results: !"""""""""""""#"""""""""#""""""""""""$ % employee_id % Quarter % sum % &"""""""""""""'"""""""""'""""""""""""( % 1 % 2014-Q1 % $42,227.43 % % 1 % 2014-Q2 % $42,974.71 % % 1 % 2014-Q3 % $41,364.66 % % 1 % 2014-Q4 % $33,910.34 % % 2 % 2014-Q1 % $38,733.24 % % 2 % 2014-Q2 % $40,480.96 % % 2 % 2014-Q3 % $43,875.72 % % 2 % 2014-Q4 % $42,041.28 % % 3 % 2014-Q1 % $45,351.14 % % 3 % 2014-Q2 % $36,672.08 % % 3 % 2014-Q3 % $33,468.46 % % 3 % 2014-Q4 % $42,793.36 % )"""""""""""""*"""""""""*""""""""""""+ (12 rows) Tuesday, November 18, 14
  • 16. That's nice, BUT (We all grimace when we hear that) Tuesday, November 18, 14
  • 17. How about annual totals? Tuesday, November 18, 14
  • 18. Old way: UNION ALL Tuesday, November 18, 14
  • 19. ( SELECT employee_id, to_char(date_trunc('Quarter', sale_closed), 'YYYY-"Q"Q') AS "Quarter", sum(sale_amount) FROM sales GROUP BY employee_id, date_trunc('Quarter', sale_closed) ORDER BY employee_id, date_trunc('Quarter', sale_closed) ) UNION ALL ( SELECT employee_id, to_char(date_trunc('Year', sale_closed), 'YYYY') AS "Year", sum(sale_amount) FROM sales GROUP BY employee_id, date_trunc('Year', sale_closed) ORDER BY employee_id, date_trunc('Year', sale_closed) ); Still Doable...Kinda Tuesday, November 18, 14
  • 20. Results !"""""""""""""#"""""""""#"""""""""""""$ % employee_id % Quarter % sum % &"""""""""""""'"""""""""'"""""""""""""( % 1 % 2014-Q1 % $42,227.43 % % 1 % 2014-Q2 % $42,974.71 % % 1 % 2014-Q3 % $41,364.66 % % 1 % 2014-Q4 % $33,910.34 % % 2 % 2014-Q1 % $38,733.24 % % 2 % 2014-Q2 % $40,480.96 % % 2 % 2014-Q3 % $43,875.72 % % 2 % 2014-Q4 % $42,041.28 % % 3 % 2014-Q1 % $45,351.14 % % 3 % 2014-Q2 % $36,672.08 % % 3 % 2014-Q3 % $33,468.46 % % 3 % 2014-Q4 % $42,793.36 % % 1 % 2014 % $160,477.14 % % 2 % 2014 % $165,131.20 % % 3 % 2014 % $158,285.04 % )"""""""""""""*"""""""""*"""""""""""""+ (15 rows) Tuesday, November 18, 14
  • 21. That's nice, BUT Tuesday, November 18, 14
  • 22. Can't we look at each sales rep with each of their quarterly totals? Tuesday, November 18, 14
  • 25. These requests are reasonable! Tuesday, November 18, 14
  • 26. But the code...not so much. Tuesday, November 18, 14
  • 27. Take it from the top! Tuesday, November 18, 14
  • 28. CUBE...ring the changes... Tuesday, November 18, 14
  • 29. Quick stare SELECT employee_id, to_char( date_trunc('Quarter', sale_closed), 'YYYY-"Q"Q' ) AS "Quarter", sum(sale_amount) FROM sales GROUP BY CUBE ( employee_id, date_trunc('Quarter', sale_closed) ) ORDER BY employee_id, date_trunc('Quarter', sale_closed); Tuesday, November 18, 14
  • 30. Results: !"""""""""""""#"""""""""#"""""""""""""$ % employee_id % Quarter % sum % &"""""""""""""'"""""""""'"""""""""""""( % 1 % 2014-Q1 % $42,227.43 % % 1 % 2014-Q2 % $42,974.71 % % 1 % 2014-Q3 % $41,364.66 % % 1 % 2014-Q4 % $33,910.34 % % 1 % % $160,477.14 % % 2 % 2014-Q1 % $38,733.24 % % 2 % 2014-Q2 % $40,480.96 % % 2 % 2014-Q3 % $43,875.72 % % 2 % 2014-Q4 % $42,041.28 % % 2 % % $165,131.20 % % 3 % 2014-Q1 % $45,351.14 % % 3 % 2014-Q2 % $36,672.08 % % 3 % 2014-Q3 % $33,468.46 % % 3 % 2014-Q4 % $42,793.36 % % 3 % % $158,285.04 % % % 2014-Q1 % $126,311.81 % % % 2014-Q2 % $120,127.75 % % % 2014-Q3 % $118,708.84 % % % 2014-Q4 % $118,744.98 % % % % $483,893.38 % )"""""""""""""*"""""""""*"""""""""""""+ (20 rows) Tuesday, November 18, 14
  • 31. That's nice, BUT Tuesday, November 18, 14
  • 32. We don't care about undifferentiated quarterly totals. Tuesday, November 18, 14
  • 33. Results: !"""""""""""""#"""""""""#"""""""""""""$ % employee_id % Quarter % sum % &"""""""""""""'"""""""""'"""""""""""""( % 1 % 2014-Q1 % $42,227.43 % % 1 % 2014-Q2 % $42,974.71 % % 1 % 2014-Q3 % $41,364.66 % % 1 % 2014-Q4 % $33,910.34 % % 1 % % $160,477.14 % % 2 % 2014-Q1 % $38,733.24 % % 2 % 2014-Q2 % $40,480.96 % % 2 % 2014-Q3 % $43,875.72 % % 2 % 2014-Q4 % $42,041.28 % % 2 % % $165,131.20 % % 3 % 2014-Q1 % $45,351.14 % % 3 % 2014-Q2 % $36,672.08 % % 3 % 2014-Q3 % $33,468.46 % % 3 % 2014-Q4 % $42,793.36 % % 3 % % $158,285.04 % % % 2014-Q1 % $126,311.81 % % % 2014-Q2 % $120,127.75 % % % 2014-Q3 % $118,708.84 % % % 2014-Q4 % $118,744.98 % % % % $483,893.38 % )"""""""""""""*"""""""""*"""""""""""""+ (20 rows) Tuesday, November 18, 14
  • 35. Let's try that! Tuesday, November 18, 14
  • 36. SELECT employee_id, to_char( date_trunc('Quarter', sale_closed), 'YYYY-"Q"Q' ) AS "Quarter", sum(sale_amount) FROM sales GROUP BY ROLLUP( employee_id, date_trunc('Quarter', sale_closed) ) ORDER BY employee_id, date_trunc('Quarter', sale_closed); Tuesday, November 18, 14
  • 37. Hmmm... !"""""""""""""#"""""""""#"""""""""""""$ % employee_id % Quarter % sum % &"""""""""""""'"""""""""'"""""""""""""( % 1 % 2014-Q1 % $42,227.43 % % 1 % 2014-Q2 % $42,974.71 % % 1 % 2014-Q3 % $41,364.66 % % 1 % 2014-Q4 % $33,910.34 % % 1 % % $160,477.14 % % 2 % 2014-Q1 % $38,733.24 % % 2 % 2014-Q2 % $40,480.96 % % 2 % 2014-Q3 % $43,875.72 % % 2 % 2014-Q4 % $42,041.28 % % 2 % % $165,131.20 % % 3 % 2014-Q1 % $45,351.14 % % 3 % 2014-Q2 % $36,672.08 % % 3 % 2014-Q3 % $33,468.46 % % 3 % 2014-Q4 % $42,793.36 % % 3 % % $158,285.04 % % % % $483,893.38 % )"""""""""""""*"""""""""*"""""""""""""+ (16 rows) Tuesday, November 18, 14
  • 38. That's nice, BUT Tuesday, November 18, 14
  • 39. There was an extra line. Tuesday, November 18, 14
  • 40. !"""""""""""""#"""""""""#"""""""""""""$ % employee_id % Quarter % sum % &"""""""""""""'"""""""""'"""""""""""""( % 1 % 2014-Q1 % $42,227.43 % % 1 % 2014-Q2 % $42,974.71 % % 1 % 2014-Q3 % $41,364.66 % % 1 % 2014-Q4 % $33,910.34 % % 1 % % $160,477.14 % % 2 % 2014-Q1 % $38,733.24 % % 2 % 2014-Q2 % $40,480.96 % % 2 % 2014-Q3 % $43,875.72 % % 2 % 2014-Q4 % $42,041.28 % % 2 % % $165,131.20 % % 3 % 2014-Q1 % $45,351.14 % % 3 % 2014-Q2 % $36,672.08 % % 3 % 2014-Q3 % $33,468.46 % % 3 % 2014-Q4 % $42,793.36 % % 3 % % $158,285.04 % % % % $483,893.38 % )"""""""""""""*"""""""""*"""""""""""""+ (16 rows) Tuesday, November 18, 14
  • 41. Hierarchies: Top to Bottom Tuesday, November 18, 14
  • 42. We didn't want the top. Tuesday, November 18, 14
  • 43. GROUPING SETS... Precision Tuesday, November 18, 14
  • 44. SELECT employee_id, to_char( date_trunc('Quarter', sale_closed), 'YYYY-"Q"Q' ) AS "Quarter", sum(sale_amount) FROM sales GROUP BY GROUPING SETS( (employee_id, date_trunc('Quarter', sale_closed)), (employee_id) ) ORDER BY employee_id, date_trunc('Quarter', sale_closed); Tuesday, November 18, 14
  • 45. Results: !"""""""""""""#"""""""""#"""""""""""""$ % employee_id % Quarter % sum % &"""""""""""""'"""""""""'"""""""""""""( % 1 % 2014-Q1 % $42,227.43 % % 1 % 2014-Q2 % $42,974.71 % % 1 % 2014-Q3 % $41,364.66 % % 1 % 2014-Q4 % $33,910.34 % % 1 % % $160,477.14 % % 2 % 2014-Q1 % $38,733.24 % % 2 % 2014-Q2 % $40,480.96 % % 2 % 2014-Q3 % $43,875.72 % % 2 % 2014-Q4 % $42,041.28 % % 2 % % $165,131.20 % % 3 % 2014-Q1 % $45,351.14 % % 3 % 2014-Q2 % $36,672.08 % % 3 % 2014-Q3 % $33,468.46 % % 3 % 2014-Q4 % $42,793.36 % % 3 % % $158,285.04 % )"""""""""""""*"""""""""*"""""""""""""+ (15 rows) Tuesday, November 18, 14
  • 46. There we go! Tuesday, November 18, 14
  • 49. Extant Planner/Executor •HashAgg Tuesday, November 18, 14
  • 50. Extant Planner/Executor •HashAgg •GroupAgg Tuesday, November 18, 14
  • 51. HashAgg Result Group Intermediate State Tuesday, November 18, 14
  • 52. HashAgg • One pass: • Update hash value for each row • Output final value at the end Tuesday, November 18, 14
  • 53. HashAgg • Not yet in GROUPING SETS • Algorithmic speedup opportunity: • O(n) vs. O(n log n) Tuesday, November 18, 14
  • 54. HashAgg-- :-( • Non-hashable data types • Aggregate functions with LOTS of state • Ordered aggs • Distinct aggs • No spill-to-disk Tuesday, November 18, 14
  • 55. GroupAgg • Sorts all input to the agg node to • Detect group boundary • Output that group • Results before end-of-scan Tuesday, November 18, 14
  • 56. Phase I Tuesday, November 18, 14
  • 57. GroupAgg for ROLLUP Tuesday, November 18, 14
  • 58. GroupAgg for ROLLUP • Sort for the heirarchy Tuesday, November 18, 14
  • 59. GroupAgg for ROLLUP • Sort for the heirarchy • Output results at each boundary Tuesday, November 18, 14
  • 60. GroupAgg for ROLLUP • Sort for the heirarchy • Output results at each boundary • k for the price of one! Tuesday, November 18, 14
  • 61. Phase II Tuesday, November 18, 14
  • 62. GroupAgg !ROLLUP Tuesday, November 18, 14
  • 63. GroupAgg !ROLLUP Tuesday, November 18, 14
  • 64. GroupAgg !ROLLUP • Re-plan input to sort with >1 order Tuesday, November 18, 14
  • 65. GroupAgg !ROLLUP • Re-plan input to sort with >1 order • Plan keeps tons of global state Tuesday, November 18, 14
  • 66. GroupAgg !ROLLUP • Re-plan input to sort with >1 order • Plan keeps tons of global state • Does NOT like to be called >1x/plan Tuesday, November 18, 14
  • 68. GROUPING SETS ~ WINDOW Tuesday, November 18, 14
  • 70. Shuffle a deck of WindowAgg and Sort nodes. Tuesday, November 18, 14
  • 71. WindowAgg → Sort → WindowAgg → Sort ... Tuesday, November 18, 14
  • 72. Similar pattern Tuesday, November 18, 14
  • 74. • Expand all GROUPING SETS Tuesday, November 18, 14
  • 75. • Expand all GROUPING SETS • Arrange into fewest ROLLUPs Tuesday, November 18, 14
  • 76. • Expand all GROUPING SETS • Arrange into fewest ROLLUPs • Shuffle Sort and ChainAgg Tuesday, November 18, 14
  • 77. GroupAgg → Sort → ChainAgg → Sort → (input data) Tuesday, November 18, 14
  • 79. ChainAgg Nodes • Pass input state through unchanged • Update aggregate state • Put rows into a chain-wide shared tuplestore when they hit a group boundary Tuesday, November 18, 14
  • 80. The Last GroupAgg • Produces its normal output until end-of-data • Outputs the shared tuplestore Tuesday, November 18, 14
  • 81. Phase III Tuesday, November 18, 14
  • 83. • HashAgg • Alone? • With ChainAggs? • Agg Associativity (A + B) + C = A + (B + C) • Make CUBE a reserved word? Tuesday, November 18, 14
  • 84. Questions? Comments? Tuesday, November 18, 14
  • 85. Thanks! SFPUG 2014/11/18 Copyright© 2014 David Fetter Tuesday, November 18, 14