16863 lines
468 KiB
Plaintext
16863 lines
468 KiB
Plaintext
# Explain of SQL window functions.
|
|
# ----------------------------------------------------------------------
|
|
SET NAMES utf8;
|
|
Warnings:
|
|
Warning 3719 'utf8' is currently an alias for the character set UTF8MB3, but will be an alias for UTF8MB4 in a future release. Please consider using UTF8MB4 in order to be unambiguous.
|
|
Single window function (plus ORDER BY).
|
|
CREATE TABLE t(i INT, j INT);
|
|
INSERT INTO t VALUES (1,1), (1,4), (1,2), (1,4);
|
|
ANALYZE TABLE t;
|
|
Table Op Msg_type Msg_text
|
|
test.t analyze status OK
|
|
Single partition, no sorting
|
|
EXPLAIN FORMAT=JSON SELECT i, j, SUM(i+j) OVER (ROWS UNBOUNDED PRECEDING) foo FROM t;
|
|
EXPLAIN
|
|
{
|
|
"query_block": {
|
|
"select_id": 1,
|
|
"cost_info": {
|
|
"query_cost": "0.65"
|
|
},
|
|
"windowing": {
|
|
"windows": [
|
|
{
|
|
"name": "<unnamed window>",
|
|
"functions": [
|
|
"sum"
|
|
]
|
|
}
|
|
],
|
|
"table": {
|
|
"table_name": "t",
|
|
"access_type": "ALL",
|
|
"rows_examined_per_scan": 4,
|
|
"rows_produced_per_join": 4,
|
|
"filtered": "100.00",
|
|
"cost_info": {
|
|
"read_cost": "0.25",
|
|
"eval_cost": "0.40",
|
|
"prefix_cost": "0.65",
|
|
"data_read_per_join": "64"
|
|
},
|
|
"used_columns": [
|
|
"i",
|
|
"j"
|
|
]
|
|
}
|
|
}
|
|
}
|
|
}
|
|
Warnings:
|
|
Note 1003 /* select#1 */ select `test`.`t`.`i` AS `i`,`test`.`t`.`j` AS `j`,sum((`test`.`t`.`i` + `test`.`t`.`j`)) OVER (ROWS BETWEEN UNBOUNDED PRECEDING AND CURRENT ROW) AS `foo` from `test`.`t`
|
|
EXPLAIN FORMAT=TRADITIONAL SELECT i, j, SUM(i+j) OVER (ROWS UNBOUNDED PRECEDING) foo FROM t;
|
|
id select_type table partitions type possible_keys key key_len ref rows filtered Extra
|
|
1 SIMPLE t NULL ALL NULL NULL NULL NULL 4 100.00 NULL
|
|
Warnings:
|
|
Note 3598 To get information about window functions use EXPLAIN FORMAT=JSON
|
|
Note 1003 /* select#1 */ select `test`.`t`.`i` AS `i`,`test`.`t`.`j` AS `j`,sum((`test`.`t`.`i` + `test`.`t`.`j`)) OVER (ROWS BETWEEN UNBOUNDED PRECEDING AND CURRENT ROW) AS `foo` from `test`.`t`
|
|
EXPLAIN FORMAT=JSON SELECT i, j, SUM(i+j) OVER (ROWS BETWEEN UNBOUNDED PRECEDING AND CURRENT ROW) foo FROM t;
|
|
EXPLAIN
|
|
{
|
|
"query_block": {
|
|
"select_id": 1,
|
|
"cost_info": {
|
|
"query_cost": "0.65"
|
|
},
|
|
"windowing": {
|
|
"windows": [
|
|
{
|
|
"name": "<unnamed window>",
|
|
"functions": [
|
|
"sum"
|
|
]
|
|
}
|
|
],
|
|
"table": {
|
|
"table_name": "t",
|
|
"access_type": "ALL",
|
|
"rows_examined_per_scan": 4,
|
|
"rows_produced_per_join": 4,
|
|
"filtered": "100.00",
|
|
"cost_info": {
|
|
"read_cost": "0.25",
|
|
"eval_cost": "0.40",
|
|
"prefix_cost": "0.65",
|
|
"data_read_per_join": "64"
|
|
},
|
|
"used_columns": [
|
|
"i",
|
|
"j"
|
|
]
|
|
}
|
|
}
|
|
}
|
|
}
|
|
Warnings:
|
|
Note 1003 /* select#1 */ select `test`.`t`.`i` AS `i`,`test`.`t`.`j` AS `j`,sum((`test`.`t`.`i` + `test`.`t`.`j`)) OVER (ROWS BETWEEN UNBOUNDED PRECEDING AND CURRENT ROW) AS `foo` from `test`.`t`
|
|
EXPLAIN FORMAT=JSON SELECT i, j, SUM(i+j) OVER (ROWS UNBOUNDED PRECEDING) foo FROM t ORDER BY foo;
|
|
EXPLAIN
|
|
{
|
|
"query_block": {
|
|
"select_id": 1,
|
|
"cost_info": {
|
|
"query_cost": "4.65"
|
|
},
|
|
"ordering_operation": {
|
|
"using_filesort": true,
|
|
"cost_info": {
|
|
"sort_cost": "4.00"
|
|
},
|
|
"windowing": {
|
|
"windows": [
|
|
{
|
|
"name": "<unnamed window>",
|
|
"using_temporary_table": true,
|
|
"functions": [
|
|
"sum"
|
|
]
|
|
}
|
|
],
|
|
"table": {
|
|
"table_name": "t",
|
|
"access_type": "ALL",
|
|
"rows_examined_per_scan": 4,
|
|
"rows_produced_per_join": 4,
|
|
"filtered": "100.00",
|
|
"cost_info": {
|
|
"read_cost": "0.25",
|
|
"eval_cost": "0.40",
|
|
"prefix_cost": "0.65",
|
|
"data_read_per_join": "64"
|
|
},
|
|
"used_columns": [
|
|
"i",
|
|
"j"
|
|
]
|
|
}
|
|
}
|
|
}
|
|
}
|
|
}
|
|
Warnings:
|
|
Note 1003 /* select#1 */ select `test`.`t`.`i` AS `i`,`test`.`t`.`j` AS `j`,sum((`test`.`t`.`i` + `test`.`t`.`j`)) OVER (ROWS BETWEEN UNBOUNDED PRECEDING AND CURRENT ROW) AS `foo` from `test`.`t` order by `foo`
|
|
EXPLAIN FORMAT=JSON SELECT i, j, SUM(i+j) OVER (ROWS UNBOUNDED PRECEDING) foo FROM t ORDER BY foo DESC;
|
|
EXPLAIN
|
|
{
|
|
"query_block": {
|
|
"select_id": 1,
|
|
"cost_info": {
|
|
"query_cost": "4.65"
|
|
},
|
|
"ordering_operation": {
|
|
"using_filesort": true,
|
|
"cost_info": {
|
|
"sort_cost": "4.00"
|
|
},
|
|
"windowing": {
|
|
"windows": [
|
|
{
|
|
"name": "<unnamed window>",
|
|
"using_temporary_table": true,
|
|
"functions": [
|
|
"sum"
|
|
]
|
|
}
|
|
],
|
|
"table": {
|
|
"table_name": "t",
|
|
"access_type": "ALL",
|
|
"rows_examined_per_scan": 4,
|
|
"rows_produced_per_join": 4,
|
|
"filtered": "100.00",
|
|
"cost_info": {
|
|
"read_cost": "0.25",
|
|
"eval_cost": "0.40",
|
|
"prefix_cost": "0.65",
|
|
"data_read_per_join": "64"
|
|
},
|
|
"used_columns": [
|
|
"i",
|
|
"j"
|
|
]
|
|
}
|
|
}
|
|
}
|
|
}
|
|
}
|
|
Warnings:
|
|
Note 1003 /* select#1 */ select `test`.`t`.`i` AS `i`,`test`.`t`.`j` AS `j`,sum((`test`.`t`.`i` + `test`.`t`.`j`)) OVER (ROWS BETWEEN UNBOUNDED PRECEDING AND CURRENT ROW) AS `foo` from `test`.`t` order by `foo` desc
|
|
With LIMIT
|
|
EXPLAIN FORMAT=JSON SELECT i, j, SUM(i+j) OVER (ROWS UNBOUNDED PRECEDING) foo FROM t ORDER BY foo DESC LIMIT 3;
|
|
EXPLAIN
|
|
{
|
|
"query_block": {
|
|
"select_id": 1,
|
|
"cost_info": {
|
|
"query_cost": "0.65"
|
|
},
|
|
"ordering_operation": {
|
|
"using_filesort": true,
|
|
"windowing": {
|
|
"windows": [
|
|
{
|
|
"name": "<unnamed window>",
|
|
"using_temporary_table": true,
|
|
"functions": [
|
|
"sum"
|
|
]
|
|
}
|
|
],
|
|
"table": {
|
|
"table_name": "t",
|
|
"access_type": "ALL",
|
|
"rows_examined_per_scan": 4,
|
|
"rows_produced_per_join": 4,
|
|
"filtered": "100.00",
|
|
"cost_info": {
|
|
"read_cost": "0.25",
|
|
"eval_cost": "0.40",
|
|
"prefix_cost": "0.65",
|
|
"data_read_per_join": "64"
|
|
},
|
|
"used_columns": [
|
|
"i",
|
|
"j"
|
|
]
|
|
}
|
|
}
|
|
}
|
|
}
|
|
}
|
|
Warnings:
|
|
Note 1003 /* select#1 */ select `test`.`t`.`i` AS `i`,`test`.`t`.`j` AS `j`,sum((`test`.`t`.`i` + `test`.`t`.`j`)) OVER (ROWS BETWEEN UNBOUNDED PRECEDING AND CURRENT ROW) AS `foo` from `test`.`t` order by `foo` desc limit 3
|
|
Single ordered partition
|
|
EXPLAIN FORMAT=JSON SELECT i, j, SUM(i+j) OVER (ORDER BY j ROWS UNBOUNDED PRECEDING) foo FROM t;
|
|
EXPLAIN
|
|
{
|
|
"query_block": {
|
|
"select_id": 1,
|
|
"cost_info": {
|
|
"query_cost": "4.65"
|
|
},
|
|
"windowing": {
|
|
"windows": [
|
|
{
|
|
"name": "<unnamed window>",
|
|
"using_filesort": true,
|
|
"filesort_key": [
|
|
"`j`"
|
|
],
|
|
"functions": [
|
|
"sum"
|
|
]
|
|
}
|
|
],
|
|
"cost_info": {
|
|
"sort_cost": "4.00"
|
|
},
|
|
"table": {
|
|
"table_name": "t",
|
|
"access_type": "ALL",
|
|
"rows_examined_per_scan": 4,
|
|
"rows_produced_per_join": 4,
|
|
"filtered": "100.00",
|
|
"cost_info": {
|
|
"read_cost": "0.25",
|
|
"eval_cost": "0.40",
|
|
"prefix_cost": "0.65",
|
|
"data_read_per_join": "64"
|
|
},
|
|
"used_columns": [
|
|
"i",
|
|
"j"
|
|
]
|
|
}
|
|
}
|
|
}
|
|
}
|
|
Warnings:
|
|
Note 1003 /* select#1 */ select `test`.`t`.`i` AS `i`,`test`.`t`.`j` AS `j`,sum((`test`.`t`.`i` + `test`.`t`.`j`)) OVER (ORDER BY `test`.`t`.`j` ROWS BETWEEN UNBOUNDED PRECEDING AND CURRENT ROW) AS `foo` from `test`.`t`
|
|
EXPLAIN FORMAT=JSON SELECT i, j, SUM(i+j) OVER (ORDER BY j ROWS UNBOUNDED PRECEDING) foo FROM t ORDER BY foo;
|
|
EXPLAIN
|
|
{
|
|
"query_block": {
|
|
"select_id": 1,
|
|
"cost_info": {
|
|
"query_cost": "8.65"
|
|
},
|
|
"ordering_operation": {
|
|
"using_filesort": true,
|
|
"cost_info": {
|
|
"sort_cost": "4.00"
|
|
},
|
|
"windowing": {
|
|
"windows": [
|
|
{
|
|
"name": "<unnamed window>",
|
|
"using_temporary_table": true,
|
|
"using_filesort": true,
|
|
"filesort_key": [
|
|
"`j`"
|
|
],
|
|
"functions": [
|
|
"sum"
|
|
]
|
|
}
|
|
],
|
|
"cost_info": {
|
|
"sort_cost": "4.00"
|
|
},
|
|
"table": {
|
|
"table_name": "t",
|
|
"access_type": "ALL",
|
|
"rows_examined_per_scan": 4,
|
|
"rows_produced_per_join": 4,
|
|
"filtered": "100.00",
|
|
"cost_info": {
|
|
"read_cost": "0.25",
|
|
"eval_cost": "0.40",
|
|
"prefix_cost": "0.65",
|
|
"data_read_per_join": "64"
|
|
},
|
|
"used_columns": [
|
|
"i",
|
|
"j"
|
|
]
|
|
}
|
|
}
|
|
}
|
|
}
|
|
}
|
|
Warnings:
|
|
Note 1003 /* select#1 */ select `test`.`t`.`i` AS `i`,`test`.`t`.`j` AS `j`,sum((`test`.`t`.`i` + `test`.`t`.`j`)) OVER (ORDER BY `test`.`t`.`j` ROWS BETWEEN UNBOUNDED PRECEDING AND CURRENT ROW) AS `foo` from `test`.`t` order by `foo`
|
|
EXPLAIN FORMAT=JSON SELECT i, j, SUM(i+j) OVER (ORDER BY j ROWS UNBOUNDED PRECEDING) foo FROM t ORDER BY foo DESC;
|
|
EXPLAIN
|
|
{
|
|
"query_block": {
|
|
"select_id": 1,
|
|
"cost_info": {
|
|
"query_cost": "8.65"
|
|
},
|
|
"ordering_operation": {
|
|
"using_filesort": true,
|
|
"cost_info": {
|
|
"sort_cost": "4.00"
|
|
},
|
|
"windowing": {
|
|
"windows": [
|
|
{
|
|
"name": "<unnamed window>",
|
|
"using_temporary_table": true,
|
|
"using_filesort": true,
|
|
"filesort_key": [
|
|
"`j`"
|
|
],
|
|
"functions": [
|
|
"sum"
|
|
]
|
|
}
|
|
],
|
|
"cost_info": {
|
|
"sort_cost": "4.00"
|
|
},
|
|
"table": {
|
|
"table_name": "t",
|
|
"access_type": "ALL",
|
|
"rows_examined_per_scan": 4,
|
|
"rows_produced_per_join": 4,
|
|
"filtered": "100.00",
|
|
"cost_info": {
|
|
"read_cost": "0.25",
|
|
"eval_cost": "0.40",
|
|
"prefix_cost": "0.65",
|
|
"data_read_per_join": "64"
|
|
},
|
|
"used_columns": [
|
|
"i",
|
|
"j"
|
|
]
|
|
}
|
|
}
|
|
}
|
|
}
|
|
}
|
|
Warnings:
|
|
Note 1003 /* select#1 */ select `test`.`t`.`i` AS `i`,`test`.`t`.`j` AS `j`,sum((`test`.`t`.`i` + `test`.`t`.`j`)) OVER (ORDER BY `test`.`t`.`j` ROWS BETWEEN UNBOUNDED PRECEDING AND CURRENT ROW) AS `foo` from `test`.`t` order by `foo` desc
|
|
EXPLAIN FORMAT=JSON SELECT i, j, SUM(i+j) OVER (ORDER BY j DESC ROWS UNBOUNDED PRECEDING) foo FROM t;
|
|
EXPLAIN
|
|
{
|
|
"query_block": {
|
|
"select_id": 1,
|
|
"cost_info": {
|
|
"query_cost": "4.65"
|
|
},
|
|
"windowing": {
|
|
"windows": [
|
|
{
|
|
"name": "<unnamed window>",
|
|
"using_filesort": true,
|
|
"filesort_key": [
|
|
"`j` desc"
|
|
],
|
|
"functions": [
|
|
"sum"
|
|
]
|
|
}
|
|
],
|
|
"cost_info": {
|
|
"sort_cost": "4.00"
|
|
},
|
|
"table": {
|
|
"table_name": "t",
|
|
"access_type": "ALL",
|
|
"rows_examined_per_scan": 4,
|
|
"rows_produced_per_join": 4,
|
|
"filtered": "100.00",
|
|
"cost_info": {
|
|
"read_cost": "0.25",
|
|
"eval_cost": "0.40",
|
|
"prefix_cost": "0.65",
|
|
"data_read_per_join": "64"
|
|
},
|
|
"used_columns": [
|
|
"i",
|
|
"j"
|
|
]
|
|
}
|
|
}
|
|
}
|
|
}
|
|
Warnings:
|
|
Note 1003 /* select#1 */ select `test`.`t`.`i` AS `i`,`test`.`t`.`j` AS `j`,sum((`test`.`t`.`i` + `test`.`t`.`j`)) OVER (ORDER BY `test`.`t`.`j` desc ROWS BETWEEN UNBOUNDED PRECEDING AND CURRENT ROW) AS `foo` from `test`.`t`
|
|
EXPLAIN FORMAT=TRADITIONAL SELECT i, j, SUM(i+j) OVER (ORDER BY j DESC ROWS UNBOUNDED PRECEDING) foo FROM t;
|
|
id select_type table partitions type possible_keys key key_len ref rows filtered Extra
|
|
1 SIMPLE t NULL ALL NULL NULL NULL NULL 4 100.00 Using filesort
|
|
Warnings:
|
|
Note 3598 To get information about window functions use EXPLAIN FORMAT=JSON
|
|
Note 1003 /* select#1 */ select `test`.`t`.`i` AS `i`,`test`.`t`.`j` AS `j`,sum((`test`.`t`.`i` + `test`.`t`.`j`)) OVER (ORDER BY `test`.`t`.`j` desc ROWS BETWEEN UNBOUNDED PRECEDING AND CURRENT ROW) AS `foo` from `test`.`t`
|
|
View with window function
|
|
CREATE VIEW v AS
|
|
SELECT i, j, SUM(i+j) OVER (ORDER BY j DESC ROWS UNBOUNDED PRECEDING) foo FROM t;
|
|
SHOW CREATE VIEW v;
|
|
View Create View character_set_client collation_connection
|
|
v CREATE ALGORITHM=UNDEFINED DEFINER=`root`@`localhost` SQL SECURITY DEFINER VIEW `v` AS select `t`.`i` AS `i`,`t`.`j` AS `j`,sum((`t`.`i` + `t`.`j`)) OVER (ORDER BY `t`.`j` desc ROWS BETWEEN UNBOUNDED PRECEDING AND CURRENT ROW) AS `foo` from `t` utf8 utf8_general_ci
|
|
EXPLAIN FORMAT=JSON SELECT * FROM v;
|
|
EXPLAIN
|
|
{
|
|
"query_block": {
|
|
"select_id": 1,
|
|
"cost_info": {
|
|
"query_cost": "2.95"
|
|
},
|
|
"table": {
|
|
"table_name": "v",
|
|
"access_type": "ALL",
|
|
"rows_examined_per_scan": 4,
|
|
"rows_produced_per_join": 4,
|
|
"filtered": "100.00",
|
|
"cost_info": {
|
|
"read_cost": "2.55",
|
|
"eval_cost": "0.40",
|
|
"prefix_cost": "2.95",
|
|
"data_read_per_join": "128"
|
|
},
|
|
"used_columns": [
|
|
"i",
|
|
"j",
|
|
"foo"
|
|
],
|
|
"materialized_from_subquery": {
|
|
"using_temporary_table": true,
|
|
"dependent": false,
|
|
"cacheable": true,
|
|
"query_block": {
|
|
"select_id": 2,
|
|
"cost_info": {
|
|
"query_cost": "4.65"
|
|
},
|
|
"windowing": {
|
|
"windows": [
|
|
{
|
|
"name": "<unnamed window>",
|
|
"using_filesort": true,
|
|
"filesort_key": [
|
|
"`j` desc"
|
|
],
|
|
"functions": [
|
|
"sum"
|
|
]
|
|
}
|
|
],
|
|
"cost_info": {
|
|
"sort_cost": "4.00"
|
|
},
|
|
"table": {
|
|
"table_name": "t",
|
|
"access_type": "ALL",
|
|
"rows_examined_per_scan": 4,
|
|
"rows_produced_per_join": 4,
|
|
"filtered": "100.00",
|
|
"cost_info": {
|
|
"read_cost": "0.25",
|
|
"eval_cost": "0.40",
|
|
"prefix_cost": "0.65",
|
|
"data_read_per_join": "64"
|
|
},
|
|
"used_columns": [
|
|
"i",
|
|
"j"
|
|
]
|
|
}
|
|
}
|
|
}
|
|
}
|
|
}
|
|
}
|
|
}
|
|
Warnings:
|
|
Note 1003 /* select#1 */ select `v`.`i` AS `i`,`v`.`j` AS `j`,`v`.`foo` AS `foo` from `test`.`v`
|
|
DROP VIEW v;
|
|
EXPLAIN FORMAT=JSON SELECT i, j, SUM(i+j) OVER (ORDER BY j DESC ROWS UNBOUNDED PRECEDING) foo FROM t ORDER BY foo;
|
|
EXPLAIN
|
|
{
|
|
"query_block": {
|
|
"select_id": 1,
|
|
"cost_info": {
|
|
"query_cost": "8.65"
|
|
},
|
|
"ordering_operation": {
|
|
"using_filesort": true,
|
|
"cost_info": {
|
|
"sort_cost": "4.00"
|
|
},
|
|
"windowing": {
|
|
"windows": [
|
|
{
|
|
"name": "<unnamed window>",
|
|
"using_temporary_table": true,
|
|
"using_filesort": true,
|
|
"filesort_key": [
|
|
"`j` desc"
|
|
],
|
|
"functions": [
|
|
"sum"
|
|
]
|
|
}
|
|
],
|
|
"cost_info": {
|
|
"sort_cost": "4.00"
|
|
},
|
|
"table": {
|
|
"table_name": "t",
|
|
"access_type": "ALL",
|
|
"rows_examined_per_scan": 4,
|
|
"rows_produced_per_join": 4,
|
|
"filtered": "100.00",
|
|
"cost_info": {
|
|
"read_cost": "0.25",
|
|
"eval_cost": "0.40",
|
|
"prefix_cost": "0.65",
|
|
"data_read_per_join": "64"
|
|
},
|
|
"used_columns": [
|
|
"i",
|
|
"j"
|
|
]
|
|
}
|
|
}
|
|
}
|
|
}
|
|
}
|
|
Warnings:
|
|
Note 1003 /* select#1 */ select `test`.`t`.`i` AS `i`,`test`.`t`.`j` AS `j`,sum((`test`.`t`.`i` + `test`.`t`.`j`)) OVER (ORDER BY `test`.`t`.`j` desc ROWS BETWEEN UNBOUNDED PRECEDING AND CURRENT ROW) AS `foo` from `test`.`t` order by `foo`
|
|
EXPLAIN FORMAT=JSON SELECT i, j, SUM(i+j) OVER (ORDER BY j DESC ROWS UNBOUNDED PRECEDING) foo FROM t ORDER BY foo DESC;
|
|
EXPLAIN
|
|
{
|
|
"query_block": {
|
|
"select_id": 1,
|
|
"cost_info": {
|
|
"query_cost": "8.65"
|
|
},
|
|
"ordering_operation": {
|
|
"using_filesort": true,
|
|
"cost_info": {
|
|
"sort_cost": "4.00"
|
|
},
|
|
"windowing": {
|
|
"windows": [
|
|
{
|
|
"name": "<unnamed window>",
|
|
"using_temporary_table": true,
|
|
"using_filesort": true,
|
|
"filesort_key": [
|
|
"`j` desc"
|
|
],
|
|
"functions": [
|
|
"sum"
|
|
]
|
|
}
|
|
],
|
|
"cost_info": {
|
|
"sort_cost": "4.00"
|
|
},
|
|
"table": {
|
|
"table_name": "t",
|
|
"access_type": "ALL",
|
|
"rows_examined_per_scan": 4,
|
|
"rows_produced_per_join": 4,
|
|
"filtered": "100.00",
|
|
"cost_info": {
|
|
"read_cost": "0.25",
|
|
"eval_cost": "0.40",
|
|
"prefix_cost": "0.65",
|
|
"data_read_per_join": "64"
|
|
},
|
|
"used_columns": [
|
|
"i",
|
|
"j"
|
|
]
|
|
}
|
|
}
|
|
}
|
|
}
|
|
}
|
|
Warnings:
|
|
Note 1003 /* select#1 */ select `test`.`t`.`i` AS `i`,`test`.`t`.`j` AS `j`,sum((`test`.`t`.`i` + `test`.`t`.`j`)) OVER (ORDER BY `test`.`t`.`j` desc ROWS BETWEEN UNBOUNDED PRECEDING AND CURRENT ROW) AS `foo` from `test`.`t` order by `foo` desc
|
|
TRUNCATE TABLE t;
|
|
Check my_decimal bug: no warning if c=a+b and c is one of a,b... just fails over 9 digits
|
|
INSERT INTO t VALUES (999961560, DEFAULT), (44721, DEFAULT);
|
|
ANALYZE TABLE t;
|
|
Table Op Msg_type Msg_text
|
|
test.t analyze status OK
|
|
EXPLAIN FORMAT=JSON SELECT SUM(i) OVER () FROM t;
|
|
EXPLAIN
|
|
{
|
|
"query_block": {
|
|
"select_id": 1,
|
|
"cost_info": {
|
|
"query_cost": "0.45"
|
|
},
|
|
"windowing": {
|
|
"windows": [
|
|
{
|
|
"name": "<unnamed window>",
|
|
"frame_buffer": {
|
|
"using_temporary_table": true,
|
|
"optimized_frame_evaluation": true
|
|
},
|
|
"functions": [
|
|
"sum"
|
|
]
|
|
}
|
|
],
|
|
"table": {
|
|
"table_name": "t",
|
|
"access_type": "ALL",
|
|
"rows_examined_per_scan": 2,
|
|
"rows_produced_per_join": 2,
|
|
"filtered": "100.00",
|
|
"cost_info": {
|
|
"read_cost": "0.25",
|
|
"eval_cost": "0.20",
|
|
"prefix_cost": "0.45",
|
|
"data_read_per_join": "32"
|
|
},
|
|
"used_columns": [
|
|
"i"
|
|
]
|
|
}
|
|
}
|
|
}
|
|
}
|
|
Warnings:
|
|
Note 1003 /* select#1 */ select sum(`test`.`t`.`i`) OVER () AS `SUM(i) OVER ()` from `test`.`t`
|
|
DROP TABLE t;
|
|
CREATE TABLE t(i INT, j INT, k INT);
|
|
INSERT INTO t VALUES (1,1,1), (1,4,1), (1,2,1), (1,4,1);
|
|
INSERT INTO t VALUES (1,1,2), (1,4,2), (1,2,2), (1,4,2);
|
|
INSERT INTO t VALUES (1,1,3), (1,4,3), (1,2,3), (1,4,3);
|
|
INSERT INTO t VALUES (1,1,4), (1,4,4), (1,2,4), (1,4,4);
|
|
ANALYZE TABLE t;
|
|
Table Op Msg_type Msg_text
|
|
test.t analyze status OK
|
|
----------------------------------------------------------------------
|
|
- Combination with GROUP BY
|
|
----------------------------------------------------------------------
|
|
EXPLAIN FORMAT=JSON SELECT k, SUM(k) OVER (ROWS UNBOUNDED PRECEDING) wf FROM t;
|
|
EXPLAIN
|
|
{
|
|
"query_block": {
|
|
"select_id": 1,
|
|
"cost_info": {
|
|
"query_cost": "1.85"
|
|
},
|
|
"windowing": {
|
|
"windows": [
|
|
{
|
|
"name": "<unnamed window>",
|
|
"functions": [
|
|
"sum"
|
|
]
|
|
}
|
|
],
|
|
"table": {
|
|
"table_name": "t",
|
|
"access_type": "ALL",
|
|
"rows_examined_per_scan": 16,
|
|
"rows_produced_per_join": 16,
|
|
"filtered": "100.00",
|
|
"cost_info": {
|
|
"read_cost": "0.25",
|
|
"eval_cost": "1.60",
|
|
"prefix_cost": "1.85",
|
|
"data_read_per_join": "256"
|
|
},
|
|
"used_columns": [
|
|
"k"
|
|
]
|
|
}
|
|
}
|
|
}
|
|
}
|
|
Warnings:
|
|
Note 1003 /* select#1 */ select `test`.`t`.`k` AS `k`,sum(`test`.`t`.`k`) OVER (ROWS BETWEEN UNBOUNDED PRECEDING AND CURRENT ROW) AS `wf` from `test`.`t`
|
|
EXPLAIN FORMAT=JSON SELECT k, MIN(i), SUM(j), SUM(k) OVER (ROWS UNBOUNDED PRECEDING) wf FROM t GROUP BY (k);
|
|
EXPLAIN
|
|
{
|
|
"query_block": {
|
|
"select_id": 1,
|
|
"cost_info": {
|
|
"query_cost": "1.85"
|
|
},
|
|
"windowing": {
|
|
"windows": [
|
|
{
|
|
"name": "<unnamed window>",
|
|
"functions": [
|
|
"sum"
|
|
]
|
|
}
|
|
],
|
|
"grouping_operation": {
|
|
"using_temporary_table": true,
|
|
"using_filesort": false,
|
|
"table": {
|
|
"table_name": "t",
|
|
"access_type": "ALL",
|
|
"rows_examined_per_scan": 16,
|
|
"rows_produced_per_join": 16,
|
|
"filtered": "100.00",
|
|
"cost_info": {
|
|
"read_cost": "0.25",
|
|
"eval_cost": "1.60",
|
|
"prefix_cost": "1.85",
|
|
"data_read_per_join": "256"
|
|
},
|
|
"used_columns": [
|
|
"i",
|
|
"j",
|
|
"k"
|
|
]
|
|
}
|
|
}
|
|
}
|
|
}
|
|
}
|
|
Warnings:
|
|
Note 1003 /* select#1 */ select `test`.`t`.`k` AS `k`,min(`test`.`t`.`i`) AS `MIN(i)`,sum(`test`.`t`.`j`) AS `SUM(j)`,sum(`test`.`t`.`k`) OVER (ROWS BETWEEN UNBOUNDED PRECEDING AND CURRENT ROW) AS `wf` from `test`.`t` group by `test`.`t`.`k`
|
|
EXPLAIN FORMAT=JSON SELECT k, MIN(i), SUM(j), SUM(k) OVER (ROWS UNBOUNDED PRECEDING) wf FROM t GROUP BY (k) ORDER BY wf DESC;
|
|
EXPLAIN
|
|
{
|
|
"query_block": {
|
|
"select_id": 1,
|
|
"cost_info": {
|
|
"query_cost": "1.85"
|
|
},
|
|
"ordering_operation": {
|
|
"using_filesort": true,
|
|
"windowing": {
|
|
"windows": [
|
|
{
|
|
"name": "<unnamed window>",
|
|
"using_temporary_table": true,
|
|
"functions": [
|
|
"sum"
|
|
]
|
|
}
|
|
],
|
|
"grouping_operation": {
|
|
"using_temporary_table": true,
|
|
"using_filesort": false,
|
|
"table": {
|
|
"table_name": "t",
|
|
"access_type": "ALL",
|
|
"rows_examined_per_scan": 16,
|
|
"rows_produced_per_join": 16,
|
|
"filtered": "100.00",
|
|
"cost_info": {
|
|
"read_cost": "0.25",
|
|
"eval_cost": "1.60",
|
|
"prefix_cost": "1.85",
|
|
"data_read_per_join": "256"
|
|
},
|
|
"used_columns": [
|
|
"i",
|
|
"j",
|
|
"k"
|
|
]
|
|
}
|
|
}
|
|
}
|
|
}
|
|
}
|
|
}
|
|
Warnings:
|
|
Note 1003 /* select#1 */ select `test`.`t`.`k` AS `k`,min(`test`.`t`.`i`) AS `MIN(i)`,sum(`test`.`t`.`j`) AS `SUM(j)`,sum(`test`.`t`.`k`) OVER (ROWS BETWEEN UNBOUNDED PRECEDING AND CURRENT ROW) AS `wf` from `test`.`t` group by `test`.`t`.`k` order by `wf` desc
|
|
EXPLAIN FORMAT=JSON SELECT k, GROUP_CONCAT(j ORDER BY j), SUM(k) OVER (ROWS UNBOUNDED PRECEDING) foo FROM t GROUP BY (k);
|
|
EXPLAIN
|
|
{
|
|
"query_block": {
|
|
"select_id": 1,
|
|
"cost_info": {
|
|
"query_cost": "17.85"
|
|
},
|
|
"windowing": {
|
|
"windows": [
|
|
{
|
|
"name": "<unnamed window>",
|
|
"functions": [
|
|
"sum"
|
|
]
|
|
}
|
|
],
|
|
"grouping_operation": {
|
|
"using_temporary_table": true,
|
|
"using_filesort": true,
|
|
"cost_info": {
|
|
"sort_cost": "16.00"
|
|
},
|
|
"buffer_result": {
|
|
"using_temporary_table": true,
|
|
"table": {
|
|
"table_name": "t",
|
|
"access_type": "ALL",
|
|
"rows_examined_per_scan": 16,
|
|
"rows_produced_per_join": 16,
|
|
"filtered": "100.00",
|
|
"cost_info": {
|
|
"read_cost": "0.25",
|
|
"eval_cost": "1.60",
|
|
"prefix_cost": "1.85",
|
|
"data_read_per_join": "256"
|
|
},
|
|
"used_columns": [
|
|
"j",
|
|
"k"
|
|
]
|
|
}
|
|
}
|
|
}
|
|
}
|
|
}
|
|
}
|
|
Warnings:
|
|
Note 1003 /* select#1 */ select `test`.`t`.`k` AS `k`,group_concat(`test`.`t`.`j` order by `test`.`t`.`j` ASC separator ',') AS `GROUP_CONCAT(j ORDER BY j)`,sum(`test`.`t`.`k`) OVER (ROWS BETWEEN UNBOUNDED PRECEDING AND CURRENT ROW) AS `foo` from `test`.`t` group by `test`.`t`.`k`
|
|
EXPLAIN FORMAT=JSON SELECT k, AVG(DISTINCT j), SUM(k) OVER (ROWS UNBOUNDED PRECEDING) foo FROM t GROUP BY (k);
|
|
EXPLAIN
|
|
{
|
|
"query_block": {
|
|
"select_id": 1,
|
|
"cost_info": {
|
|
"query_cost": "17.85"
|
|
},
|
|
"windowing": {
|
|
"windows": [
|
|
{
|
|
"name": "<unnamed window>",
|
|
"functions": [
|
|
"sum"
|
|
]
|
|
}
|
|
],
|
|
"grouping_operation": {
|
|
"using_temporary_table": true,
|
|
"using_filesort": true,
|
|
"cost_info": {
|
|
"sort_cost": "16.00"
|
|
},
|
|
"buffer_result": {
|
|
"using_temporary_table": true,
|
|
"table": {
|
|
"table_name": "t",
|
|
"access_type": "ALL",
|
|
"rows_examined_per_scan": 16,
|
|
"rows_produced_per_join": 16,
|
|
"filtered": "100.00",
|
|
"cost_info": {
|
|
"read_cost": "0.25",
|
|
"eval_cost": "1.60",
|
|
"prefix_cost": "1.85",
|
|
"data_read_per_join": "256"
|
|
},
|
|
"used_columns": [
|
|
"j",
|
|
"k"
|
|
]
|
|
}
|
|
}
|
|
}
|
|
}
|
|
}
|
|
}
|
|
Warnings:
|
|
Note 1003 /* select#1 */ select `test`.`t`.`k` AS `k`,avg(distinct `test`.`t`.`j`) AS `AVG(DISTINCT j)`,sum(`test`.`t`.`k`) OVER (ROWS BETWEEN UNBOUNDED PRECEDING AND CURRENT ROW) AS `foo` from `test`.`t` group by `test`.`t`.`k`
|
|
EXPLAIN FORMAT=JSON SELECT k, GROUP_CONCAT(j ORDER BY j), SUM(k+1) OVER (ROWS UNBOUNDED PRECEDING) foo FROM t GROUP BY (k);
|
|
EXPLAIN
|
|
{
|
|
"query_block": {
|
|
"select_id": 1,
|
|
"cost_info": {
|
|
"query_cost": "17.85"
|
|
},
|
|
"windowing": {
|
|
"windows": [
|
|
{
|
|
"name": "<unnamed window>",
|
|
"functions": [
|
|
"sum"
|
|
]
|
|
}
|
|
],
|
|
"grouping_operation": {
|
|
"using_temporary_table": true,
|
|
"using_filesort": true,
|
|
"cost_info": {
|
|
"sort_cost": "16.00"
|
|
},
|
|
"buffer_result": {
|
|
"using_temporary_table": true,
|
|
"table": {
|
|
"table_name": "t",
|
|
"access_type": "ALL",
|
|
"rows_examined_per_scan": 16,
|
|
"rows_produced_per_join": 16,
|
|
"filtered": "100.00",
|
|
"cost_info": {
|
|
"read_cost": "0.25",
|
|
"eval_cost": "1.60",
|
|
"prefix_cost": "1.85",
|
|
"data_read_per_join": "256"
|
|
},
|
|
"used_columns": [
|
|
"j",
|
|
"k"
|
|
]
|
|
}
|
|
}
|
|
}
|
|
}
|
|
}
|
|
}
|
|
Warnings:
|
|
Note 1003 /* select#1 */ select `test`.`t`.`k` AS `k`,group_concat(`test`.`t`.`j` order by `test`.`t`.`j` ASC separator ',') AS `GROUP_CONCAT(j ORDER BY j)`,sum((`test`.`t`.`k` + 1)) OVER (ROWS BETWEEN UNBOUNDED PRECEDING AND CURRENT ROW) AS `foo` from `test`.`t` group by `test`.`t`.`k`
|
|
EXPLAIN FORMAT=JSON SELECT k, GROUP_CONCAT(j ORDER BY j), SUM(k+1) OVER (ORDER BY k DESC ROWS UNBOUNDED PRECEDING) foo FROM t GROUP BY (k);
|
|
EXPLAIN
|
|
{
|
|
"query_block": {
|
|
"select_id": 1,
|
|
"cost_info": {
|
|
"query_cost": "33.85"
|
|
},
|
|
"windowing": {
|
|
"windows": [
|
|
{
|
|
"name": "<unnamed window>",
|
|
"using_filesort": true,
|
|
"filesort_key": [
|
|
"`k` desc"
|
|
],
|
|
"functions": [
|
|
"sum"
|
|
]
|
|
}
|
|
],
|
|
"cost_info": {
|
|
"sort_cost": "16.00"
|
|
},
|
|
"grouping_operation": {
|
|
"using_temporary_table": true,
|
|
"using_filesort": true,
|
|
"cost_info": {
|
|
"sort_cost": "16.00"
|
|
},
|
|
"buffer_result": {
|
|
"using_temporary_table": true,
|
|
"table": {
|
|
"table_name": "t",
|
|
"access_type": "ALL",
|
|
"rows_examined_per_scan": 16,
|
|
"rows_produced_per_join": 16,
|
|
"filtered": "100.00",
|
|
"cost_info": {
|
|
"read_cost": "0.25",
|
|
"eval_cost": "1.60",
|
|
"prefix_cost": "1.85",
|
|
"data_read_per_join": "256"
|
|
},
|
|
"used_columns": [
|
|
"j",
|
|
"k"
|
|
]
|
|
}
|
|
}
|
|
}
|
|
}
|
|
}
|
|
}
|
|
Warnings:
|
|
Note 1003 /* select#1 */ select `test`.`t`.`k` AS `k`,group_concat(`test`.`t`.`j` order by `test`.`t`.`j` ASC separator ',') AS `GROUP_CONCAT(j ORDER BY j)`,sum((`test`.`t`.`k` + 1)) OVER (ORDER BY `test`.`t`.`k` desc ROWS BETWEEN UNBOUNDED PRECEDING AND CURRENT ROW) AS `foo` from `test`.`t` group by `test`.`t`.`k`
|
|
DROP TABLE t;
|
|
----------------------------------------------------------------------
|
|
- Some RANK, DENSE_RANK tests
|
|
----------------------------------------------------------------------
|
|
CREATE TABLE t1 (id INTEGER, sex CHAR(1));
|
|
INSERT INTO t1 VALUES (1, 'M'),
|
|
(2, 'F'),
|
|
(3, 'F'),
|
|
(4, 'F'),
|
|
(5, 'M');
|
|
ANALYZE TABLE t1;
|
|
Table Op Msg_type Msg_text
|
|
test.t1 analyze status OK
|
|
CREATE TABLE t2 (user_id INTEGER NOT NULL, date DATE);
|
|
INSERT INTO t2 VALUES (1, '2002-06-09'),
|
|
(2, '2002-06-09'),
|
|
(1, '2002-06-09'),
|
|
(3, '2002-06-09'),
|
|
(4, '2002-06-09'),
|
|
(4, '2002-06-09'),
|
|
(5, '2002-06-09');
|
|
ANALYZE TABLE t2;
|
|
Table Op Msg_type Msg_text
|
|
test.t2 analyze status OK
|
|
EXPLAIN FORMAT=JSON SELECT RANK() OVER (ORDER BY user_id) r FROM t2;
|
|
EXPLAIN
|
|
{
|
|
"query_block": {
|
|
"select_id": 1,
|
|
"cost_info": {
|
|
"query_cost": "7.95"
|
|
},
|
|
"windowing": {
|
|
"windows": [
|
|
{
|
|
"name": "<unnamed window>",
|
|
"using_filesort": true,
|
|
"filesort_key": [
|
|
"`user_id`"
|
|
],
|
|
"functions": [
|
|
"rank"
|
|
]
|
|
}
|
|
],
|
|
"cost_info": {
|
|
"sort_cost": "7.00"
|
|
},
|
|
"table": {
|
|
"table_name": "t2",
|
|
"access_type": "ALL",
|
|
"rows_examined_per_scan": 7,
|
|
"rows_produced_per_join": 7,
|
|
"filtered": "100.00",
|
|
"cost_info": {
|
|
"read_cost": "0.25",
|
|
"eval_cost": "0.70",
|
|
"prefix_cost": "0.95",
|
|
"data_read_per_join": "112"
|
|
},
|
|
"used_columns": [
|
|
"user_id"
|
|
]
|
|
}
|
|
}
|
|
}
|
|
}
|
|
Warnings:
|
|
Note 1003 /* select#1 */ select rank() OVER (ORDER BY `test`.`t2`.`user_id` ) AS `r` from `test`.`t2`
|
|
EXPLAIN FORMAT=JSON SELECT DENSE_RANK() OVER (ORDER BY user_id) r FROM t2;
|
|
EXPLAIN
|
|
{
|
|
"query_block": {
|
|
"select_id": 1,
|
|
"cost_info": {
|
|
"query_cost": "7.95"
|
|
},
|
|
"windowing": {
|
|
"windows": [
|
|
{
|
|
"name": "<unnamed window>",
|
|
"using_filesort": true,
|
|
"filesort_key": [
|
|
"`user_id`"
|
|
],
|
|
"functions": [
|
|
"dense_rank"
|
|
]
|
|
}
|
|
],
|
|
"cost_info": {
|
|
"sort_cost": "7.00"
|
|
},
|
|
"table": {
|
|
"table_name": "t2",
|
|
"access_type": "ALL",
|
|
"rows_examined_per_scan": 7,
|
|
"rows_produced_per_join": 7,
|
|
"filtered": "100.00",
|
|
"cost_info": {
|
|
"read_cost": "0.25",
|
|
"eval_cost": "0.70",
|
|
"prefix_cost": "0.95",
|
|
"data_read_per_join": "112"
|
|
},
|
|
"used_columns": [
|
|
"user_id"
|
|
]
|
|
}
|
|
}
|
|
}
|
|
}
|
|
Warnings:
|
|
Note 1003 /* select#1 */ select dense_rank() OVER (ORDER BY `test`.`t2`.`user_id` ) AS `r` from `test`.`t2`
|
|
EXPLAIN FORMAT=JSON SELECT sex, SUM(DISTINCT id) AS uids FROM t1 u, t2
|
|
WHERE t2.user_id = u.id GROUP BY sex ORDER BY uids;
|
|
EXPLAIN
|
|
{
|
|
"query_block": {
|
|
"select_id": 1,
|
|
"cost_info": {
|
|
"query_cost": "4.50"
|
|
},
|
|
"ordering_operation": {
|
|
"using_filesort": true,
|
|
"grouping_operation": {
|
|
"using_temporary_table": true,
|
|
"using_filesort": true,
|
|
"buffer_result": {
|
|
"using_temporary_table": true,
|
|
"nested_loop": [
|
|
{
|
|
"table": {
|
|
"table_name": "u",
|
|
"access_type": "ALL",
|
|
"rows_examined_per_scan": 5,
|
|
"rows_produced_per_join": 5,
|
|
"filtered": "100.00",
|
|
"cost_info": {
|
|
"read_cost": "0.25",
|
|
"eval_cost": "0.50",
|
|
"prefix_cost": "0.75",
|
|
"data_read_per_join": "80"
|
|
},
|
|
"used_columns": [
|
|
"id",
|
|
"sex"
|
|
]
|
|
}
|
|
},
|
|
{
|
|
"table": {
|
|
"table_name": "t2",
|
|
"access_type": "ALL",
|
|
"rows_examined_per_scan": 7,
|
|
"rows_produced_per_join": 5,
|
|
"filtered": "14.29",
|
|
"using_join_buffer": "Block Nested Loop",
|
|
"cost_info": {
|
|
"read_cost": "0.25",
|
|
"eval_cost": "0.50",
|
|
"prefix_cost": "4.50",
|
|
"data_read_per_join": "80"
|
|
},
|
|
"used_columns": [
|
|
"user_id"
|
|
],
|
|
"attached_condition": "(`test`.`t2`.`user_id` = `test`.`u`.`id`)"
|
|
}
|
|
}
|
|
]
|
|
}
|
|
}
|
|
}
|
|
}
|
|
}
|
|
Warnings:
|
|
Note 1003 /* select#1 */ select `test`.`u`.`sex` AS `sex`,sum(distinct `test`.`u`.`id`) AS `uids` from `test`.`t1` `u` join `test`.`t2` where (`test`.`t2`.`user_id` = `test`.`u`.`id`) group by `test`.`u`.`sex` order by `uids`
|
|
EXPLAIN FORMAT=JSON SELECT id, sex, RANK() OVER (ORDER BY sex) FROM t1 ORDER BY id;
|
|
EXPLAIN
|
|
{
|
|
"query_block": {
|
|
"select_id": 1,
|
|
"cost_info": {
|
|
"query_cost": "10.75"
|
|
},
|
|
"ordering_operation": {
|
|
"using_filesort": true,
|
|
"cost_info": {
|
|
"sort_cost": "5.00"
|
|
},
|
|
"windowing": {
|
|
"windows": [
|
|
{
|
|
"name": "<unnamed window>",
|
|
"using_temporary_table": true,
|
|
"using_filesort": true,
|
|
"filesort_key": [
|
|
"`sex`"
|
|
],
|
|
"functions": [
|
|
"rank"
|
|
]
|
|
}
|
|
],
|
|
"cost_info": {
|
|
"sort_cost": "5.00"
|
|
},
|
|
"table": {
|
|
"table_name": "t1",
|
|
"access_type": "ALL",
|
|
"rows_examined_per_scan": 5,
|
|
"rows_produced_per_join": 5,
|
|
"filtered": "100.00",
|
|
"cost_info": {
|
|
"read_cost": "0.25",
|
|
"eval_cost": "0.50",
|
|
"prefix_cost": "0.75",
|
|
"data_read_per_join": "80"
|
|
},
|
|
"used_columns": [
|
|
"id",
|
|
"sex"
|
|
]
|
|
}
|
|
}
|
|
}
|
|
}
|
|
}
|
|
Warnings:
|
|
Note 1003 /* select#1 */ select `test`.`t1`.`id` AS `id`,`test`.`t1`.`sex` AS `sex`,rank() OVER (ORDER BY `test`.`t1`.`sex` ) AS `RANK() OVER (ORDER BY sex)` from `test`.`t1` order by `test`.`t1`.`id`
|
|
EXPLAIN FORMAT=JSON SELECT id, sex, DENSE_RANK() OVER (ORDER BY sex) FROM t1 ORDER BY id;
|
|
EXPLAIN
|
|
{
|
|
"query_block": {
|
|
"select_id": 1,
|
|
"cost_info": {
|
|
"query_cost": "10.75"
|
|
},
|
|
"ordering_operation": {
|
|
"using_filesort": true,
|
|
"cost_info": {
|
|
"sort_cost": "5.00"
|
|
},
|
|
"windowing": {
|
|
"windows": [
|
|
{
|
|
"name": "<unnamed window>",
|
|
"using_temporary_table": true,
|
|
"using_filesort": true,
|
|
"filesort_key": [
|
|
"`sex`"
|
|
],
|
|
"functions": [
|
|
"dense_rank"
|
|
]
|
|
}
|
|
],
|
|
"cost_info": {
|
|
"sort_cost": "5.00"
|
|
},
|
|
"table": {
|
|
"table_name": "t1",
|
|
"access_type": "ALL",
|
|
"rows_examined_per_scan": 5,
|
|
"rows_produced_per_join": 5,
|
|
"filtered": "100.00",
|
|
"cost_info": {
|
|
"read_cost": "0.25",
|
|
"eval_cost": "0.50",
|
|
"prefix_cost": "0.75",
|
|
"data_read_per_join": "80"
|
|
},
|
|
"used_columns": [
|
|
"id",
|
|
"sex"
|
|
]
|
|
}
|
|
}
|
|
}
|
|
}
|
|
}
|
|
Warnings:
|
|
Note 1003 /* select#1 */ select `test`.`t1`.`id` AS `id`,`test`.`t1`.`sex` AS `sex`,dense_rank() OVER (ORDER BY `test`.`t1`.`sex` ) AS `DENSE_RANK() OVER (ORDER BY sex)` from `test`.`t1` order by `test`.`t1`.`id`
|
|
EXPLAIN FORMAT=JSON SELECT sex, RANK() OVER (ORDER BY sex DESC) `rank`, AVG(DISTINCT id) AS uids FROM t1 u, t2
|
|
WHERE t2.user_id = u.id GROUP BY sex ORDER BY sex;
|
|
EXPLAIN
|
|
{
|
|
"query_block": {
|
|
"select_id": 1,
|
|
"cost_info": {
|
|
"query_cost": "19.50"
|
|
},
|
|
"ordering_operation": {
|
|
"using_filesort": true,
|
|
"cost_info": {
|
|
"sort_cost": "5.00"
|
|
},
|
|
"windowing": {
|
|
"windows": [
|
|
{
|
|
"name": "<unnamed window>",
|
|
"using_temporary_table": true,
|
|
"using_filesort": true,
|
|
"filesort_key": [
|
|
"`sex` desc"
|
|
],
|
|
"functions": [
|
|
"rank"
|
|
]
|
|
}
|
|
],
|
|
"cost_info": {
|
|
"sort_cost": "5.00"
|
|
},
|
|
"grouping_operation": {
|
|
"using_temporary_table": true,
|
|
"using_filesort": true,
|
|
"cost_info": {
|
|
"sort_cost": "5.00"
|
|
},
|
|
"buffer_result": {
|
|
"using_temporary_table": true,
|
|
"nested_loop": [
|
|
{
|
|
"table": {
|
|
"table_name": "u",
|
|
"access_type": "ALL",
|
|
"rows_examined_per_scan": 5,
|
|
"rows_produced_per_join": 5,
|
|
"filtered": "100.00",
|
|
"cost_info": {
|
|
"read_cost": "0.25",
|
|
"eval_cost": "0.50",
|
|
"prefix_cost": "0.75",
|
|
"data_read_per_join": "80"
|
|
},
|
|
"used_columns": [
|
|
"id",
|
|
"sex"
|
|
]
|
|
}
|
|
},
|
|
{
|
|
"table": {
|
|
"table_name": "t2",
|
|
"access_type": "ALL",
|
|
"rows_examined_per_scan": 7,
|
|
"rows_produced_per_join": 5,
|
|
"filtered": "14.29",
|
|
"using_join_buffer": "Block Nested Loop",
|
|
"cost_info": {
|
|
"read_cost": "0.25",
|
|
"eval_cost": "0.50",
|
|
"prefix_cost": "4.50",
|
|
"data_read_per_join": "80"
|
|
},
|
|
"used_columns": [
|
|
"user_id"
|
|
],
|
|
"attached_condition": "(`test`.`t2`.`user_id` = `test`.`u`.`id`)"
|
|
}
|
|
}
|
|
]
|
|
}
|
|
}
|
|
}
|
|
}
|
|
}
|
|
}
|
|
Warnings:
|
|
Note 1003 /* select#1 */ select `test`.`u`.`sex` AS `sex`,rank() OVER (ORDER BY `test`.`u`.`sex` desc ) AS `rank`,avg(distinct `test`.`u`.`id`) AS `uids` from `test`.`t1` `u` join `test`.`t2` where (`test`.`t2`.`user_id` = `test`.`u`.`id`) group by `test`.`u`.`sex` order by `test`.`u`.`sex`
|
|
Explicit window definition, WINDOW DESC ordering from GROUP BY
|
|
EXPLAIN FORMAT=JSON SELECT sex, AVG(id) AS uids, RANK() OVER w `rank` FROM t1 u, t2
|
|
WHERE t2.user_id = u.id GROUP BY sex
|
|
WINDOW w AS (ORDER BY AVG(id));
|
|
EXPLAIN
|
|
{
|
|
"query_block": {
|
|
"select_id": 1,
|
|
"cost_info": {
|
|
"query_cost": "9.50"
|
|
},
|
|
"windowing": {
|
|
"windows": [
|
|
{
|
|
"name": "w",
|
|
"using_filesort": true,
|
|
"filesort_key": [
|
|
"avg(`id`)"
|
|
],
|
|
"functions": [
|
|
"rank"
|
|
]
|
|
}
|
|
],
|
|
"cost_info": {
|
|
"sort_cost": "5.00"
|
|
},
|
|
"grouping_operation": {
|
|
"using_temporary_table": true,
|
|
"using_filesort": false,
|
|
"nested_loop": [
|
|
{
|
|
"table": {
|
|
"table_name": "u",
|
|
"access_type": "ALL",
|
|
"rows_examined_per_scan": 5,
|
|
"rows_produced_per_join": 5,
|
|
"filtered": "100.00",
|
|
"cost_info": {
|
|
"read_cost": "0.25",
|
|
"eval_cost": "0.50",
|
|
"prefix_cost": "0.75",
|
|
"data_read_per_join": "80"
|
|
},
|
|
"used_columns": [
|
|
"id",
|
|
"sex"
|
|
]
|
|
}
|
|
},
|
|
{
|
|
"table": {
|
|
"table_name": "t2",
|
|
"access_type": "ALL",
|
|
"rows_examined_per_scan": 7,
|
|
"rows_produced_per_join": 5,
|
|
"filtered": "14.29",
|
|
"using_join_buffer": "Block Nested Loop",
|
|
"cost_info": {
|
|
"read_cost": "0.25",
|
|
"eval_cost": "0.50",
|
|
"prefix_cost": "4.50",
|
|
"data_read_per_join": "80"
|
|
},
|
|
"used_columns": [
|
|
"user_id"
|
|
],
|
|
"attached_condition": "(`test`.`t2`.`user_id` = `test`.`u`.`id`)"
|
|
}
|
|
}
|
|
]
|
|
}
|
|
}
|
|
}
|
|
}
|
|
Warnings:
|
|
Note 1003 /* select#1 */ select `test`.`u`.`sex` AS `sex`,avg(`test`.`u`.`id`) AS `uids`,rank() OVER `w` AS `rank` from `test`.`t1` `u` join `test`.`t2` where (`test`.`t2`.`user_id` = `test`.`u`.`id`) group by `test`.`u`.`sex` window `w` AS (ORDER BY avg(`test`.`u`.`id`) )
|
|
Explicit window definition, window ordering from DISTINCT GROUP BY
|
|
EXPLAIN FORMAT=JSON SELECT sex, AVG(DISTINCT id) AS uids, RANK() OVER w `rank` FROM t1 u, t2
|
|
WHERE t2.user_id = u.id GROUP BY sex
|
|
WINDOW w AS (ORDER BY AVG(DISTINCT id) DESC) ORDER BY sex;
|
|
EXPLAIN
|
|
{
|
|
"query_block": {
|
|
"select_id": 1,
|
|
"cost_info": {
|
|
"query_cost": "19.50"
|
|
},
|
|
"ordering_operation": {
|
|
"using_filesort": true,
|
|
"cost_info": {
|
|
"sort_cost": "5.00"
|
|
},
|
|
"windowing": {
|
|
"windows": [
|
|
{
|
|
"name": "w",
|
|
"using_temporary_table": true,
|
|
"using_filesort": true,
|
|
"filesort_key": [
|
|
"avg(distinct `id`) desc"
|
|
],
|
|
"functions": [
|
|
"rank"
|
|
]
|
|
}
|
|
],
|
|
"cost_info": {
|
|
"sort_cost": "5.00"
|
|
},
|
|
"grouping_operation": {
|
|
"using_temporary_table": true,
|
|
"using_filesort": true,
|
|
"cost_info": {
|
|
"sort_cost": "5.00"
|
|
},
|
|
"buffer_result": {
|
|
"using_temporary_table": true,
|
|
"nested_loop": [
|
|
{
|
|
"table": {
|
|
"table_name": "u",
|
|
"access_type": "ALL",
|
|
"rows_examined_per_scan": 5,
|
|
"rows_produced_per_join": 5,
|
|
"filtered": "100.00",
|
|
"cost_info": {
|
|
"read_cost": "0.25",
|
|
"eval_cost": "0.50",
|
|
"prefix_cost": "0.75",
|
|
"data_read_per_join": "80"
|
|
},
|
|
"used_columns": [
|
|
"id",
|
|
"sex"
|
|
]
|
|
}
|
|
},
|
|
{
|
|
"table": {
|
|
"table_name": "t2",
|
|
"access_type": "ALL",
|
|
"rows_examined_per_scan": 7,
|
|
"rows_produced_per_join": 5,
|
|
"filtered": "14.29",
|
|
"using_join_buffer": "Block Nested Loop",
|
|
"cost_info": {
|
|
"read_cost": "0.25",
|
|
"eval_cost": "0.50",
|
|
"prefix_cost": "4.50",
|
|
"data_read_per_join": "80"
|
|
},
|
|
"used_columns": [
|
|
"user_id"
|
|
],
|
|
"attached_condition": "(`test`.`t2`.`user_id` = `test`.`u`.`id`)"
|
|
}
|
|
}
|
|
]
|
|
}
|
|
}
|
|
}
|
|
}
|
|
}
|
|
}
|
|
Warnings:
|
|
Note 1003 /* select#1 */ select `test`.`u`.`sex` AS `sex`,avg(distinct `test`.`u`.`id`) AS `uids`,rank() OVER `w` AS `rank` from `test`.`t1` `u` join `test`.`t2` where (`test`.`t2`.`user_id` = `test`.`u`.`id`) group by `test`.`u`.`sex` window `w` AS (ORDER BY avg(distinct `test`.`u`.`id`) desc ) order by `test`.`u`.`sex`
|
|
Explicit window definition, window ordering from GROUP BY, final ORDER BY
|
|
EXPLAIN FORMAT=JSON SELECT sex, AVG(id) AS uids, RANK() OVER w `rank` FROM t1 u, t2
|
|
WHERE t2.user_id = u.id GROUP BY sex
|
|
WINDOW w AS (ORDER BY AVG(id) DESC)
|
|
ORDER BY `rank` DESC;
|
|
EXPLAIN
|
|
{
|
|
"query_block": {
|
|
"select_id": 1,
|
|
"cost_info": {
|
|
"query_cost": "9.50"
|
|
},
|
|
"ordering_operation": {
|
|
"using_filesort": true,
|
|
"windowing": {
|
|
"windows": [
|
|
{
|
|
"name": "w",
|
|
"using_temporary_table": true,
|
|
"using_filesort": true,
|
|
"filesort_key": [
|
|
"avg(`id`) desc"
|
|
],
|
|
"functions": [
|
|
"rank"
|
|
]
|
|
}
|
|
],
|
|
"cost_info": {
|
|
"sort_cost": "5.00"
|
|
},
|
|
"grouping_operation": {
|
|
"using_temporary_table": true,
|
|
"using_filesort": false,
|
|
"nested_loop": [
|
|
{
|
|
"table": {
|
|
"table_name": "u",
|
|
"access_type": "ALL",
|
|
"rows_examined_per_scan": 5,
|
|
"rows_produced_per_join": 5,
|
|
"filtered": "100.00",
|
|
"cost_info": {
|
|
"read_cost": "0.25",
|
|
"eval_cost": "0.50",
|
|
"prefix_cost": "0.75",
|
|
"data_read_per_join": "80"
|
|
},
|
|
"used_columns": [
|
|
"id",
|
|
"sex"
|
|
]
|
|
}
|
|
},
|
|
{
|
|
"table": {
|
|
"table_name": "t2",
|
|
"access_type": "ALL",
|
|
"rows_examined_per_scan": 7,
|
|
"rows_produced_per_join": 5,
|
|
"filtered": "14.29",
|
|
"using_join_buffer": "Block Nested Loop",
|
|
"cost_info": {
|
|
"read_cost": "0.25",
|
|
"eval_cost": "0.50",
|
|
"prefix_cost": "4.50",
|
|
"data_read_per_join": "80"
|
|
},
|
|
"used_columns": [
|
|
"user_id"
|
|
],
|
|
"attached_condition": "(`test`.`t2`.`user_id` = `test`.`u`.`id`)"
|
|
}
|
|
}
|
|
]
|
|
}
|
|
}
|
|
}
|
|
}
|
|
}
|
|
Warnings:
|
|
Note 1003 /* select#1 */ select `test`.`u`.`sex` AS `sex`,avg(`test`.`u`.`id`) AS `uids`,rank() OVER `w` AS `rank` from `test`.`t1` `u` join `test`.`t2` where (`test`.`t2`.`user_id` = `test`.`u`.`id`) group by `test`.`u`.`sex` window `w` AS (ORDER BY avg(`test`.`u`.`id`) desc ) order by `rank` desc
|
|
EXPLAIN FORMAT=TRADITIONAL SELECT sex, AVG(id) AS uids, RANK() OVER w `rank` FROM t1 u, t2
|
|
WHERE t2.user_id = u.id GROUP BY sex
|
|
WINDOW w AS (ORDER BY AVG(id) DESC)
|
|
ORDER BY `rank` DESC;
|
|
id select_type table partitions type possible_keys key key_len ref rows filtered Extra
|
|
1 SIMPLE u NULL ALL NULL NULL NULL NULL 5 100.00 Using temporary; Using filesort
|
|
1 SIMPLE t2 NULL ALL NULL NULL NULL NULL 7 14.29 Using where; Using join buffer (Block Nested Loop)
|
|
Warnings:
|
|
Note 3598 To get information about window functions use EXPLAIN FORMAT=JSON
|
|
Note 1003 /* select#1 */ select `test`.`u`.`sex` AS `sex`,avg(`test`.`u`.`id`) AS `uids`,rank() OVER `w` AS `rank` from `test`.`t1` `u` join `test`.`t2` where (`test`.`t2`.`user_id` = `test`.`u`.`id`) group by `test`.`u`.`sex` window `w` AS (ORDER BY avg(`test`.`u`.`id`) desc ) order by `rank` desc
|
|
With NULLs
|
|
INSERT INTO t1 VALUES (10, NULL), (11, NULL);
|
|
ANALYZE TABLE t1;
|
|
Table Op Msg_type Msg_text
|
|
test.t1 analyze status OK
|
|
EXPLAIN FORMAT=JSON SELECT id, sex, RANK() OVER w, DENSE_RANK() OVER w FROM t1
|
|
WINDOW w AS (ORDER BY sex) ORDER BY id;
|
|
EXPLAIN
|
|
{
|
|
"query_block": {
|
|
"select_id": 1,
|
|
"cost_info": {
|
|
"query_cost": "14.95"
|
|
},
|
|
"ordering_operation": {
|
|
"using_filesort": true,
|
|
"cost_info": {
|
|
"sort_cost": "7.00"
|
|
},
|
|
"windowing": {
|
|
"windows": [
|
|
{
|
|
"name": "w",
|
|
"using_temporary_table": true,
|
|
"using_filesort": true,
|
|
"filesort_key": [
|
|
"`sex`"
|
|
],
|
|
"functions": [
|
|
"rank",
|
|
"dense_rank"
|
|
]
|
|
}
|
|
],
|
|
"cost_info": {
|
|
"sort_cost": "7.00"
|
|
},
|
|
"table": {
|
|
"table_name": "t1",
|
|
"access_type": "ALL",
|
|
"rows_examined_per_scan": 7,
|
|
"rows_produced_per_join": 7,
|
|
"filtered": "100.00",
|
|
"cost_info": {
|
|
"read_cost": "0.25",
|
|
"eval_cost": "0.70",
|
|
"prefix_cost": "0.95",
|
|
"data_read_per_join": "112"
|
|
},
|
|
"used_columns": [
|
|
"id",
|
|
"sex"
|
|
]
|
|
}
|
|
}
|
|
}
|
|
}
|
|
}
|
|
Warnings:
|
|
Note 1003 /* select#1 */ select `test`.`t1`.`id` AS `id`,`test`.`t1`.`sex` AS `sex`,rank() OVER `w` AS `RANK() OVER w`,dense_rank() OVER `w` AS `DENSE_RANK() OVER w` from `test`.`t1` window `w` AS (ORDER BY `test`.`t1`.`sex` ) order by `test`.`t1`.`id`
|
|
EXPLAIN FORMAT=JSON SELECT id, sex, RANK() OVER (ORDER BY sex DESC) FROM t1 ORDER BY id;
|
|
EXPLAIN
|
|
{
|
|
"query_block": {
|
|
"select_id": 1,
|
|
"cost_info": {
|
|
"query_cost": "14.95"
|
|
},
|
|
"ordering_operation": {
|
|
"using_filesort": true,
|
|
"cost_info": {
|
|
"sort_cost": "7.00"
|
|
},
|
|
"windowing": {
|
|
"windows": [
|
|
{
|
|
"name": "<unnamed window>",
|
|
"using_temporary_table": true,
|
|
"using_filesort": true,
|
|
"filesort_key": [
|
|
"`sex` desc"
|
|
],
|
|
"functions": [
|
|
"rank"
|
|
]
|
|
}
|
|
],
|
|
"cost_info": {
|
|
"sort_cost": "7.00"
|
|
},
|
|
"table": {
|
|
"table_name": "t1",
|
|
"access_type": "ALL",
|
|
"rows_examined_per_scan": 7,
|
|
"rows_produced_per_join": 7,
|
|
"filtered": "100.00",
|
|
"cost_info": {
|
|
"read_cost": "0.25",
|
|
"eval_cost": "0.70",
|
|
"prefix_cost": "0.95",
|
|
"data_read_per_join": "112"
|
|
},
|
|
"used_columns": [
|
|
"id",
|
|
"sex"
|
|
]
|
|
}
|
|
}
|
|
}
|
|
}
|
|
}
|
|
Warnings:
|
|
Note 1003 /* select#1 */ select `test`.`t1`.`id` AS `id`,`test`.`t1`.`sex` AS `sex`,rank() OVER (ORDER BY `test`.`t1`.`sex` desc ) AS `RANK() OVER (ORDER BY sex DESC)` from `test`.`t1` order by `test`.`t1`.`id`
|
|
EXPLAIN FORMAT=JSON SELECT id value,
|
|
SUM(id) OVER (ROWS UNBOUNDED PRECEDING)
|
|
FROM t1 u, t2 WHERE t2.user_id = u.id;
|
|
EXPLAIN
|
|
{
|
|
"query_block": {
|
|
"select_id": 1,
|
|
"cost_info": {
|
|
"query_cost": "6.10"
|
|
},
|
|
"windowing": {
|
|
"windows": [
|
|
{
|
|
"name": "<unnamed window>",
|
|
"functions": [
|
|
"sum"
|
|
]
|
|
}
|
|
],
|
|
"nested_loop": [
|
|
{
|
|
"table": {
|
|
"table_name": "u",
|
|
"access_type": "ALL",
|
|
"rows_examined_per_scan": 7,
|
|
"rows_produced_per_join": 7,
|
|
"filtered": "100.00",
|
|
"cost_info": {
|
|
"read_cost": "0.25",
|
|
"eval_cost": "0.70",
|
|
"prefix_cost": "0.95",
|
|
"data_read_per_join": "112"
|
|
},
|
|
"used_columns": [
|
|
"id"
|
|
]
|
|
}
|
|
},
|
|
{
|
|
"table": {
|
|
"table_name": "t2",
|
|
"access_type": "ALL",
|
|
"rows_examined_per_scan": 7,
|
|
"rows_produced_per_join": 7,
|
|
"filtered": "14.29",
|
|
"using_join_buffer": "Block Nested Loop",
|
|
"cost_info": {
|
|
"read_cost": "0.25",
|
|
"eval_cost": "0.70",
|
|
"prefix_cost": "6.10",
|
|
"data_read_per_join": "112"
|
|
},
|
|
"used_columns": [
|
|
"user_id"
|
|
],
|
|
"attached_condition": "(`test`.`t2`.`user_id` = `test`.`u`.`id`)"
|
|
}
|
|
}
|
|
]
|
|
}
|
|
}
|
|
}
|
|
Warnings:
|
|
Note 1003 /* select#1 */ select `test`.`u`.`id` AS `value`,sum(`test`.`u`.`id`) OVER (ROWS BETWEEN UNBOUNDED PRECEDING AND CURRENT ROW) AS `SUM(id) OVER (ROWS UNBOUNDED PRECEDING)` from `test`.`t1` `u` join `test`.`t2` where (`test`.`t2`.`user_id` = `test`.`u`.`id`)
|
|
Aggregate with GROUP BY arguments to window function
|
|
EXPLAIN FORMAT=JSON SELECT AVG(id) average,
|
|
SUM(AVG(id)) OVER (ROWS UNBOUNDED PRECEDING)
|
|
FROM t1 u, t2 WHERE t2.user_id = u.id GROUP BY sex;
|
|
EXPLAIN
|
|
{
|
|
"query_block": {
|
|
"select_id": 1,
|
|
"cost_info": {
|
|
"query_cost": "6.10"
|
|
},
|
|
"windowing": {
|
|
"windows": [
|
|
{
|
|
"name": "<unnamed window>",
|
|
"functions": [
|
|
"sum"
|
|
]
|
|
}
|
|
],
|
|
"grouping_operation": {
|
|
"using_temporary_table": true,
|
|
"using_filesort": false,
|
|
"nested_loop": [
|
|
{
|
|
"table": {
|
|
"table_name": "u",
|
|
"access_type": "ALL",
|
|
"rows_examined_per_scan": 7,
|
|
"rows_produced_per_join": 7,
|
|
"filtered": "100.00",
|
|
"cost_info": {
|
|
"read_cost": "0.25",
|
|
"eval_cost": "0.70",
|
|
"prefix_cost": "0.95",
|
|
"data_read_per_join": "112"
|
|
},
|
|
"used_columns": [
|
|
"id",
|
|
"sex"
|
|
]
|
|
}
|
|
},
|
|
{
|
|
"table": {
|
|
"table_name": "t2",
|
|
"access_type": "ALL",
|
|
"rows_examined_per_scan": 7,
|
|
"rows_produced_per_join": 7,
|
|
"filtered": "14.29",
|
|
"using_join_buffer": "Block Nested Loop",
|
|
"cost_info": {
|
|
"read_cost": "0.25",
|
|
"eval_cost": "0.70",
|
|
"prefix_cost": "6.10",
|
|
"data_read_per_join": "112"
|
|
},
|
|
"used_columns": [
|
|
"user_id"
|
|
],
|
|
"attached_condition": "(`test`.`t2`.`user_id` = `test`.`u`.`id`)"
|
|
}
|
|
}
|
|
]
|
|
}
|
|
}
|
|
}
|
|
}
|
|
Warnings:
|
|
Note 1003 /* select#1 */ select avg(`test`.`u`.`id`) AS `average`,sum(avg(`test`.`u`.`id`)) OVER (ROWS BETWEEN UNBOUNDED PRECEDING AND CURRENT ROW) AS `SUM(AVG(id)) OVER (ROWS UNBOUNDED PRECEDING)` from `test`.`t1` `u` join `test`.`t2` where (`test`.`t2`.`user_id` = `test`.`u`.`id`) group by `test`.`u`.`sex`
|
|
Aggregate with GROUP BY in window's ORDER BY clause, with aggregate present in
|
|
SELECT list or not.
|
|
EXPLAIN FORMAT=JSON SELECT sex, AVG(id), RANK() OVER (ORDER BY AVG(id) DESC) FROM t1 GROUP BY sex ORDER BY sex;
|
|
EXPLAIN
|
|
{
|
|
"query_block": {
|
|
"select_id": 1,
|
|
"cost_info": {
|
|
"query_cost": "14.95"
|
|
},
|
|
"ordering_operation": {
|
|
"using_filesort": true,
|
|
"cost_info": {
|
|
"sort_cost": "7.00"
|
|
},
|
|
"windowing": {
|
|
"windows": [
|
|
{
|
|
"name": "<unnamed window>",
|
|
"using_temporary_table": true,
|
|
"using_filesort": true,
|
|
"filesort_key": [
|
|
"avg(`id`) desc"
|
|
],
|
|
"functions": [
|
|
"rank"
|
|
]
|
|
}
|
|
],
|
|
"cost_info": {
|
|
"sort_cost": "7.00"
|
|
},
|
|
"grouping_operation": {
|
|
"using_temporary_table": true,
|
|
"using_filesort": false,
|
|
"table": {
|
|
"table_name": "t1",
|
|
"access_type": "ALL",
|
|
"rows_examined_per_scan": 7,
|
|
"rows_produced_per_join": 7,
|
|
"filtered": "100.00",
|
|
"cost_info": {
|
|
"read_cost": "0.25",
|
|
"eval_cost": "0.70",
|
|
"prefix_cost": "0.95",
|
|
"data_read_per_join": "112"
|
|
},
|
|
"used_columns": [
|
|
"id",
|
|
"sex"
|
|
]
|
|
}
|
|
}
|
|
}
|
|
}
|
|
}
|
|
}
|
|
Warnings:
|
|
Note 1003 /* select#1 */ select `test`.`t1`.`sex` AS `sex`,avg(`test`.`t1`.`id`) AS `AVG(id)`,rank() OVER (ORDER BY avg(`test`.`t1`.`id`) desc ) AS `RANK() OVER (ORDER BY AVG(id) DESC)` from `test`.`t1` group by `test`.`t1`.`sex` order by `test`.`t1`.`sex`
|
|
EXPLAIN FORMAT=JSON SELECT sex, RANK() OVER (ORDER BY AVG(id) DESC) FROM t1 GROUP BY sex ORDER BY sex;
|
|
EXPLAIN
|
|
{
|
|
"query_block": {
|
|
"select_id": 1,
|
|
"cost_info": {
|
|
"query_cost": "14.95"
|
|
},
|
|
"ordering_operation": {
|
|
"using_filesort": true,
|
|
"cost_info": {
|
|
"sort_cost": "7.00"
|
|
},
|
|
"windowing": {
|
|
"windows": [
|
|
{
|
|
"name": "<unnamed window>",
|
|
"using_temporary_table": true,
|
|
"using_filesort": true,
|
|
"filesort_key": [
|
|
"avg(`id`) desc"
|
|
],
|
|
"functions": [
|
|
"rank"
|
|
]
|
|
}
|
|
],
|
|
"cost_info": {
|
|
"sort_cost": "7.00"
|
|
},
|
|
"grouping_operation": {
|
|
"using_temporary_table": true,
|
|
"using_filesort": false,
|
|
"table": {
|
|
"table_name": "t1",
|
|
"access_type": "ALL",
|
|
"rows_examined_per_scan": 7,
|
|
"rows_produced_per_join": 7,
|
|
"filtered": "100.00",
|
|
"cost_info": {
|
|
"read_cost": "0.25",
|
|
"eval_cost": "0.70",
|
|
"prefix_cost": "0.95",
|
|
"data_read_per_join": "112"
|
|
},
|
|
"used_columns": [
|
|
"id",
|
|
"sex"
|
|
]
|
|
}
|
|
}
|
|
}
|
|
}
|
|
}
|
|
}
|
|
Warnings:
|
|
Note 1003 /* select#1 */ select `test`.`t1`.`sex` AS `sex`,rank() OVER (ORDER BY avg(`test`.`t1`.`id`) desc ) AS `RANK() OVER (ORDER BY AVG(id) DESC)` from `test`.`t1` group by `test`.`t1`.`sex` order by `test`.`t1`.`sex`
|
|
Implicit group aggregate arguments to window function and in
|
|
window's ORDER BY clause
|
|
EXPLAIN FORMAT=JSON SELECT RANK() OVER (ORDER BY AVG(id)) FROM t1;
|
|
EXPLAIN
|
|
{
|
|
"query_block": {
|
|
"select_id": 1,
|
|
"cost_info": {
|
|
"query_cost": "0.95"
|
|
},
|
|
"table": {
|
|
"table_name": "t1",
|
|
"access_type": "ALL",
|
|
"rows_examined_per_scan": 7,
|
|
"rows_produced_per_join": 7,
|
|
"filtered": "100.00",
|
|
"cost_info": {
|
|
"read_cost": "0.25",
|
|
"eval_cost": "0.70",
|
|
"prefix_cost": "0.95",
|
|
"data_read_per_join": "112"
|
|
},
|
|
"used_columns": [
|
|
"id"
|
|
]
|
|
}
|
|
}
|
|
}
|
|
Warnings:
|
|
Note 1003 /* select#1 */ select rank() OVER (ORDER BY avg(`test`.`t1`.`id`) ) AS `RANK() OVER (ORDER BY AVG(id))` from `test`.`t1`
|
|
EXPLAIN FORMAT=JSON SELECT AVG(id), RANK() OVER (ORDER BY AVG(id)) FROM t1;
|
|
EXPLAIN
|
|
{
|
|
"query_block": {
|
|
"select_id": 1,
|
|
"cost_info": {
|
|
"query_cost": "0.95"
|
|
},
|
|
"table": {
|
|
"table_name": "t1",
|
|
"access_type": "ALL",
|
|
"rows_examined_per_scan": 7,
|
|
"rows_produced_per_join": 7,
|
|
"filtered": "100.00",
|
|
"cost_info": {
|
|
"read_cost": "0.25",
|
|
"eval_cost": "0.70",
|
|
"prefix_cost": "0.95",
|
|
"data_read_per_join": "112"
|
|
},
|
|
"used_columns": [
|
|
"id"
|
|
]
|
|
}
|
|
}
|
|
}
|
|
Warnings:
|
|
Note 1003 /* select#1 */ select avg(`test`.`t1`.`id`) AS `AVG(id)`,rank() OVER (ORDER BY avg(`test`.`t1`.`id`) ) AS `RANK() OVER (ORDER BY AVG(id))` from `test`.`t1`
|
|
EXPLAIN FORMAT=JSON SELECT AVG(id), SUM(AVG(id)) OVER (ORDER BY AVG(id) ROWS UNBOUNDED PRECEDING) FROM t1;
|
|
EXPLAIN
|
|
{
|
|
"query_block": {
|
|
"select_id": 1,
|
|
"cost_info": {
|
|
"query_cost": "0.95"
|
|
},
|
|
"table": {
|
|
"table_name": "t1",
|
|
"access_type": "ALL",
|
|
"rows_examined_per_scan": 7,
|
|
"rows_produced_per_join": 7,
|
|
"filtered": "100.00",
|
|
"cost_info": {
|
|
"read_cost": "0.25",
|
|
"eval_cost": "0.70",
|
|
"prefix_cost": "0.95",
|
|
"data_read_per_join": "112"
|
|
},
|
|
"used_columns": [
|
|
"id"
|
|
]
|
|
}
|
|
}
|
|
}
|
|
Warnings:
|
|
Note 1003 /* select#1 */ select avg(`test`.`t1`.`id`) AS `AVG(id)`,sum(avg(`test`.`t1`.`id`)) OVER (ORDER BY avg(`test`.`t1`.`id`) ROWS BETWEEN UNBOUNDED PRECEDING AND CURRENT ROW) AS `SUM(AVG(id)) OVER (ORDER BY AVG(id) ROWS UNBOUNDED PRECEDING)` from `test`.`t1`
|
|
Several partitions, several window functions over the same window
|
|
EXPLAIN FORMAT=JSON SELECT sex, id, RANK() OVER (PARTITION BY sex ORDER BY id DESC) FROM t1;
|
|
EXPLAIN
|
|
{
|
|
"query_block": {
|
|
"select_id": 1,
|
|
"cost_info": {
|
|
"query_cost": "7.95"
|
|
},
|
|
"windowing": {
|
|
"windows": [
|
|
{
|
|
"name": "<unnamed window>",
|
|
"using_filesort": true,
|
|
"filesort_key": [
|
|
"`sex`",
|
|
"`id` desc"
|
|
],
|
|
"functions": [
|
|
"rank"
|
|
]
|
|
}
|
|
],
|
|
"cost_info": {
|
|
"sort_cost": "7.00"
|
|
},
|
|
"table": {
|
|
"table_name": "t1",
|
|
"access_type": "ALL",
|
|
"rows_examined_per_scan": 7,
|
|
"rows_produced_per_join": 7,
|
|
"filtered": "100.00",
|
|
"cost_info": {
|
|
"read_cost": "0.25",
|
|
"eval_cost": "0.70",
|
|
"prefix_cost": "0.95",
|
|
"data_read_per_join": "112"
|
|
},
|
|
"used_columns": [
|
|
"id",
|
|
"sex"
|
|
]
|
|
}
|
|
}
|
|
}
|
|
}
|
|
Warnings:
|
|
Note 1003 /* select#1 */ select `test`.`t1`.`sex` AS `sex`,`test`.`t1`.`id` AS `id`,rank() OVER (PARTITION BY `test`.`t1`.`sex` ORDER BY `test`.`t1`.`id` desc ) AS `RANK() OVER (PARTITION BY sex ORDER BY id DESC)` from `test`.`t1`
|
|
EXPLAIN FORMAT=JSON SELECT sex, id, RANK() OVER (PARTITION BY sex ORDER BY id ASC) FROM t1;
|
|
EXPLAIN
|
|
{
|
|
"query_block": {
|
|
"select_id": 1,
|
|
"cost_info": {
|
|
"query_cost": "7.95"
|
|
},
|
|
"windowing": {
|
|
"windows": [
|
|
{
|
|
"name": "<unnamed window>",
|
|
"using_filesort": true,
|
|
"filesort_key": [
|
|
"`sex`",
|
|
"`id`"
|
|
],
|
|
"functions": [
|
|
"rank"
|
|
]
|
|
}
|
|
],
|
|
"cost_info": {
|
|
"sort_cost": "7.00"
|
|
},
|
|
"table": {
|
|
"table_name": "t1",
|
|
"access_type": "ALL",
|
|
"rows_examined_per_scan": 7,
|
|
"rows_produced_per_join": 7,
|
|
"filtered": "100.00",
|
|
"cost_info": {
|
|
"read_cost": "0.25",
|
|
"eval_cost": "0.70",
|
|
"prefix_cost": "0.95",
|
|
"data_read_per_join": "112"
|
|
},
|
|
"used_columns": [
|
|
"id",
|
|
"sex"
|
|
]
|
|
}
|
|
}
|
|
}
|
|
}
|
|
Warnings:
|
|
Note 1003 /* select#1 */ select `test`.`t1`.`sex` AS `sex`,`test`.`t1`.`id` AS `id`,rank() OVER (PARTITION BY `test`.`t1`.`sex` ORDER BY `test`.`t1`.`id` ) AS `RANK() OVER (PARTITION BY sex ORDER BY id ASC)` from `test`.`t1`
|
|
EXPLAIN FORMAT=JSON SELECT sex, id, SUM(id) OVER w summ, RANK() OVER w `rank` FROM t1
|
|
WINDOW w AS (PARTITION BY sex ORDER BY id ASC ROWS UNBOUNDED PRECEDING);
|
|
EXPLAIN
|
|
{
|
|
"query_block": {
|
|
"select_id": 1,
|
|
"cost_info": {
|
|
"query_cost": "7.95"
|
|
},
|
|
"windowing": {
|
|
"windows": [
|
|
{
|
|
"name": "w",
|
|
"using_filesort": true,
|
|
"filesort_key": [
|
|
"`sex`",
|
|
"`id`"
|
|
],
|
|
"functions": [
|
|
"sum",
|
|
"rank"
|
|
]
|
|
}
|
|
],
|
|
"cost_info": {
|
|
"sort_cost": "7.00"
|
|
},
|
|
"table": {
|
|
"table_name": "t1",
|
|
"access_type": "ALL",
|
|
"rows_examined_per_scan": 7,
|
|
"rows_produced_per_join": 7,
|
|
"filtered": "100.00",
|
|
"cost_info": {
|
|
"read_cost": "0.25",
|
|
"eval_cost": "0.70",
|
|
"prefix_cost": "0.95",
|
|
"data_read_per_join": "112"
|
|
},
|
|
"used_columns": [
|
|
"id",
|
|
"sex"
|
|
]
|
|
}
|
|
}
|
|
}
|
|
}
|
|
Warnings:
|
|
Note 3599 Window function 'rank' ignores the frame clause of window 'w' and aggregates over the whole partition
|
|
Note 1003 /* select#1 */ select `test`.`t1`.`sex` AS `sex`,`test`.`t1`.`id` AS `id`,sum(`test`.`t1`.`id`) OVER `w` AS `summ`,rank() OVER `w` AS `rank` from `test`.`t1` window `w` AS (PARTITION BY `test`.`t1`.`sex` ORDER BY `test`.`t1`.`id` ROWS BETWEEN UNBOUNDED PRECEDING AND CURRENT ROW)
|
|
EXPLAIN FORMAT=JSON SELECT sex, id, SUM(id) OVER w summ, RANK() OVER w `rank` FROM t1
|
|
WINDOW w AS (PARTITION BY sex ORDER BY id ASC ROWS UNBOUNDED PRECEDING) ORDER BY summ;
|
|
EXPLAIN
|
|
{
|
|
"query_block": {
|
|
"select_id": 1,
|
|
"cost_info": {
|
|
"query_cost": "14.95"
|
|
},
|
|
"ordering_operation": {
|
|
"using_filesort": true,
|
|
"cost_info": {
|
|
"sort_cost": "7.00"
|
|
},
|
|
"windowing": {
|
|
"windows": [
|
|
{
|
|
"name": "w",
|
|
"using_temporary_table": true,
|
|
"using_filesort": true,
|
|
"filesort_key": [
|
|
"`sex`",
|
|
"`id`"
|
|
],
|
|
"functions": [
|
|
"sum",
|
|
"rank"
|
|
]
|
|
}
|
|
],
|
|
"cost_info": {
|
|
"sort_cost": "7.00"
|
|
},
|
|
"table": {
|
|
"table_name": "t1",
|
|
"access_type": "ALL",
|
|
"rows_examined_per_scan": 7,
|
|
"rows_produced_per_join": 7,
|
|
"filtered": "100.00",
|
|
"cost_info": {
|
|
"read_cost": "0.25",
|
|
"eval_cost": "0.70",
|
|
"prefix_cost": "0.95",
|
|
"data_read_per_join": "112"
|
|
},
|
|
"used_columns": [
|
|
"id",
|
|
"sex"
|
|
]
|
|
}
|
|
}
|
|
}
|
|
}
|
|
}
|
|
Warnings:
|
|
Note 3599 Window function 'rank' ignores the frame clause of window 'w' and aggregates over the whole partition
|
|
Note 1003 /* select#1 */ select `test`.`t1`.`sex` AS `sex`,`test`.`t1`.`id` AS `id`,sum(`test`.`t1`.`id`) OVER `w` AS `summ`,rank() OVER `w` AS `rank` from `test`.`t1` window `w` AS (PARTITION BY `test`.`t1`.`sex` ORDER BY `test`.`t1`.`id` ROWS BETWEEN UNBOUNDED PRECEDING AND CURRENT ROW) order by `summ`
|
|
CREATE TABLE t(d decimal(10,2), date DATE);
|
|
INSERT INTO t values (10.4, '2002-06-09'),
|
|
(20.5, '2002-06-09'),
|
|
(10.4, '2002-06-10'),
|
|
(3, '2002-06-09'),
|
|
(40.2, '2015-08-01'),
|
|
(40.2, '2002-06-09'),
|
|
(5, '2015-08-01');
|
|
ANALYZE TABLE t;
|
|
Table Op Msg_type Msg_text
|
|
test.t analyze status OK
|
|
EXPLAIN FORMAT=JSON SELECT * FROM (SELECT RANK() OVER (ORDER BY d) AS `rank`, d, date FROM t) alias ORDER BY `rank`, d, date;
|
|
EXPLAIN
|
|
{
|
|
"query_block": {
|
|
"select_id": 1,
|
|
"cost_info": {
|
|
"query_cost": "10.29"
|
|
},
|
|
"ordering_operation": {
|
|
"using_filesort": true,
|
|
"cost_info": {
|
|
"sort_cost": "7.00"
|
|
},
|
|
"table": {
|
|
"table_name": "alias",
|
|
"access_type": "ALL",
|
|
"rows_examined_per_scan": 7,
|
|
"rows_produced_per_join": 7,
|
|
"filtered": "100.00",
|
|
"cost_info": {
|
|
"read_cost": "2.59",
|
|
"eval_cost": "0.70",
|
|
"prefix_cost": "3.29",
|
|
"data_read_per_join": "168"
|
|
},
|
|
"used_columns": [
|
|
"rank",
|
|
"d",
|
|
"date"
|
|
],
|
|
"materialized_from_subquery": {
|
|
"using_temporary_table": true,
|
|
"dependent": false,
|
|
"cacheable": true,
|
|
"query_block": {
|
|
"select_id": 2,
|
|
"cost_info": {
|
|
"query_cost": "7.95"
|
|
},
|
|
"windowing": {
|
|
"windows": [
|
|
{
|
|
"name": "<unnamed window>",
|
|
"using_filesort": true,
|
|
"filesort_key": [
|
|
"`d`"
|
|
],
|
|
"functions": [
|
|
"rank"
|
|
]
|
|
}
|
|
],
|
|
"cost_info": {
|
|
"sort_cost": "7.00"
|
|
},
|
|
"table": {
|
|
"table_name": "t",
|
|
"access_type": "ALL",
|
|
"rows_examined_per_scan": 7,
|
|
"rows_produced_per_join": 7,
|
|
"filtered": "100.00",
|
|
"cost_info": {
|
|
"read_cost": "0.25",
|
|
"eval_cost": "0.70",
|
|
"prefix_cost": "0.95",
|
|
"data_read_per_join": "112"
|
|
},
|
|
"used_columns": [
|
|
"d",
|
|
"date"
|
|
]
|
|
}
|
|
}
|
|
}
|
|
}
|
|
}
|
|
}
|
|
}
|
|
}
|
|
Warnings:
|
|
Note 1003 /* select#1 */ select `alias`.`rank` AS `rank`,`alias`.`d` AS `d`,`alias`.`date` AS `date` from (/* select#2 */ select rank() OVER (ORDER BY `test`.`t`.`d` ) AS `rank`,`test`.`t`.`d` AS `d`,`test`.`t`.`date` AS `date` from `test`.`t`) `alias` order by `alias`.`rank`,`alias`.`d`,`alias`.`date`
|
|
EXPLAIN FORMAT=JSON SELECT * FROM (SELECT RANK() OVER (ORDER BY date) AS `rank`, date, d FROM t) alias ORDER BY `rank`, d DESC;
|
|
EXPLAIN
|
|
{
|
|
"query_block": {
|
|
"select_id": 1,
|
|
"cost_info": {
|
|
"query_cost": "10.29"
|
|
},
|
|
"ordering_operation": {
|
|
"using_filesort": true,
|
|
"cost_info": {
|
|
"sort_cost": "7.00"
|
|
},
|
|
"table": {
|
|
"table_name": "alias",
|
|
"access_type": "ALL",
|
|
"rows_examined_per_scan": 7,
|
|
"rows_produced_per_join": 7,
|
|
"filtered": "100.00",
|
|
"cost_info": {
|
|
"read_cost": "2.59",
|
|
"eval_cost": "0.70",
|
|
"prefix_cost": "3.29",
|
|
"data_read_per_join": "168"
|
|
},
|
|
"used_columns": [
|
|
"rank",
|
|
"date",
|
|
"d"
|
|
],
|
|
"materialized_from_subquery": {
|
|
"using_temporary_table": true,
|
|
"dependent": false,
|
|
"cacheable": true,
|
|
"query_block": {
|
|
"select_id": 2,
|
|
"cost_info": {
|
|
"query_cost": "7.95"
|
|
},
|
|
"windowing": {
|
|
"windows": [
|
|
{
|
|
"name": "<unnamed window>",
|
|
"using_filesort": true,
|
|
"filesort_key": [
|
|
"`date`"
|
|
],
|
|
"functions": [
|
|
"rank"
|
|
]
|
|
}
|
|
],
|
|
"cost_info": {
|
|
"sort_cost": "7.00"
|
|
},
|
|
"table": {
|
|
"table_name": "t",
|
|
"access_type": "ALL",
|
|
"rows_examined_per_scan": 7,
|
|
"rows_produced_per_join": 7,
|
|
"filtered": "100.00",
|
|
"cost_info": {
|
|
"read_cost": "0.25",
|
|
"eval_cost": "0.70",
|
|
"prefix_cost": "0.95",
|
|
"data_read_per_join": "112"
|
|
},
|
|
"used_columns": [
|
|
"d",
|
|
"date"
|
|
]
|
|
}
|
|
}
|
|
}
|
|
}
|
|
}
|
|
}
|
|
}
|
|
}
|
|
Warnings:
|
|
Note 1003 /* select#1 */ select `alias`.`rank` AS `rank`,`alias`.`date` AS `date`,`alias`.`d` AS `d` from (/* select#2 */ select rank() OVER (ORDER BY `test`.`t`.`date` ) AS `rank`,`test`.`t`.`date` AS `date`,`test`.`t`.`d` AS `d` from `test`.`t`) `alias` order by `alias`.`rank`,`alias`.`d` desc
|
|
DROP TABLE t;
|
|
Check that SUM stays that same when it sees NULL values
|
|
CREATE TABLE t(i INT, j INT);
|
|
INSERT INTO t VALUES (1,NULL),
|
|
(1,NULL),
|
|
(1,1),
|
|
(1,NULL),
|
|
(1,2),
|
|
(2,1),
|
|
(2,2),
|
|
(2,NULL),
|
|
(2,NULL);
|
|
ANALYZE TABLE t;
|
|
Table Op Msg_type Msg_text
|
|
test.t analyze status OK
|
|
EXPLAIN FORMAT=JSON SELECT i, j, SUM(j) OVER (PARTITION BY i ORDER BY j ROWS UNBOUNDED PRECEDING) FROM t;
|
|
EXPLAIN
|
|
{
|
|
"query_block": {
|
|
"select_id": 1,
|
|
"cost_info": {
|
|
"query_cost": "10.15"
|
|
},
|
|
"windowing": {
|
|
"windows": [
|
|
{
|
|
"name": "<unnamed window>",
|
|
"using_filesort": true,
|
|
"filesort_key": [
|
|
"`i`",
|
|
"`j`"
|
|
],
|
|
"functions": [
|
|
"sum"
|
|
]
|
|
}
|
|
],
|
|
"cost_info": {
|
|
"sort_cost": "9.00"
|
|
},
|
|
"table": {
|
|
"table_name": "t",
|
|
"access_type": "ALL",
|
|
"rows_examined_per_scan": 9,
|
|
"rows_produced_per_join": 9,
|
|
"filtered": "100.00",
|
|
"cost_info": {
|
|
"read_cost": "0.25",
|
|
"eval_cost": "0.90",
|
|
"prefix_cost": "1.15",
|
|
"data_read_per_join": "144"
|
|
},
|
|
"used_columns": [
|
|
"i",
|
|
"j"
|
|
]
|
|
}
|
|
}
|
|
}
|
|
}
|
|
Warnings:
|
|
Note 1003 /* select#1 */ select `test`.`t`.`i` AS `i`,`test`.`t`.`j` AS `j`,sum(`test`.`t`.`j`) OVER (PARTITION BY `test`.`t`.`i` ORDER BY `test`.`t`.`j` ROWS BETWEEN UNBOUNDED PRECEDING AND CURRENT ROW) AS `SUM(j) OVER (PARTITION BY i ORDER BY j ROWS UNBOUNDED PRECEDING)` from `test`.`t`
|
|
EXPLAIN FORMAT=JSON SELECT SUM(id), SUM(SUM(id)) OVER (ORDER BY sex ROWS UNBOUNDED PRECEDING) FROM t1,t2 WHERE t1.id=t2.user_id GROUP BY sex;
|
|
EXPLAIN
|
|
{
|
|
"query_block": {
|
|
"select_id": 1,
|
|
"cost_info": {
|
|
"query_cost": "13.10"
|
|
},
|
|
"windowing": {
|
|
"windows": [
|
|
{
|
|
"name": "<unnamed window>",
|
|
"using_filesort": true,
|
|
"filesort_key": [
|
|
"`sex`"
|
|
],
|
|
"functions": [
|
|
"sum"
|
|
]
|
|
}
|
|
],
|
|
"cost_info": {
|
|
"sort_cost": "7.00"
|
|
},
|
|
"grouping_operation": {
|
|
"using_temporary_table": true,
|
|
"using_filesort": false,
|
|
"nested_loop": [
|
|
{
|
|
"table": {
|
|
"table_name": "t1",
|
|
"access_type": "ALL",
|
|
"rows_examined_per_scan": 7,
|
|
"rows_produced_per_join": 7,
|
|
"filtered": "100.00",
|
|
"cost_info": {
|
|
"read_cost": "0.25",
|
|
"eval_cost": "0.70",
|
|
"prefix_cost": "0.95",
|
|
"data_read_per_join": "112"
|
|
},
|
|
"used_columns": [
|
|
"id",
|
|
"sex"
|
|
]
|
|
}
|
|
},
|
|
{
|
|
"table": {
|
|
"table_name": "t2",
|
|
"access_type": "ALL",
|
|
"rows_examined_per_scan": 7,
|
|
"rows_produced_per_join": 7,
|
|
"filtered": "14.29",
|
|
"using_join_buffer": "Block Nested Loop",
|
|
"cost_info": {
|
|
"read_cost": "0.25",
|
|
"eval_cost": "0.70",
|
|
"prefix_cost": "6.10",
|
|
"data_read_per_join": "112"
|
|
},
|
|
"used_columns": [
|
|
"user_id"
|
|
],
|
|
"attached_condition": "(`test`.`t2`.`user_id` = `test`.`t1`.`id`)"
|
|
}
|
|
}
|
|
]
|
|
}
|
|
}
|
|
}
|
|
}
|
|
Warnings:
|
|
Note 1003 /* select#1 */ select sum(`test`.`t1`.`id`) AS `SUM(id)`,sum(sum(`test`.`t1`.`id`)) OVER (ORDER BY `test`.`t1`.`sex` ROWS BETWEEN UNBOUNDED PRECEDING AND CURRENT ROW) AS `SUM(SUM(id)) OVER (ORDER BY sex ROWS UNBOUNDED PRECEDING)` from `test`.`t1` join `test`.`t2` where (`test`.`t2`.`user_id` = `test`.`t1`.`id`) group by `test`.`t1`.`sex`
|
|
EXPLAIN FORMAT=JSON SELECT RANK() OVER w FROM t1,t2 WHERE t1.id=t2.user_id WINDOW w AS (PARTITION BY id ORDER BY sex);
|
|
EXPLAIN
|
|
{
|
|
"query_block": {
|
|
"select_id": 1,
|
|
"cost_info": {
|
|
"query_cost": "13.10"
|
|
},
|
|
"windowing": {
|
|
"windows": [
|
|
{
|
|
"name": "w",
|
|
"using_filesort": true,
|
|
"filesort_key": [
|
|
"`id`",
|
|
"`sex`"
|
|
],
|
|
"functions": [
|
|
"rank"
|
|
]
|
|
}
|
|
],
|
|
"cost_info": {
|
|
"sort_cost": "7.00"
|
|
},
|
|
"buffer_result": {
|
|
"using_temporary_table": true,
|
|
"nested_loop": [
|
|
{
|
|
"table": {
|
|
"table_name": "t1",
|
|
"access_type": "ALL",
|
|
"rows_examined_per_scan": 7,
|
|
"rows_produced_per_join": 7,
|
|
"filtered": "100.00",
|
|
"cost_info": {
|
|
"read_cost": "0.25",
|
|
"eval_cost": "0.70",
|
|
"prefix_cost": "0.95",
|
|
"data_read_per_join": "112"
|
|
},
|
|
"used_columns": [
|
|
"id",
|
|
"sex"
|
|
]
|
|
}
|
|
},
|
|
{
|
|
"table": {
|
|
"table_name": "t2",
|
|
"access_type": "ALL",
|
|
"rows_examined_per_scan": 7,
|
|
"rows_produced_per_join": 7,
|
|
"filtered": "14.29",
|
|
"using_join_buffer": "Block Nested Loop",
|
|
"cost_info": {
|
|
"read_cost": "0.25",
|
|
"eval_cost": "0.70",
|
|
"prefix_cost": "6.10",
|
|
"data_read_per_join": "112"
|
|
},
|
|
"used_columns": [
|
|
"user_id"
|
|
],
|
|
"attached_condition": "(`test`.`t2`.`user_id` = `test`.`t1`.`id`)"
|
|
}
|
|
}
|
|
]
|
|
}
|
|
}
|
|
}
|
|
}
|
|
Warnings:
|
|
Note 1003 /* select#1 */ select rank() OVER `w` AS `RANK() OVER w` from `test`.`t1` join `test`.`t2` where (`test`.`t2`.`user_id` = `test`.`t1`.`id`) window `w` AS (PARTITION BY `test`.`t1`.`id` ORDER BY `test`.`t1`.`sex` )
|
|
EXPLAIN FORMAT=JSON SELECT RANK() OVER w FROM (SELECT * FROM t1,t2 WHERE t1.id=t2.user_id) t WINDOW w AS (PARTITION BY id ORDER BY sex);
|
|
EXPLAIN
|
|
{
|
|
"query_block": {
|
|
"select_id": 1,
|
|
"cost_info": {
|
|
"query_cost": "13.10"
|
|
},
|
|
"windowing": {
|
|
"windows": [
|
|
{
|
|
"name": "w",
|
|
"using_filesort": true,
|
|
"filesort_key": [
|
|
"`id`",
|
|
"`sex`"
|
|
],
|
|
"functions": [
|
|
"rank"
|
|
]
|
|
}
|
|
],
|
|
"cost_info": {
|
|
"sort_cost": "7.00"
|
|
},
|
|
"buffer_result": {
|
|
"using_temporary_table": true,
|
|
"nested_loop": [
|
|
{
|
|
"table": {
|
|
"table_name": "t1",
|
|
"access_type": "ALL",
|
|
"rows_examined_per_scan": 7,
|
|
"rows_produced_per_join": 7,
|
|
"filtered": "100.00",
|
|
"cost_info": {
|
|
"read_cost": "0.25",
|
|
"eval_cost": "0.70",
|
|
"prefix_cost": "0.95",
|
|
"data_read_per_join": "112"
|
|
},
|
|
"used_columns": [
|
|
"id",
|
|
"sex"
|
|
]
|
|
}
|
|
},
|
|
{
|
|
"table": {
|
|
"table_name": "t2",
|
|
"access_type": "ALL",
|
|
"rows_examined_per_scan": 7,
|
|
"rows_produced_per_join": 7,
|
|
"filtered": "14.29",
|
|
"using_join_buffer": "Block Nested Loop",
|
|
"cost_info": {
|
|
"read_cost": "0.25",
|
|
"eval_cost": "0.70",
|
|
"prefix_cost": "6.10",
|
|
"data_read_per_join": "112"
|
|
},
|
|
"used_columns": [
|
|
"user_id"
|
|
],
|
|
"attached_condition": "(`test`.`t2`.`user_id` = `test`.`t1`.`id`)"
|
|
}
|
|
}
|
|
]
|
|
}
|
|
}
|
|
}
|
|
}
|
|
Warnings:
|
|
Note 1003 /* select#1 */ select rank() OVER `w` AS `RANK() OVER w` from `test`.`t1` join `test`.`t2` where (`test`.`t2`.`user_id` = `test`.`t1`.`id`) window `w` AS (PARTITION BY `test`.`t1`.`id` ORDER BY `test`.`t1`.`sex` )
|
|
Check that aggregate window functions that reference columns not in the SELECT list work
|
|
EXPLAIN FORMAT=JSON SELECT SUM(id) OVER (PARTITION BY sex ORDER BY id ROWS UNBOUNDED PRECEDING) summ, sex FROM t1;
|
|
EXPLAIN
|
|
{
|
|
"query_block": {
|
|
"select_id": 1,
|
|
"cost_info": {
|
|
"query_cost": "7.95"
|
|
},
|
|
"windowing": {
|
|
"windows": [
|
|
{
|
|
"name": "<unnamed window>",
|
|
"using_filesort": true,
|
|
"filesort_key": [
|
|
"`sex`",
|
|
"`id`"
|
|
],
|
|
"functions": [
|
|
"sum"
|
|
]
|
|
}
|
|
],
|
|
"cost_info": {
|
|
"sort_cost": "7.00"
|
|
},
|
|
"table": {
|
|
"table_name": "t1",
|
|
"access_type": "ALL",
|
|
"rows_examined_per_scan": 7,
|
|
"rows_produced_per_join": 7,
|
|
"filtered": "100.00",
|
|
"cost_info": {
|
|
"read_cost": "0.25",
|
|
"eval_cost": "0.70",
|
|
"prefix_cost": "0.95",
|
|
"data_read_per_join": "112"
|
|
},
|
|
"used_columns": [
|
|
"id",
|
|
"sex"
|
|
]
|
|
}
|
|
}
|
|
}
|
|
}
|
|
Warnings:
|
|
Note 1003 /* select#1 */ select sum(`test`.`t1`.`id`) OVER (PARTITION BY `test`.`t1`.`sex` ORDER BY `test`.`t1`.`id` ROWS BETWEEN UNBOUNDED PRECEDING AND CURRENT ROW) AS `summ`,`test`.`t1`.`sex` AS `sex` from `test`.`t1`
|
|
----------------------------------------------------------------------
|
|
- Some ROW_NUMBER tests
|
|
----------------------------------------------------------------------
|
|
EXPLAIN FORMAT=JSON SELECT user_id, ROW_NUMBER() OVER (PARTITION BY user_id) FROM t2;
|
|
EXPLAIN
|
|
{
|
|
"query_block": {
|
|
"select_id": 1,
|
|
"cost_info": {
|
|
"query_cost": "7.95"
|
|
},
|
|
"windowing": {
|
|
"windows": [
|
|
{
|
|
"name": "<unnamed window>",
|
|
"using_filesort": true,
|
|
"filesort_key": [
|
|
"`user_id`"
|
|
],
|
|
"functions": [
|
|
"row_number"
|
|
]
|
|
}
|
|
],
|
|
"cost_info": {
|
|
"sort_cost": "7.00"
|
|
},
|
|
"table": {
|
|
"table_name": "t2",
|
|
"access_type": "ALL",
|
|
"rows_examined_per_scan": 7,
|
|
"rows_produced_per_join": 7,
|
|
"filtered": "100.00",
|
|
"cost_info": {
|
|
"read_cost": "0.25",
|
|
"eval_cost": "0.70",
|
|
"prefix_cost": "0.95",
|
|
"data_read_per_join": "112"
|
|
},
|
|
"used_columns": [
|
|
"user_id"
|
|
]
|
|
}
|
|
}
|
|
}
|
|
}
|
|
Warnings:
|
|
Note 1003 /* select#1 */ select `test`.`t2`.`user_id` AS `user_id`,row_number() OVER (PARTITION BY `test`.`t2`.`user_id` ) AS `ROW_NUMBER() OVER (PARTITION BY user_id)` from `test`.`t2`
|
|
EXPLAIN FORMAT=JSON SELECT * FROM t1,t2 WHERE t1.id=t2.user_id;
|
|
EXPLAIN
|
|
{
|
|
"query_block": {
|
|
"select_id": 1,
|
|
"cost_info": {
|
|
"query_cost": "6.10"
|
|
},
|
|
"nested_loop": [
|
|
{
|
|
"table": {
|
|
"table_name": "t1",
|
|
"access_type": "ALL",
|
|
"rows_examined_per_scan": 7,
|
|
"rows_produced_per_join": 7,
|
|
"filtered": "100.00",
|
|
"cost_info": {
|
|
"read_cost": "0.25",
|
|
"eval_cost": "0.70",
|
|
"prefix_cost": "0.95",
|
|
"data_read_per_join": "112"
|
|
},
|
|
"used_columns": [
|
|
"id",
|
|
"sex"
|
|
]
|
|
}
|
|
},
|
|
{
|
|
"table": {
|
|
"table_name": "t2",
|
|
"access_type": "ALL",
|
|
"rows_examined_per_scan": 7,
|
|
"rows_produced_per_join": 7,
|
|
"filtered": "14.29",
|
|
"using_join_buffer": "Block Nested Loop",
|
|
"cost_info": {
|
|
"read_cost": "0.25",
|
|
"eval_cost": "0.70",
|
|
"prefix_cost": "6.10",
|
|
"data_read_per_join": "112"
|
|
},
|
|
"used_columns": [
|
|
"user_id",
|
|
"date"
|
|
],
|
|
"attached_condition": "(`test`.`t2`.`user_id` = `test`.`t1`.`id`)"
|
|
}
|
|
}
|
|
]
|
|
}
|
|
}
|
|
Warnings:
|
|
Note 1003 /* select#1 */ select `test`.`t1`.`id` AS `id`,`test`.`t1`.`sex` AS `sex`,`test`.`t2`.`user_id` AS `user_id`,`test`.`t2`.`date` AS `date` from `test`.`t1` join `test`.`t2` where (`test`.`t2`.`user_id` = `test`.`t1`.`id`)
|
|
EXPLAIN FORMAT=JSON SELECT sex, id, date, ROW_NUMBER() OVER w AS row_no, RANK() OVER w AS `rank` FROM t1,t2
|
|
WHERE t1.id=t2.user_id
|
|
WINDOW w AS (PARTITION BY id ORDER BY sex);
|
|
EXPLAIN
|
|
{
|
|
"query_block": {
|
|
"select_id": 1,
|
|
"cost_info": {
|
|
"query_cost": "13.10"
|
|
},
|
|
"windowing": {
|
|
"windows": [
|
|
{
|
|
"name": "w",
|
|
"using_filesort": true,
|
|
"filesort_key": [
|
|
"`id`",
|
|
"`sex`"
|
|
],
|
|
"functions": [
|
|
"row_number",
|
|
"rank"
|
|
]
|
|
}
|
|
],
|
|
"cost_info": {
|
|
"sort_cost": "7.00"
|
|
},
|
|
"buffer_result": {
|
|
"using_temporary_table": true,
|
|
"nested_loop": [
|
|
{
|
|
"table": {
|
|
"table_name": "t1",
|
|
"access_type": "ALL",
|
|
"rows_examined_per_scan": 7,
|
|
"rows_produced_per_join": 7,
|
|
"filtered": "100.00",
|
|
"cost_info": {
|
|
"read_cost": "0.25",
|
|
"eval_cost": "0.70",
|
|
"prefix_cost": "0.95",
|
|
"data_read_per_join": "112"
|
|
},
|
|
"used_columns": [
|
|
"id",
|
|
"sex"
|
|
]
|
|
}
|
|
},
|
|
{
|
|
"table": {
|
|
"table_name": "t2",
|
|
"access_type": "ALL",
|
|
"rows_examined_per_scan": 7,
|
|
"rows_produced_per_join": 7,
|
|
"filtered": "14.29",
|
|
"using_join_buffer": "Block Nested Loop",
|
|
"cost_info": {
|
|
"read_cost": "0.25",
|
|
"eval_cost": "0.70",
|
|
"prefix_cost": "6.10",
|
|
"data_read_per_join": "112"
|
|
},
|
|
"used_columns": [
|
|
"user_id",
|
|
"date"
|
|
],
|
|
"attached_condition": "(`test`.`t2`.`user_id` = `test`.`t1`.`id`)"
|
|
}
|
|
}
|
|
]
|
|
}
|
|
}
|
|
}
|
|
}
|
|
Warnings:
|
|
Note 1003 /* select#1 */ select `test`.`t1`.`sex` AS `sex`,`test`.`t1`.`id` AS `id`,`test`.`t2`.`date` AS `date`,row_number() OVER `w` AS `row_no`,rank() OVER `w` AS `rank` from `test`.`t1` join `test`.`t2` where (`test`.`t2`.`user_id` = `test`.`t1`.`id`) window `w` AS (PARTITION BY `test`.`t1`.`id` ORDER BY `test`.`t1`.`sex` )
|
|
EXPLAIN FORMAT=JSON SELECT sex, id, date, ROW_NUMBER() OVER w AS row_no, RANK() OVER w AS `rank` FROM t1,t2
|
|
WHERE t1.id=t2.user_id
|
|
WINDOW w AS (PARTITION BY date ORDER BY id);
|
|
EXPLAIN
|
|
{
|
|
"query_block": {
|
|
"select_id": 1,
|
|
"cost_info": {
|
|
"query_cost": "13.10"
|
|
},
|
|
"windowing": {
|
|
"windows": [
|
|
{
|
|
"name": "w",
|
|
"using_filesort": true,
|
|
"filesort_key": [
|
|
"`date`",
|
|
"`id`"
|
|
],
|
|
"functions": [
|
|
"row_number",
|
|
"rank"
|
|
]
|
|
}
|
|
],
|
|
"cost_info": {
|
|
"sort_cost": "7.00"
|
|
},
|
|
"buffer_result": {
|
|
"using_temporary_table": true,
|
|
"nested_loop": [
|
|
{
|
|
"table": {
|
|
"table_name": "t1",
|
|
"access_type": "ALL",
|
|
"rows_examined_per_scan": 7,
|
|
"rows_produced_per_join": 7,
|
|
"filtered": "100.00",
|
|
"cost_info": {
|
|
"read_cost": "0.25",
|
|
"eval_cost": "0.70",
|
|
"prefix_cost": "0.95",
|
|
"data_read_per_join": "112"
|
|
},
|
|
"used_columns": [
|
|
"id",
|
|
"sex"
|
|
]
|
|
}
|
|
},
|
|
{
|
|
"table": {
|
|
"table_name": "t2",
|
|
"access_type": "ALL",
|
|
"rows_examined_per_scan": 7,
|
|
"rows_produced_per_join": 7,
|
|
"filtered": "14.29",
|
|
"using_join_buffer": "Block Nested Loop",
|
|
"cost_info": {
|
|
"read_cost": "0.25",
|
|
"eval_cost": "0.70",
|
|
"prefix_cost": "6.10",
|
|
"data_read_per_join": "112"
|
|
},
|
|
"used_columns": [
|
|
"user_id",
|
|
"date"
|
|
],
|
|
"attached_condition": "(`test`.`t2`.`user_id` = `test`.`t1`.`id`)"
|
|
}
|
|
}
|
|
]
|
|
}
|
|
}
|
|
}
|
|
}
|
|
Warnings:
|
|
Note 1003 /* select#1 */ select `test`.`t1`.`sex` AS `sex`,`test`.`t1`.`id` AS `id`,`test`.`t2`.`date` AS `date`,row_number() OVER `w` AS `row_no`,rank() OVER `w` AS `rank` from `test`.`t1` join `test`.`t2` where (`test`.`t2`.`user_id` = `test`.`t1`.`id`) window `w` AS (PARTITION BY `test`.`t2`.`date` ORDER BY `test`.`t1`.`id` )
|
|
----------------------------------------------------------------------
|
|
- Window function in subquery
|
|
----------------------------------------------------------------------
|
|
EXPLAIN FORMAT=JSON SELECT date,id, RANK() OVER w AS `rank` FROM t1,t2 WINDOW w AS (PARTITION BY date ORDER BY id);
|
|
EXPLAIN
|
|
{
|
|
"query_block": {
|
|
"select_id": 1,
|
|
"cost_info": {
|
|
"query_cost": "55.10"
|
|
},
|
|
"windowing": {
|
|
"windows": [
|
|
{
|
|
"name": "w",
|
|
"using_filesort": true,
|
|
"filesort_key": [
|
|
"`date`",
|
|
"`id`"
|
|
],
|
|
"functions": [
|
|
"rank"
|
|
]
|
|
}
|
|
],
|
|
"cost_info": {
|
|
"sort_cost": "49.00"
|
|
},
|
|
"buffer_result": {
|
|
"using_temporary_table": true,
|
|
"nested_loop": [
|
|
{
|
|
"table": {
|
|
"table_name": "t1",
|
|
"access_type": "ALL",
|
|
"rows_examined_per_scan": 7,
|
|
"rows_produced_per_join": 7,
|
|
"filtered": "100.00",
|
|
"cost_info": {
|
|
"read_cost": "0.25",
|
|
"eval_cost": "0.70",
|
|
"prefix_cost": "0.95",
|
|
"data_read_per_join": "112"
|
|
},
|
|
"used_columns": [
|
|
"id"
|
|
]
|
|
}
|
|
},
|
|
{
|
|
"table": {
|
|
"table_name": "t2",
|
|
"access_type": "ALL",
|
|
"rows_examined_per_scan": 7,
|
|
"rows_produced_per_join": 49,
|
|
"filtered": "100.00",
|
|
"using_join_buffer": "Block Nested Loop",
|
|
"cost_info": {
|
|
"read_cost": "0.25",
|
|
"eval_cost": "4.90",
|
|
"prefix_cost": "6.10",
|
|
"data_read_per_join": "784"
|
|
},
|
|
"used_columns": [
|
|
"date"
|
|
]
|
|
}
|
|
}
|
|
]
|
|
}
|
|
}
|
|
}
|
|
}
|
|
Warnings:
|
|
Note 1003 /* select#1 */ select `test`.`t2`.`date` AS `date`,`test`.`t1`.`id` AS `id`,rank() OVER `w` AS `rank` from `test`.`t1` join `test`.`t2` window `w` AS (PARTITION BY `test`.`t2`.`date` ORDER BY `test`.`t1`.`id` )
|
|
EXPLAIN FORMAT=JSON SELECT * from (SELECT date,id, RANK() OVER w AS `rank` FROM t1,t2 WINDOW w AS (PARTITION BY date ORDER BY id)) t;
|
|
EXPLAIN
|
|
{
|
|
"query_block": {
|
|
"select_id": 1,
|
|
"cost_info": {
|
|
"query_cost": "8.01"
|
|
},
|
|
"table": {
|
|
"table_name": "t",
|
|
"access_type": "ALL",
|
|
"rows_examined_per_scan": 49,
|
|
"rows_produced_per_join": 49,
|
|
"filtered": "100.00",
|
|
"cost_info": {
|
|
"read_cost": "3.11",
|
|
"eval_cost": "4.90",
|
|
"prefix_cost": "8.01",
|
|
"data_read_per_join": "1K"
|
|
},
|
|
"used_columns": [
|
|
"date",
|
|
"id",
|
|
"rank"
|
|
],
|
|
"materialized_from_subquery": {
|
|
"using_temporary_table": true,
|
|
"dependent": false,
|
|
"cacheable": true,
|
|
"query_block": {
|
|
"select_id": 2,
|
|
"cost_info": {
|
|
"query_cost": "55.10"
|
|
},
|
|
"windowing": {
|
|
"windows": [
|
|
{
|
|
"name": "w",
|
|
"using_filesort": true,
|
|
"filesort_key": [
|
|
"`date`",
|
|
"`id`"
|
|
],
|
|
"functions": [
|
|
"rank"
|
|
]
|
|
}
|
|
],
|
|
"cost_info": {
|
|
"sort_cost": "49.00"
|
|
},
|
|
"buffer_result": {
|
|
"using_temporary_table": true,
|
|
"nested_loop": [
|
|
{
|
|
"table": {
|
|
"table_name": "t1",
|
|
"access_type": "ALL",
|
|
"rows_examined_per_scan": 7,
|
|
"rows_produced_per_join": 7,
|
|
"filtered": "100.00",
|
|
"cost_info": {
|
|
"read_cost": "0.25",
|
|
"eval_cost": "0.70",
|
|
"prefix_cost": "0.95",
|
|
"data_read_per_join": "112"
|
|
},
|
|
"used_columns": [
|
|
"id"
|
|
]
|
|
}
|
|
},
|
|
{
|
|
"table": {
|
|
"table_name": "t2",
|
|
"access_type": "ALL",
|
|
"rows_examined_per_scan": 7,
|
|
"rows_produced_per_join": 49,
|
|
"filtered": "100.00",
|
|
"using_join_buffer": "Block Nested Loop",
|
|
"cost_info": {
|
|
"read_cost": "0.25",
|
|
"eval_cost": "4.90",
|
|
"prefix_cost": "6.10",
|
|
"data_read_per_join": "784"
|
|
},
|
|
"used_columns": [
|
|
"date"
|
|
]
|
|
}
|
|
}
|
|
]
|
|
}
|
|
}
|
|
}
|
|
}
|
|
}
|
|
}
|
|
}
|
|
Warnings:
|
|
Note 1003 /* select#1 */ select `t`.`date` AS `date`,`t`.`id` AS `id`,`t`.`rank` AS `rank` from (/* select#2 */ select `test`.`t2`.`date` AS `date`,`test`.`t1`.`id` AS `id`,rank() OVER `w` AS `rank` from `test`.`t1` join `test`.`t2` window `w` AS (PARTITION BY `test`.`t2`.`date` ORDER BY `test`.`t1`.`id` ) ) `t`
|
|
----------------------------------------------------------------------
|
|
- Window function in parent and subquery
|
|
----------------------------------------------------------------------
|
|
EXPLAIN FORMAT=JSON SELECT t.*, SUM(t.`rank`) OVER (ROWS UNBOUNDED PRECEDING) FROM
|
|
(SELECT sex, id, date, ROW_NUMBER() OVER w AS row_no, RANK() OVER w AS `rank` FROM t1,t2
|
|
WHERE t1.id=t2.user_id
|
|
WINDOW w AS (PARTITION BY date ORDER BY id)
|
|
) AS t;
|
|
EXPLAIN
|
|
{
|
|
"query_block": {
|
|
"select_id": 1,
|
|
"cost_info": {
|
|
"query_cost": "3.29"
|
|
},
|
|
"windowing": {
|
|
"windows": [
|
|
{
|
|
"name": "<unnamed window>",
|
|
"functions": [
|
|
"sum"
|
|
]
|
|
}
|
|
],
|
|
"table": {
|
|
"table_name": "t",
|
|
"access_type": "ALL",
|
|
"rows_examined_per_scan": 7,
|
|
"rows_produced_per_join": 7,
|
|
"filtered": "100.00",
|
|
"cost_info": {
|
|
"read_cost": "2.59",
|
|
"eval_cost": "0.70",
|
|
"prefix_cost": "3.29",
|
|
"data_read_per_join": "280"
|
|
},
|
|
"used_columns": [
|
|
"sex",
|
|
"id",
|
|
"date",
|
|
"row_no",
|
|
"rank"
|
|
],
|
|
"materialized_from_subquery": {
|
|
"using_temporary_table": true,
|
|
"dependent": false,
|
|
"cacheable": true,
|
|
"query_block": {
|
|
"select_id": 2,
|
|
"cost_info": {
|
|
"query_cost": "13.10"
|
|
},
|
|
"windowing": {
|
|
"windows": [
|
|
{
|
|
"name": "w",
|
|
"using_filesort": true,
|
|
"filesort_key": [
|
|
"`date`",
|
|
"`id`"
|
|
],
|
|
"functions": [
|
|
"row_number",
|
|
"rank"
|
|
]
|
|
}
|
|
],
|
|
"cost_info": {
|
|
"sort_cost": "7.00"
|
|
},
|
|
"buffer_result": {
|
|
"using_temporary_table": true,
|
|
"nested_loop": [
|
|
{
|
|
"table": {
|
|
"table_name": "t1",
|
|
"access_type": "ALL",
|
|
"rows_examined_per_scan": 7,
|
|
"rows_produced_per_join": 7,
|
|
"filtered": "100.00",
|
|
"cost_info": {
|
|
"read_cost": "0.25",
|
|
"eval_cost": "0.70",
|
|
"prefix_cost": "0.95",
|
|
"data_read_per_join": "112"
|
|
},
|
|
"used_columns": [
|
|
"id",
|
|
"sex"
|
|
]
|
|
}
|
|
},
|
|
{
|
|
"table": {
|
|
"table_name": "t2",
|
|
"access_type": "ALL",
|
|
"rows_examined_per_scan": 7,
|
|
"rows_produced_per_join": 7,
|
|
"filtered": "14.29",
|
|
"using_join_buffer": "Block Nested Loop",
|
|
"cost_info": {
|
|
"read_cost": "0.25",
|
|
"eval_cost": "0.70",
|
|
"prefix_cost": "6.10",
|
|
"data_read_per_join": "112"
|
|
},
|
|
"used_columns": [
|
|
"user_id",
|
|
"date"
|
|
],
|
|
"attached_condition": "(`test`.`t2`.`user_id` = `test`.`t1`.`id`)"
|
|
}
|
|
}
|
|
]
|
|
}
|
|
}
|
|
}
|
|
}
|
|
}
|
|
}
|
|
}
|
|
}
|
|
Warnings:
|
|
Note 1003 /* select#1 */ select `t`.`sex` AS `sex`,`t`.`id` AS `id`,`t`.`date` AS `date`,`t`.`row_no` AS `row_no`,`t`.`rank` AS `rank`,sum(`t`.`rank`) OVER (ROWS BETWEEN UNBOUNDED PRECEDING AND CURRENT ROW) AS `SUM(t.``rank``) OVER (ROWS UNBOUNDED PRECEDING)` from (/* select#2 */ select `test`.`t1`.`sex` AS `sex`,`test`.`t1`.`id` AS `id`,`test`.`t2`.`date` AS `date`,row_number() OVER `w` AS `row_no`,rank() OVER `w` AS `rank` from `test`.`t1` join `test`.`t2` where (`test`.`t2`.`user_id` = `test`.`t1`.`id`) window `w` AS (PARTITION BY `test`.`t2`.`date` ORDER BY `test`.`t1`.`id` ) ) `t`
|
|
----------------------------------------------------------------------
|
|
- Multiple windows
|
|
----------------------------------------------------------------------
|
|
EXPLAIN FORMAT=JSON SELECT t1.*, RANK() OVER (ORDER BY sex), SUM(id) OVER (ORDER BY sex,id ROWS UNBOUNDED PRECEDING) FROM t1;
|
|
EXPLAIN
|
|
{
|
|
"query_block": {
|
|
"select_id": 1,
|
|
"cost_info": {
|
|
"query_cost": "14.95"
|
|
},
|
|
"windowing": {
|
|
"windows": [
|
|
{
|
|
"name": "<unnamed window>",
|
|
"definition_position": 1,
|
|
"using_temporary_table": true,
|
|
"using_filesort": true,
|
|
"filesort_key": [
|
|
"`sex`"
|
|
],
|
|
"functions": [
|
|
"rank"
|
|
]
|
|
},
|
|
{
|
|
"name": "<unnamed window>",
|
|
"definition_position": 2,
|
|
"last_executed_window": true,
|
|
"using_filesort": true,
|
|
"filesort_key": [
|
|
"`sex`",
|
|
"`id`"
|
|
],
|
|
"functions": [
|
|
"sum"
|
|
]
|
|
}
|
|
],
|
|
"cost_info": {
|
|
"sort_cost": "14.00"
|
|
},
|
|
"table": {
|
|
"table_name": "t1",
|
|
"access_type": "ALL",
|
|
"rows_examined_per_scan": 7,
|
|
"rows_produced_per_join": 7,
|
|
"filtered": "100.00",
|
|
"cost_info": {
|
|
"read_cost": "0.25",
|
|
"eval_cost": "0.70",
|
|
"prefix_cost": "0.95",
|
|
"data_read_per_join": "112"
|
|
},
|
|
"used_columns": [
|
|
"id",
|
|
"sex"
|
|
]
|
|
}
|
|
}
|
|
}
|
|
}
|
|
Warnings:
|
|
Note 1003 /* select#1 */ select `test`.`t1`.`id` AS `id`,`test`.`t1`.`sex` AS `sex`,rank() OVER (ORDER BY `test`.`t1`.`sex` ) AS `RANK() OVER (ORDER BY sex)`,sum(`test`.`t1`.`id`) OVER (ORDER BY `test`.`t1`.`sex`,`test`.`t1`.`id` ROWS BETWEEN UNBOUNDED PRECEDING AND CURRENT ROW) AS `SUM(id) OVER (ORDER BY sex,id ROWS UNBOUNDED PRECEDING)` from `test`.`t1`
|
|
EXPLAIN FORMAT=JSON SELECT * from (SELECT t1.*, SUM(id) OVER (ROWS UNBOUNDED PRECEDING), RANK() OVER (ORDER BY sex) FROM t1) alias ORDER BY id;
|
|
EXPLAIN
|
|
{
|
|
"query_block": {
|
|
"select_id": 1,
|
|
"cost_info": {
|
|
"query_cost": "10.29"
|
|
},
|
|
"ordering_operation": {
|
|
"using_filesort": true,
|
|
"cost_info": {
|
|
"sort_cost": "7.00"
|
|
},
|
|
"table": {
|
|
"table_name": "alias",
|
|
"access_type": "ALL",
|
|
"rows_examined_per_scan": 7,
|
|
"rows_produced_per_join": 7,
|
|
"filtered": "100.00",
|
|
"cost_info": {
|
|
"read_cost": "2.59",
|
|
"eval_cost": "0.70",
|
|
"prefix_cost": "3.29",
|
|
"data_read_per_join": "280"
|
|
},
|
|
"used_columns": [
|
|
"id",
|
|
"sex",
|
|
"SUM(id) OVER (ROWS UNBOUNDED PRECEDING)",
|
|
"RANK() OVER (ORDER BY sex)"
|
|
],
|
|
"materialized_from_subquery": {
|
|
"using_temporary_table": true,
|
|
"dependent": false,
|
|
"cacheable": true,
|
|
"query_block": {
|
|
"select_id": 2,
|
|
"cost_info": {
|
|
"query_cost": "7.95"
|
|
},
|
|
"windowing": {
|
|
"windows": [
|
|
{
|
|
"name": "<unnamed window>",
|
|
"definition_position": 1,
|
|
"using_temporary_table": true,
|
|
"functions": [
|
|
"sum"
|
|
]
|
|
},
|
|
{
|
|
"name": "<unnamed window>",
|
|
"definition_position": 2,
|
|
"last_executed_window": true,
|
|
"using_filesort": true,
|
|
"filesort_key": [
|
|
"`sex`"
|
|
],
|
|
"functions": [
|
|
"rank"
|
|
]
|
|
}
|
|
],
|
|
"cost_info": {
|
|
"sort_cost": "7.00"
|
|
},
|
|
"table": {
|
|
"table_name": "t1",
|
|
"access_type": "ALL",
|
|
"rows_examined_per_scan": 7,
|
|
"rows_produced_per_join": 7,
|
|
"filtered": "100.00",
|
|
"cost_info": {
|
|
"read_cost": "0.25",
|
|
"eval_cost": "0.70",
|
|
"prefix_cost": "0.95",
|
|
"data_read_per_join": "112"
|
|
},
|
|
"used_columns": [
|
|
"id",
|
|
"sex"
|
|
]
|
|
}
|
|
}
|
|
}
|
|
}
|
|
}
|
|
}
|
|
}
|
|
}
|
|
Warnings:
|
|
Note 1003 /* select#1 */ select `alias`.`id` AS `id`,`alias`.`sex` AS `sex`,`alias`.`SUM(id) OVER (ROWS UNBOUNDED PRECEDING)` AS `SUM(id) OVER (ROWS UNBOUNDED PRECEDING)`,`alias`.`RANK() OVER (ORDER BY sex)` AS `RANK() OVER (ORDER BY sex)` from (/* select#2 */ select `test`.`t1`.`id` AS `id`,`test`.`t1`.`sex` AS `sex`,sum(`test`.`t1`.`id`) OVER (ROWS BETWEEN UNBOUNDED PRECEDING AND CURRENT ROW) AS `SUM(id) OVER (ROWS UNBOUNDED PRECEDING)`,rank() OVER (ORDER BY `test`.`t1`.`sex` ) AS `RANK() OVER (ORDER BY sex)` from `test`.`t1`) `alias` order by `alias`.`id`
|
|
EXPLAIN FORMAT=JSON SELECT t1.*, SUM(id) OVER (ORDER BY id ROWS UNBOUNDED PRECEDING),
|
|
RANK() OVER (ORDER BY sex,id),
|
|
ROW_NUMBER() OVER (ORDER BY sex,id)
|
|
FROM t1;
|
|
EXPLAIN
|
|
{
|
|
"query_block": {
|
|
"select_id": 1,
|
|
"cost_info": {
|
|
"query_cost": "14.95"
|
|
},
|
|
"windowing": {
|
|
"windows": [
|
|
{
|
|
"name": "<unnamed window>",
|
|
"definition_position": 1,
|
|
"using_temporary_table": true,
|
|
"using_filesort": true,
|
|
"filesort_key": [
|
|
"`id`"
|
|
],
|
|
"functions": [
|
|
"sum"
|
|
]
|
|
},
|
|
{
|
|
"name": "<unnamed window>",
|
|
"definition_position": 2,
|
|
"using_temporary_table": true,
|
|
"using_filesort": true,
|
|
"filesort_key": [
|
|
"`sex`",
|
|
"`id`"
|
|
],
|
|
"functions": [
|
|
"rank"
|
|
]
|
|
},
|
|
{
|
|
"name": "<unnamed window>",
|
|
"definition_position": 3,
|
|
"last_executed_window": true,
|
|
"functions": [
|
|
"row_number"
|
|
]
|
|
}
|
|
],
|
|
"cost_info": {
|
|
"sort_cost": "14.00"
|
|
},
|
|
"table": {
|
|
"table_name": "t1",
|
|
"access_type": "ALL",
|
|
"rows_examined_per_scan": 7,
|
|
"rows_produced_per_join": 7,
|
|
"filtered": "100.00",
|
|
"cost_info": {
|
|
"read_cost": "0.25",
|
|
"eval_cost": "0.70",
|
|
"prefix_cost": "0.95",
|
|
"data_read_per_join": "112"
|
|
},
|
|
"used_columns": [
|
|
"id",
|
|
"sex"
|
|
]
|
|
}
|
|
}
|
|
}
|
|
}
|
|
Warnings:
|
|
Note 1003 /* select#1 */ select `test`.`t1`.`id` AS `id`,`test`.`t1`.`sex` AS `sex`,sum(`test`.`t1`.`id`) OVER (ORDER BY `test`.`t1`.`id` ROWS BETWEEN UNBOUNDED PRECEDING AND CURRENT ROW) AS `SUM(id) OVER (ORDER BY id ROWS UNBOUNDED PRECEDING)`,rank() OVER (ORDER BY `test`.`t1`.`sex`,`test`.`t1`.`id` ) AS `RANK() OVER (ORDER BY sex,id)`,row_number() OVER (ORDER BY `test`.`t1`.`sex`,`test`.`t1`.`id` ) AS `ROW_NUMBER() OVER (ORDER BY sex,id)` from `test`.`t1`
|
|
a little more windows + subquery
|
|
EXPLAIN FORMAT=JSON SELECT t.*, SUM(id + r00 + r01) OVER (ORDER BY id ROWS UNBOUNDED PRECEDING) AS s FROM (
|
|
SELECT t1.*,
|
|
RANK() OVER (ORDER BY sex) AS r00,
|
|
RANK() OVER (ORDER BY sex DESC) AS r01,
|
|
RANK() OVER (ORDER BY sex, id DESC) AS r02,
|
|
RANK() OVER (PARTITION BY id ORDER BY sex) AS r03,
|
|
RANK() OVER (ORDER BY sex) AS r04,
|
|
RANK() OVER (ORDER BY sex) AS r05,
|
|
RANK() OVER (ORDER BY sex) AS r06,
|
|
RANK() OVER (ORDER BY sex) AS r07,
|
|
RANK() OVER (ORDER BY sex) AS r08,
|
|
RANK() OVER (ORDER BY sex) AS r09,
|
|
RANK() OVER (ORDER BY sex) AS r10,
|
|
RANK() OVER (ORDER BY sex) AS r11,
|
|
RANK() OVER (ORDER BY sex) AS r12,
|
|
RANK() OVER (ORDER BY sex) AS r13,
|
|
RANK() OVER (ORDER BY sex) AS r14
|
|
FROM t1) t;
|
|
EXPLAIN
|
|
{
|
|
"query_block": {
|
|
"select_id": 1,
|
|
"cost_info": {
|
|
"query_cost": "10.29"
|
|
},
|
|
"windowing": {
|
|
"windows": [
|
|
{
|
|
"name": "<unnamed window>",
|
|
"using_filesort": true,
|
|
"filesort_key": [
|
|
"`id`"
|
|
],
|
|
"functions": [
|
|
"sum"
|
|
]
|
|
}
|
|
],
|
|
"cost_info": {
|
|
"sort_cost": "7.00"
|
|
},
|
|
"table": {
|
|
"table_name": "t",
|
|
"access_type": "ALL",
|
|
"rows_examined_per_scan": 7,
|
|
"rows_produced_per_join": 7,
|
|
"filtered": "100.00",
|
|
"cost_info": {
|
|
"read_cost": "2.59",
|
|
"eval_cost": "0.70",
|
|
"prefix_cost": "3.29",
|
|
"data_read_per_join": "952"
|
|
},
|
|
"used_columns": [
|
|
"id",
|
|
"sex",
|
|
"r00",
|
|
"r01",
|
|
"r02",
|
|
"r03",
|
|
"r04",
|
|
"r05",
|
|
"r06",
|
|
"r07",
|
|
"r08",
|
|
"r09",
|
|
"r10",
|
|
"r11",
|
|
"r12",
|
|
"r13",
|
|
"r14"
|
|
],
|
|
"materialized_from_subquery": {
|
|
"using_temporary_table": true,
|
|
"dependent": false,
|
|
"cacheable": true,
|
|
"query_block": {
|
|
"select_id": 2,
|
|
"cost_info": {
|
|
"query_cost": "28.95"
|
|
},
|
|
"windowing": {
|
|
"windows": [
|
|
{
|
|
"name": "<unnamed window>",
|
|
"definition_position": 1,
|
|
"using_temporary_table": true,
|
|
"using_filesort": true,
|
|
"filesort_key": [
|
|
"`sex`"
|
|
],
|
|
"functions": [
|
|
"rank"
|
|
]
|
|
},
|
|
{
|
|
"name": "<unnamed window>",
|
|
"definition_position": 5,
|
|
"using_temporary_table": true,
|
|
"functions": [
|
|
"rank"
|
|
]
|
|
},
|
|
{
|
|
"name": "<unnamed window>",
|
|
"definition_position": 6,
|
|
"using_temporary_table": true,
|
|
"functions": [
|
|
"rank"
|
|
]
|
|
},
|
|
{
|
|
"name": "<unnamed window>",
|
|
"definition_position": 7,
|
|
"using_temporary_table": true,
|
|
"functions": [
|
|
"rank"
|
|
]
|
|
},
|
|
{
|
|
"name": "<unnamed window>",
|
|
"definition_position": 8,
|
|
"using_temporary_table": true,
|
|
"functions": [
|
|
"rank"
|
|
]
|
|
},
|
|
{
|
|
"name": "<unnamed window>",
|
|
"definition_position": 9,
|
|
"using_temporary_table": true,
|
|
"functions": [
|
|
"rank"
|
|
]
|
|
},
|
|
{
|
|
"name": "<unnamed window>",
|
|
"definition_position": 10,
|
|
"using_temporary_table": true,
|
|
"functions": [
|
|
"rank"
|
|
]
|
|
},
|
|
{
|
|
"name": "<unnamed window>",
|
|
"definition_position": 11,
|
|
"using_temporary_table": true,
|
|
"functions": [
|
|
"rank"
|
|
]
|
|
},
|
|
{
|
|
"name": "<unnamed window>",
|
|
"definition_position": 12,
|
|
"using_temporary_table": true,
|
|
"functions": [
|
|
"rank"
|
|
]
|
|
},
|
|
{
|
|
"name": "<unnamed window>",
|
|
"definition_position": 13,
|
|
"using_temporary_table": true,
|
|
"functions": [
|
|
"rank"
|
|
]
|
|
},
|
|
{
|
|
"name": "<unnamed window>",
|
|
"definition_position": 14,
|
|
"using_temporary_table": true,
|
|
"functions": [
|
|
"rank"
|
|
]
|
|
},
|
|
{
|
|
"name": "<unnamed window>",
|
|
"definition_position": 15,
|
|
"using_temporary_table": true,
|
|
"functions": [
|
|
"rank"
|
|
]
|
|
},
|
|
{
|
|
"name": "<unnamed window>",
|
|
"definition_position": 4,
|
|
"using_temporary_table": true,
|
|
"using_filesort": true,
|
|
"filesort_key": [
|
|
"`id`",
|
|
"`sex`"
|
|
],
|
|
"functions": [
|
|
"rank"
|
|
]
|
|
},
|
|
{
|
|
"name": "<unnamed window>",
|
|
"definition_position": 2,
|
|
"using_temporary_table": true,
|
|
"using_filesort": true,
|
|
"filesort_key": [
|
|
"`sex` desc"
|
|
],
|
|
"functions": [
|
|
"rank"
|
|
]
|
|
},
|
|
{
|
|
"name": "<unnamed window>",
|
|
"definition_position": 3,
|
|
"last_executed_window": true,
|
|
"using_filesort": true,
|
|
"filesort_key": [
|
|
"`sex`",
|
|
"`id` desc"
|
|
],
|
|
"functions": [
|
|
"rank"
|
|
]
|
|
}
|
|
],
|
|
"cost_info": {
|
|
"sort_cost": "28.00"
|
|
},
|
|
"table": {
|
|
"table_name": "t1",
|
|
"access_type": "ALL",
|
|
"rows_examined_per_scan": 7,
|
|
"rows_produced_per_join": 7,
|
|
"filtered": "100.00",
|
|
"cost_info": {
|
|
"read_cost": "0.25",
|
|
"eval_cost": "0.70",
|
|
"prefix_cost": "0.95",
|
|
"data_read_per_join": "112"
|
|
},
|
|
"used_columns": [
|
|
"id",
|
|
"sex"
|
|
]
|
|
}
|
|
}
|
|
}
|
|
}
|
|
}
|
|
}
|
|
}
|
|
}
|
|
Warnings:
|
|
Note 1003 /* select#1 */ select `t`.`id` AS `id`,`t`.`sex` AS `sex`,`t`.`r00` AS `r00`,`t`.`r01` AS `r01`,`t`.`r02` AS `r02`,`t`.`r03` AS `r03`,`t`.`r04` AS `r04`,`t`.`r05` AS `r05`,`t`.`r06` AS `r06`,`t`.`r07` AS `r07`,`t`.`r08` AS `r08`,`t`.`r09` AS `r09`,`t`.`r10` AS `r10`,`t`.`r11` AS `r11`,`t`.`r12` AS `r12`,`t`.`r13` AS `r13`,`t`.`r14` AS `r14`,sum(((`t`.`id` + `t`.`r00`) + `t`.`r01`)) OVER (ORDER BY `t`.`id` ROWS BETWEEN UNBOUNDED PRECEDING AND CURRENT ROW) AS `s` from (/* select#2 */ select `test`.`t1`.`id` AS `id`,`test`.`t1`.`sex` AS `sex`,rank() OVER (ORDER BY `test`.`t1`.`sex` ) AS `r00`,rank() OVER (ORDER BY `test`.`t1`.`sex` desc ) AS `r01`,rank() OVER (ORDER BY `test`.`t1`.`sex`,`test`.`t1`.`id` desc ) AS `r02`,rank() OVER (PARTITION BY `test`.`t1`.`id` ORDER BY `test`.`t1`.`sex` ) AS `r03`,rank() OVER (ORDER BY `test`.`t1`.`sex` ) AS `r04`,rank() OVER (ORDER BY `test`.`t1`.`sex` ) AS `r05`,rank() OVER (ORDER BY `test`.`t1`.`sex` ) AS `r06`,rank() OVER (ORDER BY `test`.`t1`.`sex` ) AS `r07`,rank() OVER (ORDER BY `test`.`t1`.`sex` ) AS `r08`,rank() OVER (ORDER BY `test`.`t1`.`sex` ) AS `r09`,rank() OVER (ORDER BY `test`.`t1`.`sex` ) AS `r10`,rank() OVER (ORDER BY `test`.`t1`.`sex` ) AS `r11`,rank() OVER (ORDER BY `test`.`t1`.`sex` ) AS `r12`,rank() OVER (ORDER BY `test`.`t1`.`sex` ) AS `r13`,rank() OVER (ORDER BY `test`.`t1`.`sex` ) AS `r14` from `test`.`t1`) `t`
|
|
With LIMIT
|
|
EXPLAIN FORMAT=JSON SELECT t.*, SUM(id + r00 + r01) OVER (ORDER BY id ROWS UNBOUNDED PRECEDING) AS s FROM (
|
|
SELECT t1.*,
|
|
RANK() OVER (ORDER BY sex) AS r00,
|
|
RANK() OVER (ORDER BY sex DESC) AS r01,
|
|
RANK() OVER (ORDER BY sex, id DESC) AS r02,
|
|
RANK() OVER (PARTITION BY id ORDER BY sex) AS r03,
|
|
RANK() OVER (ORDER BY sex) AS r04,
|
|
RANK() OVER (ORDER BY sex) AS r05,
|
|
RANK() OVER (ORDER BY sex) AS r06,
|
|
RANK() OVER (ORDER BY sex) AS r07,
|
|
RANK() OVER (ORDER BY sex) AS r08,
|
|
RANK() OVER (ORDER BY sex) AS r09,
|
|
RANK() OVER (ORDER BY sex) AS r10,
|
|
RANK() OVER (ORDER BY sex) AS r11,
|
|
RANK() OVER (ORDER BY sex) AS r12,
|
|
RANK() OVER (ORDER BY sex) AS r13,
|
|
RANK() OVER (ORDER BY sex) AS r14
|
|
FROM t1 LIMIT 4) t;
|
|
EXPLAIN
|
|
{
|
|
"query_block": {
|
|
"select_id": 1,
|
|
"cost_info": {
|
|
"query_cost": "6.95"
|
|
},
|
|
"windowing": {
|
|
"windows": [
|
|
{
|
|
"name": "<unnamed window>",
|
|
"using_filesort": true,
|
|
"filesort_key": [
|
|
"`id`"
|
|
],
|
|
"functions": [
|
|
"sum"
|
|
]
|
|
}
|
|
],
|
|
"cost_info": {
|
|
"sort_cost": "4.00"
|
|
},
|
|
"table": {
|
|
"table_name": "t",
|
|
"access_type": "ALL",
|
|
"rows_examined_per_scan": 4,
|
|
"rows_produced_per_join": 4,
|
|
"filtered": "100.00",
|
|
"cost_info": {
|
|
"read_cost": "2.55",
|
|
"eval_cost": "0.40",
|
|
"prefix_cost": "2.95",
|
|
"data_read_per_join": "544"
|
|
},
|
|
"used_columns": [
|
|
"id",
|
|
"sex",
|
|
"r00",
|
|
"r01",
|
|
"r02",
|
|
"r03",
|
|
"r04",
|
|
"r05",
|
|
"r06",
|
|
"r07",
|
|
"r08",
|
|
"r09",
|
|
"r10",
|
|
"r11",
|
|
"r12",
|
|
"r13",
|
|
"r14"
|
|
],
|
|
"materialized_from_subquery": {
|
|
"using_temporary_table": true,
|
|
"dependent": false,
|
|
"cacheable": true,
|
|
"query_block": {
|
|
"select_id": 2,
|
|
"cost_info": {
|
|
"query_cost": "28.95"
|
|
},
|
|
"windowing": {
|
|
"windows": [
|
|
{
|
|
"name": "<unnamed window>",
|
|
"definition_position": 1,
|
|
"using_temporary_table": true,
|
|
"using_filesort": true,
|
|
"filesort_key": [
|
|
"`sex`"
|
|
],
|
|
"functions": [
|
|
"rank"
|
|
]
|
|
},
|
|
{
|
|
"name": "<unnamed window>",
|
|
"definition_position": 5,
|
|
"using_temporary_table": true,
|
|
"functions": [
|
|
"rank"
|
|
]
|
|
},
|
|
{
|
|
"name": "<unnamed window>",
|
|
"definition_position": 6,
|
|
"using_temporary_table": true,
|
|
"functions": [
|
|
"rank"
|
|
]
|
|
},
|
|
{
|
|
"name": "<unnamed window>",
|
|
"definition_position": 7,
|
|
"using_temporary_table": true,
|
|
"functions": [
|
|
"rank"
|
|
]
|
|
},
|
|
{
|
|
"name": "<unnamed window>",
|
|
"definition_position": 8,
|
|
"using_temporary_table": true,
|
|
"functions": [
|
|
"rank"
|
|
]
|
|
},
|
|
{
|
|
"name": "<unnamed window>",
|
|
"definition_position": 9,
|
|
"using_temporary_table": true,
|
|
"functions": [
|
|
"rank"
|
|
]
|
|
},
|
|
{
|
|
"name": "<unnamed window>",
|
|
"definition_position": 10,
|
|
"using_temporary_table": true,
|
|
"functions": [
|
|
"rank"
|
|
]
|
|
},
|
|
{
|
|
"name": "<unnamed window>",
|
|
"definition_position": 11,
|
|
"using_temporary_table": true,
|
|
"functions": [
|
|
"rank"
|
|
]
|
|
},
|
|
{
|
|
"name": "<unnamed window>",
|
|
"definition_position": 12,
|
|
"using_temporary_table": true,
|
|
"functions": [
|
|
"rank"
|
|
]
|
|
},
|
|
{
|
|
"name": "<unnamed window>",
|
|
"definition_position": 13,
|
|
"using_temporary_table": true,
|
|
"functions": [
|
|
"rank"
|
|
]
|
|
},
|
|
{
|
|
"name": "<unnamed window>",
|
|
"definition_position": 14,
|
|
"using_temporary_table": true,
|
|
"functions": [
|
|
"rank"
|
|
]
|
|
},
|
|
{
|
|
"name": "<unnamed window>",
|
|
"definition_position": 15,
|
|
"using_temporary_table": true,
|
|
"functions": [
|
|
"rank"
|
|
]
|
|
},
|
|
{
|
|
"name": "<unnamed window>",
|
|
"definition_position": 4,
|
|
"using_temporary_table": true,
|
|
"using_filesort": true,
|
|
"filesort_key": [
|
|
"`id`",
|
|
"`sex`"
|
|
],
|
|
"functions": [
|
|
"rank"
|
|
]
|
|
},
|
|
{
|
|
"name": "<unnamed window>",
|
|
"definition_position": 2,
|
|
"using_temporary_table": true,
|
|
"using_filesort": true,
|
|
"filesort_key": [
|
|
"`sex` desc"
|
|
],
|
|
"functions": [
|
|
"rank"
|
|
]
|
|
},
|
|
{
|
|
"name": "<unnamed window>",
|
|
"definition_position": 3,
|
|
"last_executed_window": true,
|
|
"using_filesort": true,
|
|
"filesort_key": [
|
|
"`sex`",
|
|
"`id` desc"
|
|
],
|
|
"functions": [
|
|
"rank"
|
|
]
|
|
}
|
|
],
|
|
"cost_info": {
|
|
"sort_cost": "28.00"
|
|
},
|
|
"table": {
|
|
"table_name": "t1",
|
|
"access_type": "ALL",
|
|
"rows_examined_per_scan": 7,
|
|
"rows_produced_per_join": 7,
|
|
"filtered": "100.00",
|
|
"cost_info": {
|
|
"read_cost": "0.25",
|
|
"eval_cost": "0.70",
|
|
"prefix_cost": "0.95",
|
|
"data_read_per_join": "112"
|
|
},
|
|
"used_columns": [
|
|
"id",
|
|
"sex"
|
|
]
|
|
}
|
|
}
|
|
}
|
|
}
|
|
}
|
|
}
|
|
}
|
|
}
|
|
Warnings:
|
|
Note 1003 /* select#1 */ select `t`.`id` AS `id`,`t`.`sex` AS `sex`,`t`.`r00` AS `r00`,`t`.`r01` AS `r01`,`t`.`r02` AS `r02`,`t`.`r03` AS `r03`,`t`.`r04` AS `r04`,`t`.`r05` AS `r05`,`t`.`r06` AS `r06`,`t`.`r07` AS `r07`,`t`.`r08` AS `r08`,`t`.`r09` AS `r09`,`t`.`r10` AS `r10`,`t`.`r11` AS `r11`,`t`.`r12` AS `r12`,`t`.`r13` AS `r13`,`t`.`r14` AS `r14`,sum(((`t`.`id` + `t`.`r00`) + `t`.`r01`)) OVER (ORDER BY `t`.`id` ROWS BETWEEN UNBOUNDED PRECEDING AND CURRENT ROW) AS `s` from (/* select#2 */ select `test`.`t1`.`id` AS `id`,`test`.`t1`.`sex` AS `sex`,rank() OVER (ORDER BY `test`.`t1`.`sex` ) AS `r00`,rank() OVER (ORDER BY `test`.`t1`.`sex` desc ) AS `r01`,rank() OVER (ORDER BY `test`.`t1`.`sex`,`test`.`t1`.`id` desc ) AS `r02`,rank() OVER (PARTITION BY `test`.`t1`.`id` ORDER BY `test`.`t1`.`sex` ) AS `r03`,rank() OVER (ORDER BY `test`.`t1`.`sex` ) AS `r04`,rank() OVER (ORDER BY `test`.`t1`.`sex` ) AS `r05`,rank() OVER (ORDER BY `test`.`t1`.`sex` ) AS `r06`,rank() OVER (ORDER BY `test`.`t1`.`sex` ) AS `r07`,rank() OVER (ORDER BY `test`.`t1`.`sex` ) AS `r08`,rank() OVER (ORDER BY `test`.`t1`.`sex` ) AS `r09`,rank() OVER (ORDER BY `test`.`t1`.`sex` ) AS `r10`,rank() OVER (ORDER BY `test`.`t1`.`sex` ) AS `r11`,rank() OVER (ORDER BY `test`.`t1`.`sex` ) AS `r12`,rank() OVER (ORDER BY `test`.`t1`.`sex` ) AS `r13`,rank() OVER (ORDER BY `test`.`t1`.`sex` ) AS `r14` from `test`.`t1` limit 4) `t`
|
|
----------------------------------------------------------------------
|
|
- SUM, AVG, COUNT with frames
|
|
----------------------------------------------------------------------
|
|
EXPLAIN FORMAT=JSON SELECT SUM(id) OVER w * 2, AVG(id) OVER w, COUNT(id) OVER w FROM t1
|
|
WINDOW w AS (PARTITION BY sex);
|
|
EXPLAIN
|
|
{
|
|
"query_block": {
|
|
"select_id": 1,
|
|
"cost_info": {
|
|
"query_cost": "7.95"
|
|
},
|
|
"windowing": {
|
|
"windows": [
|
|
{
|
|
"name": "w",
|
|
"using_filesort": true,
|
|
"filesort_key": [
|
|
"`sex`"
|
|
],
|
|
"frame_buffer": {
|
|
"using_temporary_table": true,
|
|
"optimized_frame_evaluation": true
|
|
},
|
|
"functions": [
|
|
"sum",
|
|
"avg",
|
|
"count"
|
|
]
|
|
}
|
|
],
|
|
"cost_info": {
|
|
"sort_cost": "7.00"
|
|
},
|
|
"table": {
|
|
"table_name": "t1",
|
|
"access_type": "ALL",
|
|
"rows_examined_per_scan": 7,
|
|
"rows_produced_per_join": 7,
|
|
"filtered": "100.00",
|
|
"cost_info": {
|
|
"read_cost": "0.25",
|
|
"eval_cost": "0.70",
|
|
"prefix_cost": "0.95",
|
|
"data_read_per_join": "112"
|
|
},
|
|
"used_columns": [
|
|
"id",
|
|
"sex"
|
|
]
|
|
}
|
|
}
|
|
}
|
|
}
|
|
Warnings:
|
|
Note 1003 /* select#1 */ select (sum(`test`.`t1`.`id`) OVER `w` * 2) AS `SUM(id) OVER w * 2`,avg(`test`.`t1`.`id`) OVER `w` AS `AVG(id) OVER w`,count(`test`.`t1`.`id`) OVER `w` AS `COUNT(id) OVER w` from `test`.`t1` window `w` AS (PARTITION BY `test`.`t1`.`sex` )
|
|
EXPLAIN FORMAT=JSON SELECT * FROM (
|
|
SELECT id, SUM(id) OVER w, COUNT(*) OVER w, sex FROM t1
|
|
WINDOW w AS (PARTITION BY sex)
|
|
) alias ORDER BY id;
|
|
EXPLAIN
|
|
{
|
|
"query_block": {
|
|
"select_id": 1,
|
|
"cost_info": {
|
|
"query_cost": "10.29"
|
|
},
|
|
"ordering_operation": {
|
|
"using_filesort": true,
|
|
"cost_info": {
|
|
"sort_cost": "7.00"
|
|
},
|
|
"table": {
|
|
"table_name": "alias",
|
|
"access_type": "ALL",
|
|
"rows_examined_per_scan": 7,
|
|
"rows_produced_per_join": 7,
|
|
"filtered": "100.00",
|
|
"cost_info": {
|
|
"read_cost": "2.59",
|
|
"eval_cost": "0.70",
|
|
"prefix_cost": "3.29",
|
|
"data_read_per_join": "280"
|
|
},
|
|
"used_columns": [
|
|
"id",
|
|
"SUM(id) OVER w",
|
|
"COUNT(*) OVER w",
|
|
"sex"
|
|
],
|
|
"materialized_from_subquery": {
|
|
"using_temporary_table": true,
|
|
"dependent": false,
|
|
"cacheable": true,
|
|
"query_block": {
|
|
"select_id": 2,
|
|
"cost_info": {
|
|
"query_cost": "7.95"
|
|
},
|
|
"windowing": {
|
|
"windows": [
|
|
{
|
|
"name": "w",
|
|
"using_filesort": true,
|
|
"filesort_key": [
|
|
"`sex`"
|
|
],
|
|
"frame_buffer": {
|
|
"using_temporary_table": true,
|
|
"optimized_frame_evaluation": true
|
|
},
|
|
"functions": [
|
|
"sum",
|
|
"count"
|
|
]
|
|
}
|
|
],
|
|
"cost_info": {
|
|
"sort_cost": "7.00"
|
|
},
|
|
"table": {
|
|
"table_name": "t1",
|
|
"access_type": "ALL",
|
|
"rows_examined_per_scan": 7,
|
|
"rows_produced_per_join": 7,
|
|
"filtered": "100.00",
|
|
"cost_info": {
|
|
"read_cost": "0.25",
|
|
"eval_cost": "0.70",
|
|
"prefix_cost": "0.95",
|
|
"data_read_per_join": "112"
|
|
},
|
|
"used_columns": [
|
|
"id",
|
|
"sex"
|
|
]
|
|
}
|
|
}
|
|
}
|
|
}
|
|
}
|
|
}
|
|
}
|
|
}
|
|
Warnings:
|
|
Note 1003 /* select#1 */ select `alias`.`id` AS `id`,`alias`.`SUM(id) OVER w` AS `SUM(id) OVER w`,`alias`.`COUNT(*) OVER w` AS `COUNT(*) OVER w`,`alias`.`sex` AS `sex` from (/* select#2 */ select `test`.`t1`.`id` AS `id`,sum(`test`.`t1`.`id`) OVER `w` AS `SUM(id) OVER w`,count(0) OVER `w` AS `COUNT(*) OVER w`,`test`.`t1`.`sex` AS `sex` from `test`.`t1` window `w` AS (PARTITION BY `test`.`t1`.`sex` ) ) `alias` order by `alias`.`id`
|
|
EXPLAIN FORMAT=JSON SELECT SUM(id) OVER w FROM t1 WINDOW w AS (PARTITION BY sex);
|
|
EXPLAIN
|
|
{
|
|
"query_block": {
|
|
"select_id": 1,
|
|
"cost_info": {
|
|
"query_cost": "7.95"
|
|
},
|
|
"windowing": {
|
|
"windows": [
|
|
{
|
|
"name": "w",
|
|
"using_filesort": true,
|
|
"filesort_key": [
|
|
"`sex`"
|
|
],
|
|
"frame_buffer": {
|
|
"using_temporary_table": true,
|
|
"optimized_frame_evaluation": true
|
|
},
|
|
"functions": [
|
|
"sum"
|
|
]
|
|
}
|
|
],
|
|
"cost_info": {
|
|
"sort_cost": "7.00"
|
|
},
|
|
"table": {
|
|
"table_name": "t1",
|
|
"access_type": "ALL",
|
|
"rows_examined_per_scan": 7,
|
|
"rows_produced_per_join": 7,
|
|
"filtered": "100.00",
|
|
"cost_info": {
|
|
"read_cost": "0.25",
|
|
"eval_cost": "0.70",
|
|
"prefix_cost": "0.95",
|
|
"data_read_per_join": "112"
|
|
},
|
|
"used_columns": [
|
|
"id",
|
|
"sex"
|
|
]
|
|
}
|
|
}
|
|
}
|
|
}
|
|
Warnings:
|
|
Note 1003 /* select#1 */ select sum(`test`.`t1`.`id`) OVER `w` AS `SUM(id) OVER w` from `test`.`t1` window `w` AS (PARTITION BY `test`.`t1`.`sex` )
|
|
EXPLAIN FORMAT=JSON SELECT id, SUM(id) OVER w, sex FROM t1
|
|
WINDOW w AS (PARTITION BY sex ORDER BY id
|
|
ROWS BETWEEN 2 PRECEDING AND 1 PRECEDING);
|
|
EXPLAIN
|
|
{
|
|
"query_block": {
|
|
"select_id": 1,
|
|
"cost_info": {
|
|
"query_cost": "7.95"
|
|
},
|
|
"windowing": {
|
|
"windows": [
|
|
{
|
|
"name": "w",
|
|
"using_filesort": true,
|
|
"filesort_key": [
|
|
"`sex`",
|
|
"`id`"
|
|
],
|
|
"frame_buffer": {
|
|
"using_temporary_table": true,
|
|
"optimized_frame_evaluation": true
|
|
},
|
|
"functions": [
|
|
"sum"
|
|
]
|
|
}
|
|
],
|
|
"cost_info": {
|
|
"sort_cost": "7.00"
|
|
},
|
|
"table": {
|
|
"table_name": "t1",
|
|
"access_type": "ALL",
|
|
"rows_examined_per_scan": 7,
|
|
"rows_produced_per_join": 7,
|
|
"filtered": "100.00",
|
|
"cost_info": {
|
|
"read_cost": "0.25",
|
|
"eval_cost": "0.70",
|
|
"prefix_cost": "0.95",
|
|
"data_read_per_join": "112"
|
|
},
|
|
"used_columns": [
|
|
"id",
|
|
"sex"
|
|
]
|
|
}
|
|
}
|
|
}
|
|
}
|
|
Warnings:
|
|
Note 1003 /* select#1 */ select `test`.`t1`.`id` AS `id`,sum(`test`.`t1`.`id`) OVER `w` AS `SUM(id) OVER w`,`test`.`t1`.`sex` AS `sex` from `test`.`t1` window `w` AS (PARTITION BY `test`.`t1`.`sex` ORDER BY `test`.`t1`.`id` ROWS BETWEEN 2 PRECEDING AND 1 PRECEDING)
|
|
try the same as a view
|
|
CREATE VIEW v AS
|
|
SELECT id, SUM(id) OVER w, sex FROM t1
|
|
WINDOW w AS (PARTITION BY sex ORDER BY id
|
|
ROWS BETWEEN 2 PRECEDING AND 1 PRECEDING);
|
|
SHOW CREATE VIEW v;
|
|
View Create View character_set_client collation_connection
|
|
v CREATE ALGORITHM=UNDEFINED DEFINER=`root`@`localhost` SQL SECURITY DEFINER VIEW `v` AS select `t1`.`id` AS `id`,sum(`t1`.`id`) OVER `w` AS `SUM(id) OVER w`,`t1`.`sex` AS `sex` from `t1` window `w` AS (PARTITION BY `t1`.`sex` ORDER BY `t1`.`id` ROWS BETWEEN 2 PRECEDING AND 1 PRECEDING) utf8 utf8_general_ci
|
|
EXPLAIN FORMAT=JSON SELECT * FROM v;
|
|
EXPLAIN
|
|
{
|
|
"query_block": {
|
|
"select_id": 1,
|
|
"cost_info": {
|
|
"query_cost": "3.29"
|
|
},
|
|
"table": {
|
|
"table_name": "v",
|
|
"access_type": "ALL",
|
|
"rows_examined_per_scan": 7,
|
|
"rows_produced_per_join": 7,
|
|
"filtered": "100.00",
|
|
"cost_info": {
|
|
"read_cost": "2.59",
|
|
"eval_cost": "0.70",
|
|
"prefix_cost": "3.29",
|
|
"data_read_per_join": "224"
|
|
},
|
|
"used_columns": [
|
|
"id",
|
|
"SUM(id) OVER w",
|
|
"sex"
|
|
],
|
|
"materialized_from_subquery": {
|
|
"using_temporary_table": true,
|
|
"dependent": false,
|
|
"cacheable": true,
|
|
"query_block": {
|
|
"select_id": 2,
|
|
"cost_info": {
|
|
"query_cost": "7.95"
|
|
},
|
|
"windowing": {
|
|
"windows": [
|
|
{
|
|
"name": "w",
|
|
"using_filesort": true,
|
|
"filesort_key": [
|
|
"`sex`",
|
|
"`id`"
|
|
],
|
|
"frame_buffer": {
|
|
"using_temporary_table": true,
|
|
"optimized_frame_evaluation": true
|
|
},
|
|
"functions": [
|
|
"sum"
|
|
]
|
|
}
|
|
],
|
|
"cost_info": {
|
|
"sort_cost": "7.00"
|
|
},
|
|
"table": {
|
|
"table_name": "t1",
|
|
"access_type": "ALL",
|
|
"rows_examined_per_scan": 7,
|
|
"rows_produced_per_join": 7,
|
|
"filtered": "100.00",
|
|
"cost_info": {
|
|
"read_cost": "0.25",
|
|
"eval_cost": "0.70",
|
|
"prefix_cost": "0.95",
|
|
"data_read_per_join": "112"
|
|
},
|
|
"used_columns": [
|
|
"id",
|
|
"sex"
|
|
]
|
|
}
|
|
}
|
|
}
|
|
}
|
|
}
|
|
}
|
|
}
|
|
Warnings:
|
|
Note 1003 /* select#1 */ select `v`.`id` AS `id`,`v`.`SUM(id) OVER w` AS `SUM(id) OVER w`,`v`.`sex` AS `sex` from `test`.`v`
|
|
DROP VIEW v;
|
|
EXPLAIN FORMAT=JSON SELECT SUM(id) OVER w FROM t1
|
|
WINDOW w AS (PARTITION BY sex ORDER BY id
|
|
ROWS BETWEEN 2 PRECEDING AND 1 PRECEDING);
|
|
EXPLAIN
|
|
{
|
|
"query_block": {
|
|
"select_id": 1,
|
|
"cost_info": {
|
|
"query_cost": "7.95"
|
|
},
|
|
"windowing": {
|
|
"windows": [
|
|
{
|
|
"name": "w",
|
|
"using_filesort": true,
|
|
"filesort_key": [
|
|
"`sex`",
|
|
"`id`"
|
|
],
|
|
"frame_buffer": {
|
|
"using_temporary_table": true,
|
|
"optimized_frame_evaluation": true
|
|
},
|
|
"functions": [
|
|
"sum"
|
|
]
|
|
}
|
|
],
|
|
"cost_info": {
|
|
"sort_cost": "7.00"
|
|
},
|
|
"table": {
|
|
"table_name": "t1",
|
|
"access_type": "ALL",
|
|
"rows_examined_per_scan": 7,
|
|
"rows_produced_per_join": 7,
|
|
"filtered": "100.00",
|
|
"cost_info": {
|
|
"read_cost": "0.25",
|
|
"eval_cost": "0.70",
|
|
"prefix_cost": "0.95",
|
|
"data_read_per_join": "112"
|
|
},
|
|
"used_columns": [
|
|
"id",
|
|
"sex"
|
|
]
|
|
}
|
|
}
|
|
}
|
|
}
|
|
Warnings:
|
|
Note 1003 /* select#1 */ select sum(`test`.`t1`.`id`) OVER `w` AS `SUM(id) OVER w` from `test`.`t1` window `w` AS (PARTITION BY `test`.`t1`.`sex` ORDER BY `test`.`t1`.`id` ROWS BETWEEN 2 PRECEDING AND 1 PRECEDING)
|
|
EXPLAIN FORMAT=JSON SELECT id, SUM(id) OVER w, sex FROM t1
|
|
WINDOW w AS (PARTITION BY sex ORDER BY id
|
|
ROWS BETWEEN 1 FOLLOWING AND 2 FOLLOWING);
|
|
EXPLAIN
|
|
{
|
|
"query_block": {
|
|
"select_id": 1,
|
|
"cost_info": {
|
|
"query_cost": "7.95"
|
|
},
|
|
"windowing": {
|
|
"windows": [
|
|
{
|
|
"name": "w",
|
|
"using_filesort": true,
|
|
"filesort_key": [
|
|
"`sex`",
|
|
"`id`"
|
|
],
|
|
"frame_buffer": {
|
|
"using_temporary_table": true,
|
|
"optimized_frame_evaluation": true
|
|
},
|
|
"functions": [
|
|
"sum"
|
|
]
|
|
}
|
|
],
|
|
"cost_info": {
|
|
"sort_cost": "7.00"
|
|
},
|
|
"table": {
|
|
"table_name": "t1",
|
|
"access_type": "ALL",
|
|
"rows_examined_per_scan": 7,
|
|
"rows_produced_per_join": 7,
|
|
"filtered": "100.00",
|
|
"cost_info": {
|
|
"read_cost": "0.25",
|
|
"eval_cost": "0.70",
|
|
"prefix_cost": "0.95",
|
|
"data_read_per_join": "112"
|
|
},
|
|
"used_columns": [
|
|
"id",
|
|
"sex"
|
|
]
|
|
}
|
|
}
|
|
}
|
|
}
|
|
Warnings:
|
|
Note 1003 /* select#1 */ select `test`.`t1`.`id` AS `id`,sum(`test`.`t1`.`id`) OVER `w` AS `SUM(id) OVER w`,`test`.`t1`.`sex` AS `sex` from `test`.`t1` window `w` AS (PARTITION BY `test`.`t1`.`sex` ORDER BY `test`.`t1`.`id` ROWS BETWEEN 1 FOLLOWING AND 2 FOLLOWING)
|
|
EXPLAIN FORMAT=JSON SELECT SUM(id) OVER w, COUNT(*) OVER w FROM t1
|
|
WINDOW w AS (PARTITION BY sex ORDER BY id
|
|
ROWS BETWEEN 1 FOLLOWING AND 2 FOLLOWING);
|
|
EXPLAIN
|
|
{
|
|
"query_block": {
|
|
"select_id": 1,
|
|
"cost_info": {
|
|
"query_cost": "7.95"
|
|
},
|
|
"windowing": {
|
|
"windows": [
|
|
{
|
|
"name": "w",
|
|
"using_filesort": true,
|
|
"filesort_key": [
|
|
"`sex`",
|
|
"`id`"
|
|
],
|
|
"frame_buffer": {
|
|
"using_temporary_table": true,
|
|
"optimized_frame_evaluation": true
|
|
},
|
|
"functions": [
|
|
"sum",
|
|
"count"
|
|
]
|
|
}
|
|
],
|
|
"cost_info": {
|
|
"sort_cost": "7.00"
|
|
},
|
|
"table": {
|
|
"table_name": "t1",
|
|
"access_type": "ALL",
|
|
"rows_examined_per_scan": 7,
|
|
"rows_produced_per_join": 7,
|
|
"filtered": "100.00",
|
|
"cost_info": {
|
|
"read_cost": "0.25",
|
|
"eval_cost": "0.70",
|
|
"prefix_cost": "0.95",
|
|
"data_read_per_join": "112"
|
|
},
|
|
"used_columns": [
|
|
"id",
|
|
"sex"
|
|
]
|
|
}
|
|
}
|
|
}
|
|
}
|
|
Warnings:
|
|
Note 1003 /* select#1 */ select sum(`test`.`t1`.`id`) OVER `w` AS `SUM(id) OVER w`,count(0) OVER `w` AS `COUNT(*) OVER w` from `test`.`t1` window `w` AS (PARTITION BY `test`.`t1`.`sex` ORDER BY `test`.`t1`.`id` ROWS BETWEEN 1 FOLLOWING AND 2 FOLLOWING)
|
|
EXPLAIN FORMAT=JSON SELECT id, AVG(id) OVER (ROWS UNBOUNDED PRECEDING) FROM t1;
|
|
EXPLAIN
|
|
{
|
|
"query_block": {
|
|
"select_id": 1,
|
|
"cost_info": {
|
|
"query_cost": "0.95"
|
|
},
|
|
"windowing": {
|
|
"windows": [
|
|
{
|
|
"name": "<unnamed window>",
|
|
"functions": [
|
|
"avg"
|
|
]
|
|
}
|
|
],
|
|
"table": {
|
|
"table_name": "t1",
|
|
"access_type": "ALL",
|
|
"rows_examined_per_scan": 7,
|
|
"rows_produced_per_join": 7,
|
|
"filtered": "100.00",
|
|
"cost_info": {
|
|
"read_cost": "0.25",
|
|
"eval_cost": "0.70",
|
|
"prefix_cost": "0.95",
|
|
"data_read_per_join": "112"
|
|
},
|
|
"used_columns": [
|
|
"id"
|
|
]
|
|
}
|
|
}
|
|
}
|
|
}
|
|
Warnings:
|
|
Note 1003 /* select#1 */ select `test`.`t1`.`id` AS `id`,avg(`test`.`t1`.`id`) OVER (ROWS BETWEEN UNBOUNDED PRECEDING AND CURRENT ROW) AS `AVG(id) OVER (ROWS UNBOUNDED PRECEDING)` from `test`.`t1`
|
|
EXPLAIN FORMAT=JSON SELECT id, AVG(id) OVER w, COUNT(id) OVER w FROM t1
|
|
WINDOW w AS (ORDER BY id ROWS BETWEEN 1 PRECEDING AND 1 FOLLOWING);
|
|
EXPLAIN
|
|
{
|
|
"query_block": {
|
|
"select_id": 1,
|
|
"cost_info": {
|
|
"query_cost": "7.95"
|
|
},
|
|
"windowing": {
|
|
"windows": [
|
|
{
|
|
"name": "w",
|
|
"using_filesort": true,
|
|
"filesort_key": [
|
|
"`id`"
|
|
],
|
|
"frame_buffer": {
|
|
"using_temporary_table": true,
|
|
"optimized_frame_evaluation": true
|
|
},
|
|
"functions": [
|
|
"avg",
|
|
"count"
|
|
]
|
|
}
|
|
],
|
|
"cost_info": {
|
|
"sort_cost": "7.00"
|
|
},
|
|
"table": {
|
|
"table_name": "t1",
|
|
"access_type": "ALL",
|
|
"rows_examined_per_scan": 7,
|
|
"rows_produced_per_join": 7,
|
|
"filtered": "100.00",
|
|
"cost_info": {
|
|
"read_cost": "0.25",
|
|
"eval_cost": "0.70",
|
|
"prefix_cost": "0.95",
|
|
"data_read_per_join": "112"
|
|
},
|
|
"used_columns": [
|
|
"id"
|
|
]
|
|
}
|
|
}
|
|
}
|
|
}
|
|
Warnings:
|
|
Note 1003 /* select#1 */ select `test`.`t1`.`id` AS `id`,avg(`test`.`t1`.`id`) OVER `w` AS `AVG(id) OVER w`,count(`test`.`t1`.`id`) OVER `w` AS `COUNT(id) OVER w` from `test`.`t1` window `w` AS (ORDER BY `test`.`t1`.`id` ROWS BETWEEN 1 PRECEDING AND 1 FOLLOWING)
|
|
AVG, SUM with double type
|
|
CREATE TABLE td(d DOUBLE);
|
|
INSERT INTO td VALUES (2),(2),(3),(1),(1.2),(NULL);
|
|
ANALYZE TABLE td;
|
|
Table Op Msg_type Msg_text
|
|
test.td analyze status OK
|
|
EXPLAIN FORMAT=JSON SELECT d, SUM(d) OVER (ORDER BY d), AVG(d) OVER (ORDER BY d) FROM td;
|
|
EXPLAIN
|
|
{
|
|
"query_block": {
|
|
"select_id": 1,
|
|
"cost_info": {
|
|
"query_cost": "6.85"
|
|
},
|
|
"windowing": {
|
|
"windows": [
|
|
{
|
|
"name": "<unnamed window>",
|
|
"definition_position": 1,
|
|
"using_temporary_table": true,
|
|
"using_filesort": true,
|
|
"filesort_key": [
|
|
"`d`"
|
|
],
|
|
"frame_buffer": {
|
|
"using_temporary_table": true,
|
|
"optimized_frame_evaluation": true
|
|
},
|
|
"functions": [
|
|
"sum"
|
|
]
|
|
},
|
|
{
|
|
"name": "<unnamed window>",
|
|
"definition_position": 2,
|
|
"last_executed_window": true,
|
|
"frame_buffer": {
|
|
"using_temporary_table": true,
|
|
"optimized_frame_evaluation": true
|
|
},
|
|
"functions": [
|
|
"avg"
|
|
]
|
|
}
|
|
],
|
|
"cost_info": {
|
|
"sort_cost": "6.00"
|
|
},
|
|
"table": {
|
|
"table_name": "td",
|
|
"access_type": "ALL",
|
|
"rows_examined_per_scan": 6,
|
|
"rows_produced_per_join": 6,
|
|
"filtered": "100.00",
|
|
"cost_info": {
|
|
"read_cost": "0.25",
|
|
"eval_cost": "0.60",
|
|
"prefix_cost": "0.85",
|
|
"data_read_per_join": "96"
|
|
},
|
|
"used_columns": [
|
|
"d"
|
|
]
|
|
}
|
|
}
|
|
}
|
|
}
|
|
Warnings:
|
|
Note 1003 /* select#1 */ select `test`.`td`.`d` AS `d`,sum(`test`.`td`.`d`) OVER (ORDER BY `test`.`td`.`d` ) AS `SUM(d) OVER (ORDER BY d)`,avg(`test`.`td`.`d`) OVER (ORDER BY `test`.`td`.`d` ) AS `AVG(d) OVER (ORDER BY d)` from `test`.`td`
|
|
EXPLAIN FORMAT=JSON SELECT d, SUM(d) OVER (ORDER BY d), AVG(d) OVER () FROM td;
|
|
EXPLAIN
|
|
{
|
|
"query_block": {
|
|
"select_id": 1,
|
|
"cost_info": {
|
|
"query_cost": "6.85"
|
|
},
|
|
"windowing": {
|
|
"windows": [
|
|
{
|
|
"name": "<unnamed window>",
|
|
"definition_position": 1,
|
|
"using_temporary_table": true,
|
|
"using_filesort": true,
|
|
"filesort_key": [
|
|
"`d`"
|
|
],
|
|
"frame_buffer": {
|
|
"using_temporary_table": true,
|
|
"optimized_frame_evaluation": true
|
|
},
|
|
"functions": [
|
|
"sum"
|
|
]
|
|
},
|
|
{
|
|
"name": "<unnamed window>",
|
|
"definition_position": 2,
|
|
"last_executed_window": true,
|
|
"frame_buffer": {
|
|
"using_temporary_table": true,
|
|
"optimized_frame_evaluation": true
|
|
},
|
|
"functions": [
|
|
"avg"
|
|
]
|
|
}
|
|
],
|
|
"cost_info": {
|
|
"sort_cost": "6.00"
|
|
},
|
|
"table": {
|
|
"table_name": "td",
|
|
"access_type": "ALL",
|
|
"rows_examined_per_scan": 6,
|
|
"rows_produced_per_join": 6,
|
|
"filtered": "100.00",
|
|
"cost_info": {
|
|
"read_cost": "0.25",
|
|
"eval_cost": "0.60",
|
|
"prefix_cost": "0.85",
|
|
"data_read_per_join": "96"
|
|
},
|
|
"used_columns": [
|
|
"d"
|
|
]
|
|
}
|
|
}
|
|
}
|
|
}
|
|
Warnings:
|
|
Note 1003 /* select#1 */ select `test`.`td`.`d` AS `d`,sum(`test`.`td`.`d`) OVER (ORDER BY `test`.`td`.`d` ) AS `SUM(d) OVER (ORDER BY d)`,avg(`test`.`td`.`d`) OVER () AS `AVG(d) OVER ()` from `test`.`td`
|
|
EXPLAIN FORMAT=JSON SELECT d, SUM(d) OVER (ORDER BY d), AVG(d) OVER (ORDER BY d ROWS BETWEEN 1 PRECEDING AND 1 FOLLOWING) FROM td;
|
|
EXPLAIN
|
|
{
|
|
"query_block": {
|
|
"select_id": 1,
|
|
"cost_info": {
|
|
"query_cost": "6.85"
|
|
},
|
|
"windowing": {
|
|
"windows": [
|
|
{
|
|
"name": "<unnamed window>",
|
|
"definition_position": 1,
|
|
"using_temporary_table": true,
|
|
"using_filesort": true,
|
|
"filesort_key": [
|
|
"`d`"
|
|
],
|
|
"frame_buffer": {
|
|
"using_temporary_table": true,
|
|
"optimized_frame_evaluation": true
|
|
},
|
|
"functions": [
|
|
"sum"
|
|
]
|
|
},
|
|
{
|
|
"name": "<unnamed window>",
|
|
"definition_position": 2,
|
|
"last_executed_window": true,
|
|
"frame_buffer": {
|
|
"using_temporary_table": true
|
|
},
|
|
"functions": [
|
|
"avg"
|
|
]
|
|
}
|
|
],
|
|
"cost_info": {
|
|
"sort_cost": "6.00"
|
|
},
|
|
"table": {
|
|
"table_name": "td",
|
|
"access_type": "ALL",
|
|
"rows_examined_per_scan": 6,
|
|
"rows_produced_per_join": 6,
|
|
"filtered": "100.00",
|
|
"cost_info": {
|
|
"read_cost": "0.25",
|
|
"eval_cost": "0.60",
|
|
"prefix_cost": "0.85",
|
|
"data_read_per_join": "96"
|
|
},
|
|
"used_columns": [
|
|
"d"
|
|
]
|
|
}
|
|
}
|
|
}
|
|
}
|
|
Warnings:
|
|
Note 1003 /* select#1 */ select `test`.`td`.`d` AS `d`,sum(`test`.`td`.`d`) OVER (ORDER BY `test`.`td`.`d` ) AS `SUM(d) OVER (ORDER BY d)`,avg(`test`.`td`.`d`) OVER (ORDER BY `test`.`td`.`d` ROWS BETWEEN 1 PRECEDING AND 1 FOLLOWING) AS `AVG(d) OVER (ORDER BY d ROWS BETWEEN 1 PRECEDING AND 1 FOLLOWING)` from `test`.`td`
|
|
Check system variable "windowing_use_high_precision"
|
|
TRUNCATE td;
|
|
INSERT INTO td VALUES (1.7976931348623157E+307), (1);
|
|
ANALYZE TABLE td;
|
|
Table Op Msg_type Msg_text
|
|
test.td analyze status OK
|
|
should be default off:
|
|
SHOW VARIABLES LIKE 'windowing_use_high_precision';
|
|
Variable_name Value
|
|
windowing_use_high_precision ON
|
|
EXPLAIN FORMAT=JSON SELECT d, SUM(d) OVER (ROWS BETWEEN CURRENT ROW AND 1 FOLLOWING) FROM td;
|
|
EXPLAIN
|
|
{
|
|
"query_block": {
|
|
"select_id": 1,
|
|
"cost_info": {
|
|
"query_cost": "0.45"
|
|
},
|
|
"windowing": {
|
|
"windows": [
|
|
{
|
|
"name": "<unnamed window>",
|
|
"frame_buffer": {
|
|
"using_temporary_table": true
|
|
},
|
|
"functions": [
|
|
"sum"
|
|
]
|
|
}
|
|
],
|
|
"table": {
|
|
"table_name": "td",
|
|
"access_type": "ALL",
|
|
"rows_examined_per_scan": 2,
|
|
"rows_produced_per_join": 2,
|
|
"filtered": "100.00",
|
|
"cost_info": {
|
|
"read_cost": "0.25",
|
|
"eval_cost": "0.20",
|
|
"prefix_cost": "0.45",
|
|
"data_read_per_join": "32"
|
|
},
|
|
"used_columns": [
|
|
"d"
|
|
]
|
|
}
|
|
}
|
|
}
|
|
}
|
|
Warnings:
|
|
Note 1003 /* select#1 */ select `test`.`td`.`d` AS `d`,sum(`test`.`td`.`d`) OVER (ROWS BETWEEN CURRENT ROW AND 1 FOLLOWING) AS `SUM(d) OVER (ROWS BETWEEN CURRENT ROW AND 1 FOLLOWING)` from `test`.`td`
|
|
allow unsafe optimization: result changes
|
|
SET SESSION windowing_use_high_precision=FALSE;
|
|
EXPLAIN FORMAT=JSON SELECT d, SUM(d) OVER (ROWS BETWEEN CURRENT ROW AND 1 FOLLOWING) FROM td;
|
|
EXPLAIN
|
|
{
|
|
"query_block": {
|
|
"select_id": 1,
|
|
"cost_info": {
|
|
"query_cost": "0.45"
|
|
},
|
|
"windowing": {
|
|
"windows": [
|
|
{
|
|
"name": "<unnamed window>",
|
|
"frame_buffer": {
|
|
"using_temporary_table": true,
|
|
"optimized_frame_evaluation": true
|
|
},
|
|
"functions": [
|
|
"sum"
|
|
]
|
|
}
|
|
],
|
|
"table": {
|
|
"table_name": "td",
|
|
"access_type": "ALL",
|
|
"rows_examined_per_scan": 2,
|
|
"rows_produced_per_join": 2,
|
|
"filtered": "100.00",
|
|
"cost_info": {
|
|
"read_cost": "0.25",
|
|
"eval_cost": "0.20",
|
|
"prefix_cost": "0.45",
|
|
"data_read_per_join": "32"
|
|
},
|
|
"used_columns": [
|
|
"d"
|
|
]
|
|
}
|
|
}
|
|
}
|
|
}
|
|
Warnings:
|
|
Note 1003 /* select#1 */ select `test`.`td`.`d` AS `d`,sum(`test`.`td`.`d`) OVER (ROWS BETWEEN CURRENT ROW AND 1 FOLLOWING) AS `SUM(d) OVER (ROWS BETWEEN CURRENT ROW AND 1 FOLLOWING)` from `test`.`td`
|
|
SET SESSION windowing_use_high_precision=TRUE;
|
|
bugfix: AVG for moving range frame
|
|
TRUNCATE td;
|
|
INSERT INTO td VALUES (10),(1),(2),(3),(4),(5),(6),(7),(8),(9);
|
|
ANALYZE TABLE td;
|
|
Table Op Msg_type Msg_text
|
|
test.td analyze status OK
|
|
EXPLAIN FORMAT=JSON SELECT d, SUM(d) OVER w, AVG(d) OVER w FROM td
|
|
WINDOW w AS (ORDER BY d RANGE BETWEEN 2 PRECEDING AND CURRENT ROW);
|
|
EXPLAIN
|
|
{
|
|
"query_block": {
|
|
"select_id": 1,
|
|
"cost_info": {
|
|
"query_cost": "11.25"
|
|
},
|
|
"windowing": {
|
|
"windows": [
|
|
{
|
|
"name": "w",
|
|
"using_filesort": true,
|
|
"filesort_key": [
|
|
"`d`"
|
|
],
|
|
"frame_buffer": {
|
|
"using_temporary_table": true
|
|
},
|
|
"functions": [
|
|
"sum",
|
|
"avg"
|
|
]
|
|
}
|
|
],
|
|
"cost_info": {
|
|
"sort_cost": "10.00"
|
|
},
|
|
"table": {
|
|
"table_name": "td",
|
|
"access_type": "ALL",
|
|
"rows_examined_per_scan": 10,
|
|
"rows_produced_per_join": 10,
|
|
"filtered": "100.00",
|
|
"cost_info": {
|
|
"read_cost": "0.25",
|
|
"eval_cost": "1.00",
|
|
"prefix_cost": "1.25",
|
|
"data_read_per_join": "160"
|
|
},
|
|
"used_columns": [
|
|
"d"
|
|
]
|
|
}
|
|
}
|
|
}
|
|
}
|
|
Warnings:
|
|
Note 1003 /* select#1 */ select `test`.`td`.`d` AS `d`,sum(`test`.`td`.`d`) OVER `w` AS `SUM(d) OVER w`,avg(`test`.`td`.`d`) OVER `w` AS `AVG(d) OVER w` from `test`.`td` window `w` AS (ORDER BY `test`.`td`.`d` RANGE BETWEEN 2 PRECEDING AND CURRENT ROW)
|
|
EXPLAIN FORMAT=JSON SELECT d, SUM(d) OVER w, AVG(d) OVER w FROM td
|
|
WINDOW w AS (ORDER BY d RANGE BETWEEN 2 PRECEDING AND 2 FOLLOWING);
|
|
EXPLAIN
|
|
{
|
|
"query_block": {
|
|
"select_id": 1,
|
|
"cost_info": {
|
|
"query_cost": "11.25"
|
|
},
|
|
"windowing": {
|
|
"windows": [
|
|
{
|
|
"name": "w",
|
|
"using_filesort": true,
|
|
"filesort_key": [
|
|
"`d`"
|
|
],
|
|
"frame_buffer": {
|
|
"using_temporary_table": true
|
|
},
|
|
"functions": [
|
|
"sum",
|
|
"avg"
|
|
]
|
|
}
|
|
],
|
|
"cost_info": {
|
|
"sort_cost": "10.00"
|
|
},
|
|
"table": {
|
|
"table_name": "td",
|
|
"access_type": "ALL",
|
|
"rows_examined_per_scan": 10,
|
|
"rows_produced_per_join": 10,
|
|
"filtered": "100.00",
|
|
"cost_info": {
|
|
"read_cost": "0.25",
|
|
"eval_cost": "1.00",
|
|
"prefix_cost": "1.25",
|
|
"data_read_per_join": "160"
|
|
},
|
|
"used_columns": [
|
|
"d"
|
|
]
|
|
}
|
|
}
|
|
}
|
|
}
|
|
Warnings:
|
|
Note 1003 /* select#1 */ select `test`.`td`.`d` AS `d`,sum(`test`.`td`.`d`) OVER `w` AS `SUM(d) OVER w`,avg(`test`.`td`.`d`) OVER `w` AS `AVG(d) OVER w` from `test`.`td` window `w` AS (ORDER BY `test`.`td`.`d` RANGE BETWEEN 2 PRECEDING AND 2 FOLLOWING)
|
|
EXPLAIN FORMAT=JSON SELECT d, SUM(d) OVER w, AVG(d) OVER w FROM td
|
|
WINDOW w AS (ORDER BY d RANGE BETWEEN CURRENT ROW AND 2 FOLLOWING);
|
|
EXPLAIN
|
|
{
|
|
"query_block": {
|
|
"select_id": 1,
|
|
"cost_info": {
|
|
"query_cost": "11.25"
|
|
},
|
|
"windowing": {
|
|
"windows": [
|
|
{
|
|
"name": "w",
|
|
"using_filesort": true,
|
|
"filesort_key": [
|
|
"`d`"
|
|
],
|
|
"frame_buffer": {
|
|
"using_temporary_table": true
|
|
},
|
|
"functions": [
|
|
"sum",
|
|
"avg"
|
|
]
|
|
}
|
|
],
|
|
"cost_info": {
|
|
"sort_cost": "10.00"
|
|
},
|
|
"table": {
|
|
"table_name": "td",
|
|
"access_type": "ALL",
|
|
"rows_examined_per_scan": 10,
|
|
"rows_produced_per_join": 10,
|
|
"filtered": "100.00",
|
|
"cost_info": {
|
|
"read_cost": "0.25",
|
|
"eval_cost": "1.00",
|
|
"prefix_cost": "1.25",
|
|
"data_read_per_join": "160"
|
|
},
|
|
"used_columns": [
|
|
"d"
|
|
]
|
|
}
|
|
}
|
|
}
|
|
}
|
|
Warnings:
|
|
Note 1003 /* select#1 */ select `test`.`td`.`d` AS `d`,sum(`test`.`td`.`d`) OVER `w` AS `SUM(d) OVER w`,avg(`test`.`td`.`d`) OVER `w` AS `AVG(d) OVER w` from `test`.`td` window `w` AS (ORDER BY `test`.`td`.`d` RANGE BETWEEN CURRENT ROW AND 2 FOLLOWING)
|
|
SET SESSION windowing_use_high_precision=FALSE;
|
|
EXPLAIN FORMAT=JSON SELECT d, SUM(d) OVER w, AVG(d) OVER w FROM td
|
|
WINDOW w AS (ORDER BY d RANGE BETWEEN 2 PRECEDING AND CURRENT ROW);
|
|
EXPLAIN
|
|
{
|
|
"query_block": {
|
|
"select_id": 1,
|
|
"cost_info": {
|
|
"query_cost": "11.25"
|
|
},
|
|
"windowing": {
|
|
"windows": [
|
|
{
|
|
"name": "w",
|
|
"using_filesort": true,
|
|
"filesort_key": [
|
|
"`d`"
|
|
],
|
|
"frame_buffer": {
|
|
"using_temporary_table": true,
|
|
"optimized_frame_evaluation": true
|
|
},
|
|
"functions": [
|
|
"sum",
|
|
"avg"
|
|
]
|
|
}
|
|
],
|
|
"cost_info": {
|
|
"sort_cost": "10.00"
|
|
},
|
|
"table": {
|
|
"table_name": "td",
|
|
"access_type": "ALL",
|
|
"rows_examined_per_scan": 10,
|
|
"rows_produced_per_join": 10,
|
|
"filtered": "100.00",
|
|
"cost_info": {
|
|
"read_cost": "0.25",
|
|
"eval_cost": "1.00",
|
|
"prefix_cost": "1.25",
|
|
"data_read_per_join": "160"
|
|
},
|
|
"used_columns": [
|
|
"d"
|
|
]
|
|
}
|
|
}
|
|
}
|
|
}
|
|
Warnings:
|
|
Note 1003 /* select#1 */ select `test`.`td`.`d` AS `d`,sum(`test`.`td`.`d`) OVER `w` AS `SUM(d) OVER w`,avg(`test`.`td`.`d`) OVER `w` AS `AVG(d) OVER w` from `test`.`td` window `w` AS (ORDER BY `test`.`td`.`d` RANGE BETWEEN 2 PRECEDING AND CURRENT ROW)
|
|
EXPLAIN FORMAT=JSON SELECT d, SUM(d) OVER w, AVG(d) OVER w FROM td
|
|
WINDOW w AS (ORDER BY d RANGE BETWEEN 2 PRECEDING AND 2 FOLLOWING);
|
|
EXPLAIN
|
|
{
|
|
"query_block": {
|
|
"select_id": 1,
|
|
"cost_info": {
|
|
"query_cost": "11.25"
|
|
},
|
|
"windowing": {
|
|
"windows": [
|
|
{
|
|
"name": "w",
|
|
"using_filesort": true,
|
|
"filesort_key": [
|
|
"`d`"
|
|
],
|
|
"frame_buffer": {
|
|
"using_temporary_table": true,
|
|
"optimized_frame_evaluation": true
|
|
},
|
|
"functions": [
|
|
"sum",
|
|
"avg"
|
|
]
|
|
}
|
|
],
|
|
"cost_info": {
|
|
"sort_cost": "10.00"
|
|
},
|
|
"table": {
|
|
"table_name": "td",
|
|
"access_type": "ALL",
|
|
"rows_examined_per_scan": 10,
|
|
"rows_produced_per_join": 10,
|
|
"filtered": "100.00",
|
|
"cost_info": {
|
|
"read_cost": "0.25",
|
|
"eval_cost": "1.00",
|
|
"prefix_cost": "1.25",
|
|
"data_read_per_join": "160"
|
|
},
|
|
"used_columns": [
|
|
"d"
|
|
]
|
|
}
|
|
}
|
|
}
|
|
}
|
|
Warnings:
|
|
Note 1003 /* select#1 */ select `test`.`td`.`d` AS `d`,sum(`test`.`td`.`d`) OVER `w` AS `SUM(d) OVER w`,avg(`test`.`td`.`d`) OVER `w` AS `AVG(d) OVER w` from `test`.`td` window `w` AS (ORDER BY `test`.`td`.`d` RANGE BETWEEN 2 PRECEDING AND 2 FOLLOWING)
|
|
EXPLAIN FORMAT=JSON SELECT d, SUM(d) OVER w, AVG(d) OVER w FROM td
|
|
WINDOW w AS (ORDER BY d RANGE BETWEEN CURRENT ROW AND 2 FOLLOWING);
|
|
EXPLAIN
|
|
{
|
|
"query_block": {
|
|
"select_id": 1,
|
|
"cost_info": {
|
|
"query_cost": "11.25"
|
|
},
|
|
"windowing": {
|
|
"windows": [
|
|
{
|
|
"name": "w",
|
|
"using_filesort": true,
|
|
"filesort_key": [
|
|
"`d`"
|
|
],
|
|
"frame_buffer": {
|
|
"using_temporary_table": true,
|
|
"optimized_frame_evaluation": true
|
|
},
|
|
"functions": [
|
|
"sum",
|
|
"avg"
|
|
]
|
|
}
|
|
],
|
|
"cost_info": {
|
|
"sort_cost": "10.00"
|
|
},
|
|
"table": {
|
|
"table_name": "td",
|
|
"access_type": "ALL",
|
|
"rows_examined_per_scan": 10,
|
|
"rows_produced_per_join": 10,
|
|
"filtered": "100.00",
|
|
"cost_info": {
|
|
"read_cost": "0.25",
|
|
"eval_cost": "1.00",
|
|
"prefix_cost": "1.25",
|
|
"data_read_per_join": "160"
|
|
},
|
|
"used_columns": [
|
|
"d"
|
|
]
|
|
}
|
|
}
|
|
}
|
|
}
|
|
Warnings:
|
|
Note 1003 /* select#1 */ select `test`.`td`.`d` AS `d`,sum(`test`.`td`.`d`) OVER `w` AS `SUM(d) OVER w`,avg(`test`.`td`.`d`) OVER `w` AS `AVG(d) OVER w` from `test`.`td` window `w` AS (ORDER BY `test`.`td`.`d` RANGE BETWEEN CURRENT ROW AND 2 FOLLOWING)
|
|
SET SESSION windowing_use_high_precision=TRUE;
|
|
INSERT INTO td SELECT * FROM td;
|
|
ANALYZE TABLE td;
|
|
Table Op Msg_type Msg_text
|
|
test.td analyze status OK
|
|
EXPLAIN FORMAT=JSON SELECT d, SUM(d) OVER w, AVG(d) OVER w FROM td
|
|
WINDOW w AS (ORDER BY d RANGE BETWEEN 2 PRECEDING AND CURRENT ROW);
|
|
EXPLAIN
|
|
{
|
|
"query_block": {
|
|
"select_id": 1,
|
|
"cost_info": {
|
|
"query_cost": "22.25"
|
|
},
|
|
"windowing": {
|
|
"windows": [
|
|
{
|
|
"name": "w",
|
|
"using_filesort": true,
|
|
"filesort_key": [
|
|
"`d`"
|
|
],
|
|
"frame_buffer": {
|
|
"using_temporary_table": true
|
|
},
|
|
"functions": [
|
|
"sum",
|
|
"avg"
|
|
]
|
|
}
|
|
],
|
|
"cost_info": {
|
|
"sort_cost": "20.00"
|
|
},
|
|
"table": {
|
|
"table_name": "td",
|
|
"access_type": "ALL",
|
|
"rows_examined_per_scan": 20,
|
|
"rows_produced_per_join": 20,
|
|
"filtered": "100.00",
|
|
"cost_info": {
|
|
"read_cost": "0.25",
|
|
"eval_cost": "2.00",
|
|
"prefix_cost": "2.25",
|
|
"data_read_per_join": "320"
|
|
},
|
|
"used_columns": [
|
|
"d"
|
|
]
|
|
}
|
|
}
|
|
}
|
|
}
|
|
Warnings:
|
|
Note 1003 /* select#1 */ select `test`.`td`.`d` AS `d`,sum(`test`.`td`.`d`) OVER `w` AS `SUM(d) OVER w`,avg(`test`.`td`.`d`) OVER `w` AS `AVG(d) OVER w` from `test`.`td` window `w` AS (ORDER BY `test`.`td`.`d` RANGE BETWEEN 2 PRECEDING AND CURRENT ROW)
|
|
EXPLAIN FORMAT=JSON SELECT d, SUM(d) OVER w, AVG(d) OVER w FROM td
|
|
WINDOW w AS (ORDER BY d RANGE BETWEEN 2 PRECEDING AND 2 FOLLOWING);
|
|
EXPLAIN
|
|
{
|
|
"query_block": {
|
|
"select_id": 1,
|
|
"cost_info": {
|
|
"query_cost": "22.25"
|
|
},
|
|
"windowing": {
|
|
"windows": [
|
|
{
|
|
"name": "w",
|
|
"using_filesort": true,
|
|
"filesort_key": [
|
|
"`d`"
|
|
],
|
|
"frame_buffer": {
|
|
"using_temporary_table": true
|
|
},
|
|
"functions": [
|
|
"sum",
|
|
"avg"
|
|
]
|
|
}
|
|
],
|
|
"cost_info": {
|
|
"sort_cost": "20.00"
|
|
},
|
|
"table": {
|
|
"table_name": "td",
|
|
"access_type": "ALL",
|
|
"rows_examined_per_scan": 20,
|
|
"rows_produced_per_join": 20,
|
|
"filtered": "100.00",
|
|
"cost_info": {
|
|
"read_cost": "0.25",
|
|
"eval_cost": "2.00",
|
|
"prefix_cost": "2.25",
|
|
"data_read_per_join": "320"
|
|
},
|
|
"used_columns": [
|
|
"d"
|
|
]
|
|
}
|
|
}
|
|
}
|
|
}
|
|
Warnings:
|
|
Note 1003 /* select#1 */ select `test`.`td`.`d` AS `d`,sum(`test`.`td`.`d`) OVER `w` AS `SUM(d) OVER w`,avg(`test`.`td`.`d`) OVER `w` AS `AVG(d) OVER w` from `test`.`td` window `w` AS (ORDER BY `test`.`td`.`d` RANGE BETWEEN 2 PRECEDING AND 2 FOLLOWING)
|
|
EXPLAIN FORMAT=JSON SELECT d, SUM(d) OVER w, AVG(d) OVER w FROM td
|
|
WINDOW w AS (ORDER BY d RANGE BETWEEN CURRENT ROW AND 2 FOLLOWING);
|
|
EXPLAIN
|
|
{
|
|
"query_block": {
|
|
"select_id": 1,
|
|
"cost_info": {
|
|
"query_cost": "22.25"
|
|
},
|
|
"windowing": {
|
|
"windows": [
|
|
{
|
|
"name": "w",
|
|
"using_filesort": true,
|
|
"filesort_key": [
|
|
"`d`"
|
|
],
|
|
"frame_buffer": {
|
|
"using_temporary_table": true
|
|
},
|
|
"functions": [
|
|
"sum",
|
|
"avg"
|
|
]
|
|
}
|
|
],
|
|
"cost_info": {
|
|
"sort_cost": "20.00"
|
|
},
|
|
"table": {
|
|
"table_name": "td",
|
|
"access_type": "ALL",
|
|
"rows_examined_per_scan": 20,
|
|
"rows_produced_per_join": 20,
|
|
"filtered": "100.00",
|
|
"cost_info": {
|
|
"read_cost": "0.25",
|
|
"eval_cost": "2.00",
|
|
"prefix_cost": "2.25",
|
|
"data_read_per_join": "320"
|
|
},
|
|
"used_columns": [
|
|
"d"
|
|
]
|
|
}
|
|
}
|
|
}
|
|
}
|
|
Warnings:
|
|
Note 1003 /* select#1 */ select `test`.`td`.`d` AS `d`,sum(`test`.`td`.`d`) OVER `w` AS `SUM(d) OVER w`,avg(`test`.`td`.`d`) OVER `w` AS `AVG(d) OVER w` from `test`.`td` window `w` AS (ORDER BY `test`.`td`.`d` RANGE BETWEEN CURRENT ROW AND 2 FOLLOWING)
|
|
SET SESSION windowing_use_high_precision=FALSE;
|
|
EXPLAIN FORMAT=JSON SELECT d, SUM(d) OVER w, AVG(d) OVER w FROM td
|
|
WINDOW w AS (ORDER BY d RANGE BETWEEN 2 PRECEDING AND CURRENT ROW);
|
|
EXPLAIN
|
|
{
|
|
"query_block": {
|
|
"select_id": 1,
|
|
"cost_info": {
|
|
"query_cost": "22.25"
|
|
},
|
|
"windowing": {
|
|
"windows": [
|
|
{
|
|
"name": "w",
|
|
"using_filesort": true,
|
|
"filesort_key": [
|
|
"`d`"
|
|
],
|
|
"frame_buffer": {
|
|
"using_temporary_table": true,
|
|
"optimized_frame_evaluation": true
|
|
},
|
|
"functions": [
|
|
"sum",
|
|
"avg"
|
|
]
|
|
}
|
|
],
|
|
"cost_info": {
|
|
"sort_cost": "20.00"
|
|
},
|
|
"table": {
|
|
"table_name": "td",
|
|
"access_type": "ALL",
|
|
"rows_examined_per_scan": 20,
|
|
"rows_produced_per_join": 20,
|
|
"filtered": "100.00",
|
|
"cost_info": {
|
|
"read_cost": "0.25",
|
|
"eval_cost": "2.00",
|
|
"prefix_cost": "2.25",
|
|
"data_read_per_join": "320"
|
|
},
|
|
"used_columns": [
|
|
"d"
|
|
]
|
|
}
|
|
}
|
|
}
|
|
}
|
|
Warnings:
|
|
Note 1003 /* select#1 */ select `test`.`td`.`d` AS `d`,sum(`test`.`td`.`d`) OVER `w` AS `SUM(d) OVER w`,avg(`test`.`td`.`d`) OVER `w` AS `AVG(d) OVER w` from `test`.`td` window `w` AS (ORDER BY `test`.`td`.`d` RANGE BETWEEN 2 PRECEDING AND CURRENT ROW)
|
|
EXPLAIN FORMAT=JSON SELECT d, SUM(d) OVER w, AVG(d) OVER w FROM td
|
|
WINDOW w AS (ORDER BY d RANGE BETWEEN 2 PRECEDING AND 2 FOLLOWING);
|
|
EXPLAIN
|
|
{
|
|
"query_block": {
|
|
"select_id": 1,
|
|
"cost_info": {
|
|
"query_cost": "22.25"
|
|
},
|
|
"windowing": {
|
|
"windows": [
|
|
{
|
|
"name": "w",
|
|
"using_filesort": true,
|
|
"filesort_key": [
|
|
"`d`"
|
|
],
|
|
"frame_buffer": {
|
|
"using_temporary_table": true,
|
|
"optimized_frame_evaluation": true
|
|
},
|
|
"functions": [
|
|
"sum",
|
|
"avg"
|
|
]
|
|
}
|
|
],
|
|
"cost_info": {
|
|
"sort_cost": "20.00"
|
|
},
|
|
"table": {
|
|
"table_name": "td",
|
|
"access_type": "ALL",
|
|
"rows_examined_per_scan": 20,
|
|
"rows_produced_per_join": 20,
|
|
"filtered": "100.00",
|
|
"cost_info": {
|
|
"read_cost": "0.25",
|
|
"eval_cost": "2.00",
|
|
"prefix_cost": "2.25",
|
|
"data_read_per_join": "320"
|
|
},
|
|
"used_columns": [
|
|
"d"
|
|
]
|
|
}
|
|
}
|
|
}
|
|
}
|
|
Warnings:
|
|
Note 1003 /* select#1 */ select `test`.`td`.`d` AS `d`,sum(`test`.`td`.`d`) OVER `w` AS `SUM(d) OVER w`,avg(`test`.`td`.`d`) OVER `w` AS `AVG(d) OVER w` from `test`.`td` window `w` AS (ORDER BY `test`.`td`.`d` RANGE BETWEEN 2 PRECEDING AND 2 FOLLOWING)
|
|
EXPLAIN FORMAT=JSON SELECT d, SUM(d) OVER w, AVG(d) OVER w FROM td
|
|
WINDOW w AS (ORDER BY d RANGE BETWEEN CURRENT ROW AND 2 FOLLOWING);
|
|
EXPLAIN
|
|
{
|
|
"query_block": {
|
|
"select_id": 1,
|
|
"cost_info": {
|
|
"query_cost": "22.25"
|
|
},
|
|
"windowing": {
|
|
"windows": [
|
|
{
|
|
"name": "w",
|
|
"using_filesort": true,
|
|
"filesort_key": [
|
|
"`d`"
|
|
],
|
|
"frame_buffer": {
|
|
"using_temporary_table": true,
|
|
"optimized_frame_evaluation": true
|
|
},
|
|
"functions": [
|
|
"sum",
|
|
"avg"
|
|
]
|
|
}
|
|
],
|
|
"cost_info": {
|
|
"sort_cost": "20.00"
|
|
},
|
|
"table": {
|
|
"table_name": "td",
|
|
"access_type": "ALL",
|
|
"rows_examined_per_scan": 20,
|
|
"rows_produced_per_join": 20,
|
|
"filtered": "100.00",
|
|
"cost_info": {
|
|
"read_cost": "0.25",
|
|
"eval_cost": "2.00",
|
|
"prefix_cost": "2.25",
|
|
"data_read_per_join": "320"
|
|
},
|
|
"used_columns": [
|
|
"d"
|
|
]
|
|
}
|
|
}
|
|
}
|
|
}
|
|
Warnings:
|
|
Note 1003 /* select#1 */ select `test`.`td`.`d` AS `d`,sum(`test`.`td`.`d`) OVER `w` AS `SUM(d) OVER w`,avg(`test`.`td`.`d`) OVER `w` AS `AVG(d) OVER w` from `test`.`td` window `w` AS (ORDER BY `test`.`td`.`d` RANGE BETWEEN CURRENT ROW AND 2 FOLLOWING)
|
|
SET SESSION windowing_use_high_precision=TRUE;
|
|
DROP TABLE td;
|
|
----------------------------------------------------------------------
|
|
- NTILE (requires two passes over partition).
|
|
- Currently suboptimal in that it causes N*N reads of tmp buffer
|
|
----------------------------------------------------------------------
|
|
EXPLAIN FORMAT=JSON SELECT id, NTILE(NULL) OVER w FROM t1 WINDOW w AS (ORDER BY id);
|
|
EXPLAIN
|
|
{
|
|
"query_block": {
|
|
"select_id": 1,
|
|
"cost_info": {
|
|
"query_cost": "7.95"
|
|
},
|
|
"windowing": {
|
|
"windows": [
|
|
{
|
|
"name": "w",
|
|
"using_filesort": true,
|
|
"filesort_key": [
|
|
"`id`"
|
|
],
|
|
"frame_buffer": {
|
|
"using_temporary_table": true,
|
|
"optimized_frame_evaluation": true
|
|
},
|
|
"functions": [
|
|
"ntile"
|
|
]
|
|
}
|
|
],
|
|
"cost_info": {
|
|
"sort_cost": "7.00"
|
|
},
|
|
"table": {
|
|
"table_name": "t1",
|
|
"access_type": "ALL",
|
|
"rows_examined_per_scan": 7,
|
|
"rows_produced_per_join": 7,
|
|
"filtered": "100.00",
|
|
"cost_info": {
|
|
"read_cost": "0.25",
|
|
"eval_cost": "0.70",
|
|
"prefix_cost": "0.95",
|
|
"data_read_per_join": "112"
|
|
},
|
|
"used_columns": [
|
|
"id"
|
|
]
|
|
}
|
|
}
|
|
}
|
|
}
|
|
Warnings:
|
|
Note 1003 /* select#1 */ select `test`.`t1`.`id` AS `id`,ntile(NULL) OVER `w` AS `NTILE(NULL) OVER w` from `test`.`t1` window `w` AS (ORDER BY `test`.`t1`.`id` )
|
|
EXPLAIN FORMAT=JSON SELECT id, NTILE(1) OVER w FROM t1 WINDOW w AS (ORDER BY id);
|
|
EXPLAIN
|
|
{
|
|
"query_block": {
|
|
"select_id": 1,
|
|
"cost_info": {
|
|
"query_cost": "7.95"
|
|
},
|
|
"windowing": {
|
|
"windows": [
|
|
{
|
|
"name": "w",
|
|
"using_filesort": true,
|
|
"filesort_key": [
|
|
"`id`"
|
|
],
|
|
"frame_buffer": {
|
|
"using_temporary_table": true,
|
|
"optimized_frame_evaluation": true
|
|
},
|
|
"functions": [
|
|
"ntile"
|
|
]
|
|
}
|
|
],
|
|
"cost_info": {
|
|
"sort_cost": "7.00"
|
|
},
|
|
"table": {
|
|
"table_name": "t1",
|
|
"access_type": "ALL",
|
|
"rows_examined_per_scan": 7,
|
|
"rows_produced_per_join": 7,
|
|
"filtered": "100.00",
|
|
"cost_info": {
|
|
"read_cost": "0.25",
|
|
"eval_cost": "0.70",
|
|
"prefix_cost": "0.95",
|
|
"data_read_per_join": "112"
|
|
},
|
|
"used_columns": [
|
|
"id"
|
|
]
|
|
}
|
|
}
|
|
}
|
|
}
|
|
Warnings:
|
|
Note 1003 /* select#1 */ select `test`.`t1`.`id` AS `id`,ntile(1) OVER `w` AS `NTILE(1) OVER w` from `test`.`t1` window `w` AS (ORDER BY `test`.`t1`.`id` )
|
|
EXPLAIN FORMAT=JSON SELECT id, NTILE(2) OVER w FROM t1 WINDOW w AS (ORDER BY id);
|
|
EXPLAIN
|
|
{
|
|
"query_block": {
|
|
"select_id": 1,
|
|
"cost_info": {
|
|
"query_cost": "7.95"
|
|
},
|
|
"windowing": {
|
|
"windows": [
|
|
{
|
|
"name": "w",
|
|
"using_filesort": true,
|
|
"filesort_key": [
|
|
"`id`"
|
|
],
|
|
"frame_buffer": {
|
|
"using_temporary_table": true,
|
|
"optimized_frame_evaluation": true
|
|
},
|
|
"functions": [
|
|
"ntile"
|
|
]
|
|
}
|
|
],
|
|
"cost_info": {
|
|
"sort_cost": "7.00"
|
|
},
|
|
"table": {
|
|
"table_name": "t1",
|
|
"access_type": "ALL",
|
|
"rows_examined_per_scan": 7,
|
|
"rows_produced_per_join": 7,
|
|
"filtered": "100.00",
|
|
"cost_info": {
|
|
"read_cost": "0.25",
|
|
"eval_cost": "0.70",
|
|
"prefix_cost": "0.95",
|
|
"data_read_per_join": "112"
|
|
},
|
|
"used_columns": [
|
|
"id"
|
|
]
|
|
}
|
|
}
|
|
}
|
|
}
|
|
Warnings:
|
|
Note 1003 /* select#1 */ select `test`.`t1`.`id` AS `id`,ntile(2) OVER `w` AS `NTILE(2) OVER w` from `test`.`t1` window `w` AS (ORDER BY `test`.`t1`.`id` )
|
|
EXPLAIN FORMAT=JSON SELECT id, NTILE(5) OVER w FROM t1 WINDOW w AS (ORDER BY id);
|
|
EXPLAIN
|
|
{
|
|
"query_block": {
|
|
"select_id": 1,
|
|
"cost_info": {
|
|
"query_cost": "7.95"
|
|
},
|
|
"windowing": {
|
|
"windows": [
|
|
{
|
|
"name": "w",
|
|
"using_filesort": true,
|
|
"filesort_key": [
|
|
"`id`"
|
|
],
|
|
"frame_buffer": {
|
|
"using_temporary_table": true,
|
|
"optimized_frame_evaluation": true
|
|
},
|
|
"functions": [
|
|
"ntile"
|
|
]
|
|
}
|
|
],
|
|
"cost_info": {
|
|
"sort_cost": "7.00"
|
|
},
|
|
"table": {
|
|
"table_name": "t1",
|
|
"access_type": "ALL",
|
|
"rows_examined_per_scan": 7,
|
|
"rows_produced_per_join": 7,
|
|
"filtered": "100.00",
|
|
"cost_info": {
|
|
"read_cost": "0.25",
|
|
"eval_cost": "0.70",
|
|
"prefix_cost": "0.95",
|
|
"data_read_per_join": "112"
|
|
},
|
|
"used_columns": [
|
|
"id"
|
|
]
|
|
}
|
|
}
|
|
}
|
|
}
|
|
Warnings:
|
|
Note 1003 /* select#1 */ select `test`.`t1`.`id` AS `id`,ntile(5) OVER `w` AS `NTILE(5) OVER w` from `test`.`t1` window `w` AS (ORDER BY `test`.`t1`.`id` )
|
|
EXPLAIN FORMAT=JSON SELECT id, NTILE(11) OVER w FROM t1 WINDOW w AS (ORDER BY id);
|
|
EXPLAIN
|
|
{
|
|
"query_block": {
|
|
"select_id": 1,
|
|
"cost_info": {
|
|
"query_cost": "7.95"
|
|
},
|
|
"windowing": {
|
|
"windows": [
|
|
{
|
|
"name": "w",
|
|
"using_filesort": true,
|
|
"filesort_key": [
|
|
"`id`"
|
|
],
|
|
"frame_buffer": {
|
|
"using_temporary_table": true,
|
|
"optimized_frame_evaluation": true
|
|
},
|
|
"functions": [
|
|
"ntile"
|
|
]
|
|
}
|
|
],
|
|
"cost_info": {
|
|
"sort_cost": "7.00"
|
|
},
|
|
"table": {
|
|
"table_name": "t1",
|
|
"access_type": "ALL",
|
|
"rows_examined_per_scan": 7,
|
|
"rows_produced_per_join": 7,
|
|
"filtered": "100.00",
|
|
"cost_info": {
|
|
"read_cost": "0.25",
|
|
"eval_cost": "0.70",
|
|
"prefix_cost": "0.95",
|
|
"data_read_per_join": "112"
|
|
},
|
|
"used_columns": [
|
|
"id"
|
|
]
|
|
}
|
|
}
|
|
}
|
|
}
|
|
Warnings:
|
|
Note 1003 /* select#1 */ select `test`.`t1`.`id` AS `id`,ntile(11) OVER `w` AS `NTILE(11) OVER w` from `test`.`t1` window `w` AS (ORDER BY `test`.`t1`.`id` )
|
|
combo with frame
|
|
EXPLAIN FORMAT=JSON SELECT id, ROW_NUMBER() OVER w, NTILE(4) OVER w, SUM(id) OVER w FROM t1
|
|
WINDOW w AS (ORDER BY id ROWS 1 PRECEDING);
|
|
EXPLAIN
|
|
{
|
|
"query_block": {
|
|
"select_id": 1,
|
|
"cost_info": {
|
|
"query_cost": "7.95"
|
|
},
|
|
"windowing": {
|
|
"windows": [
|
|
{
|
|
"name": "w",
|
|
"using_filesort": true,
|
|
"filesort_key": [
|
|
"`id`"
|
|
],
|
|
"frame_buffer": {
|
|
"using_temporary_table": true,
|
|
"optimized_frame_evaluation": true
|
|
},
|
|
"functions": [
|
|
"row_number",
|
|
"ntile",
|
|
"sum"
|
|
]
|
|
}
|
|
],
|
|
"cost_info": {
|
|
"sort_cost": "7.00"
|
|
},
|
|
"table": {
|
|
"table_name": "t1",
|
|
"access_type": "ALL",
|
|
"rows_examined_per_scan": 7,
|
|
"rows_produced_per_join": 7,
|
|
"filtered": "100.00",
|
|
"cost_info": {
|
|
"read_cost": "0.25",
|
|
"eval_cost": "0.70",
|
|
"prefix_cost": "0.95",
|
|
"data_read_per_join": "112"
|
|
},
|
|
"used_columns": [
|
|
"id"
|
|
]
|
|
}
|
|
}
|
|
}
|
|
}
|
|
Warnings:
|
|
Note 3599 Window function 'row_number' ignores the frame clause of window 'w' and aggregates over the whole partition
|
|
Note 3599 Window function 'ntile' ignores the frame clause of window 'w' and aggregates over the whole partition
|
|
Note 1003 /* select#1 */ select `test`.`t1`.`id` AS `id`,row_number() OVER `w` AS `ROW_NUMBER() OVER w`,ntile(4) OVER `w` AS `NTILE(4) OVER w`,sum(`test`.`t1`.`id`) OVER `w` AS `SUM(id) OVER w` from `test`.`t1` window `w` AS (ORDER BY `test`.`t1`.`id` ROWS BETWEEN 1 PRECEDING AND CURRENT ROW)
|
|
Try one where there are no extras
|
|
DELETE FROM t1 WHERE id=11;
|
|
EXPLAIN FORMAT=JSON SELECT id, NTILE(3) OVER w FROM t1 WINDOW w AS (ORDER BY id);
|
|
EXPLAIN
|
|
{
|
|
"query_block": {
|
|
"select_id": 1,
|
|
"cost_info": {
|
|
"query_cost": "6.85"
|
|
},
|
|
"windowing": {
|
|
"windows": [
|
|
{
|
|
"name": "w",
|
|
"using_filesort": true,
|
|
"filesort_key": [
|
|
"`id`"
|
|
],
|
|
"frame_buffer": {
|
|
"using_temporary_table": true,
|
|
"optimized_frame_evaluation": true
|
|
},
|
|
"functions": [
|
|
"ntile"
|
|
]
|
|
}
|
|
],
|
|
"cost_info": {
|
|
"sort_cost": "6.00"
|
|
},
|
|
"table": {
|
|
"table_name": "t1",
|
|
"access_type": "ALL",
|
|
"rows_examined_per_scan": 6,
|
|
"rows_produced_per_join": 6,
|
|
"filtered": "100.00",
|
|
"cost_info": {
|
|
"read_cost": "0.25",
|
|
"eval_cost": "0.60",
|
|
"prefix_cost": "0.85",
|
|
"data_read_per_join": "96"
|
|
},
|
|
"used_columns": [
|
|
"id"
|
|
]
|
|
}
|
|
}
|
|
}
|
|
}
|
|
Warnings:
|
|
Note 1003 /* select#1 */ select `test`.`t1`.`id` AS `id`,ntile(3) OVER `w` AS `NTILE(3) OVER w` from `test`.`t1` window `w` AS (ORDER BY `test`.`t1`.`id` )
|
|
INSERT INTO t1 VALUES (11, NULL);
|
|
ANALYZE TABLE t1;
|
|
Table Op Msg_type Msg_text
|
|
test.t1 analyze status OK
|
|
Simulated NTILE via other SQL window functions. Exercises an
|
|
an expression containing window functions defined on different
|
|
windows
|
|
EXPLAIN FORMAT=JSON SELECT (ROW_NUMBER() OVER w1 * 5 - 1) DIV (COUNT(*) OVER w2) + 1 AS cnt
|
|
FROM t1 WINDOW w1 AS (ORDER BY id ASC),
|
|
w2 AS ();
|
|
EXPLAIN
|
|
{
|
|
"query_block": {
|
|
"select_id": 1,
|
|
"cost_info": {
|
|
"query_cost": "7.95"
|
|
},
|
|
"windowing": {
|
|
"windows": [
|
|
{
|
|
"name": "w1",
|
|
"definition_position": 1,
|
|
"using_temporary_table": true,
|
|
"using_filesort": true,
|
|
"filesort_key": [
|
|
"`id`"
|
|
],
|
|
"functions": [
|
|
"row_number"
|
|
]
|
|
},
|
|
{
|
|
"name": "w2",
|
|
"definition_position": 2,
|
|
"last_executed_window": true,
|
|
"frame_buffer": {
|
|
"using_temporary_table": true,
|
|
"optimized_frame_evaluation": true
|
|
},
|
|
"functions": [
|
|
"count"
|
|
]
|
|
}
|
|
],
|
|
"cost_info": {
|
|
"sort_cost": "7.00"
|
|
},
|
|
"table": {
|
|
"table_name": "t1",
|
|
"access_type": "ALL",
|
|
"rows_examined_per_scan": 7,
|
|
"rows_produced_per_join": 7,
|
|
"filtered": "100.00",
|
|
"cost_info": {
|
|
"read_cost": "0.25",
|
|
"eval_cost": "0.70",
|
|
"prefix_cost": "0.95",
|
|
"data_read_per_join": "112"
|
|
},
|
|
"used_columns": [
|
|
"id"
|
|
]
|
|
}
|
|
}
|
|
}
|
|
}
|
|
Warnings:
|
|
Note 1003 /* select#1 */ select ((((row_number() OVER `w1` * 5) - 1) DIV count(0) OVER `w2`) + 1) AS `cnt` from `test`.`t1` window `w1` AS (ORDER BY `test`.`t1`.`id` ) , `w2` AS ()
|
|
EXPLAIN FORMAT=JSON SELECT (ROW_NUMBER() OVER w1 * 5 - 1) DIV (COUNT(*) OVER w2) + 1 AS ntile_manually,
|
|
COUNT(*) OVER w3
|
|
FROM t1 WINDOW w1 AS (ORDER BY id ASC),
|
|
w2 AS (), w3 AS ();
|
|
EXPLAIN
|
|
{
|
|
"query_block": {
|
|
"select_id": 1,
|
|
"cost_info": {
|
|
"query_cost": "7.95"
|
|
},
|
|
"windowing": {
|
|
"windows": [
|
|
{
|
|
"name": "w1",
|
|
"definition_position": 1,
|
|
"using_temporary_table": true,
|
|
"using_filesort": true,
|
|
"filesort_key": [
|
|
"`id`"
|
|
],
|
|
"functions": [
|
|
"row_number"
|
|
]
|
|
},
|
|
{
|
|
"name": "w2",
|
|
"definition_position": 2,
|
|
"using_temporary_table": true,
|
|
"frame_buffer": {
|
|
"using_temporary_table": true,
|
|
"optimized_frame_evaluation": true
|
|
},
|
|
"functions": [
|
|
"count"
|
|
]
|
|
},
|
|
{
|
|
"name": "w3",
|
|
"definition_position": 3,
|
|
"last_executed_window": true,
|
|
"frame_buffer": {
|
|
"using_temporary_table": true,
|
|
"optimized_frame_evaluation": true
|
|
},
|
|
"functions": [
|
|
"count"
|
|
]
|
|
}
|
|
],
|
|
"cost_info": {
|
|
"sort_cost": "7.00"
|
|
},
|
|
"table": {
|
|
"table_name": "t1",
|
|
"access_type": "ALL",
|
|
"rows_examined_per_scan": 7,
|
|
"rows_produced_per_join": 7,
|
|
"filtered": "100.00",
|
|
"cost_info": {
|
|
"read_cost": "0.25",
|
|
"eval_cost": "0.70",
|
|
"prefix_cost": "0.95",
|
|
"data_read_per_join": "112"
|
|
},
|
|
"used_columns": [
|
|
"id"
|
|
]
|
|
}
|
|
}
|
|
}
|
|
}
|
|
Warnings:
|
|
Note 1003 /* select#1 */ select ((((row_number() OVER `w1` * 5) - 1) DIV count(0) OVER `w2`) + 1) AS `ntile_manually`,count(0) OVER `w3` AS `COUNT(*) OVER w3` from `test`.`t1` window `w1` AS (ORDER BY `test`.`t1`.`id` ) , `w2` AS () , `w3` AS ()
|
|
NTILE in combination with a frame that doesn't cover current row (was bug)
|
|
EXPLAIN FORMAT=JSON SELECT id, ROW_NUMBER() OVER w, SUM(id) OVER w, NTILE(5) OVER w FROM t1
|
|
WINDOW w AS (ORDER BY id ROWS BETWEEN UNBOUNDED PRECEDING AND 2 PRECEDING);
|
|
EXPLAIN
|
|
{
|
|
"query_block": {
|
|
"select_id": 1,
|
|
"cost_info": {
|
|
"query_cost": "7.95"
|
|
},
|
|
"windowing": {
|
|
"windows": [
|
|
{
|
|
"name": "w",
|
|
"using_filesort": true,
|
|
"filesort_key": [
|
|
"`id`"
|
|
],
|
|
"frame_buffer": {
|
|
"using_temporary_table": true,
|
|
"optimized_frame_evaluation": true
|
|
},
|
|
"functions": [
|
|
"row_number",
|
|
"sum",
|
|
"ntile"
|
|
]
|
|
}
|
|
],
|
|
"cost_info": {
|
|
"sort_cost": "7.00"
|
|
},
|
|
"table": {
|
|
"table_name": "t1",
|
|
"access_type": "ALL",
|
|
"rows_examined_per_scan": 7,
|
|
"rows_produced_per_join": 7,
|
|
"filtered": "100.00",
|
|
"cost_info": {
|
|
"read_cost": "0.25",
|
|
"eval_cost": "0.70",
|
|
"prefix_cost": "0.95",
|
|
"data_read_per_join": "112"
|
|
},
|
|
"used_columns": [
|
|
"id"
|
|
]
|
|
}
|
|
}
|
|
}
|
|
}
|
|
Warnings:
|
|
Note 3599 Window function 'row_number' ignores the frame clause of window 'w' and aggregates over the whole partition
|
|
Note 3599 Window function 'ntile' ignores the frame clause of window 'w' and aggregates over the whole partition
|
|
Note 1003 /* select#1 */ select `test`.`t1`.`id` AS `id`,row_number() OVER `w` AS `ROW_NUMBER() OVER w`,sum(`test`.`t1`.`id`) OVER `w` AS `SUM(id) OVER w`,ntile(5) OVER `w` AS `NTILE(5) OVER w` from `test`.`t1` window `w` AS (ORDER BY `test`.`t1`.`id` ROWS BETWEEN UNBOUNDED PRECEDING AND 2 PRECEDING)
|
|
----------------------------------------------------------------------
|
|
- SUM with frames in combination with non-framing window functions
|
|
- ROW_NUMBER and RANK
|
|
----------------------------------------------------------------------
|
|
EXPLAIN FORMAT=JSON SELECT ROW_NUMBER() OVER w, id, SUM(id) OVER w, sex FROM t1
|
|
WINDOW w AS (PARTITION BY sex ORDER BY id ROWS BETWEEN UNBOUNDED PRECEDING AND UNBOUNDED FOLLOWING);
|
|
EXPLAIN
|
|
{
|
|
"query_block": {
|
|
"select_id": 1,
|
|
"cost_info": {
|
|
"query_cost": "7.95"
|
|
},
|
|
"windowing": {
|
|
"windows": [
|
|
{
|
|
"name": "w",
|
|
"using_filesort": true,
|
|
"filesort_key": [
|
|
"`sex`",
|
|
"`id`"
|
|
],
|
|
"frame_buffer": {
|
|
"using_temporary_table": true,
|
|
"optimized_frame_evaluation": true
|
|
},
|
|
"functions": [
|
|
"row_number",
|
|
"sum"
|
|
]
|
|
}
|
|
],
|
|
"cost_info": {
|
|
"sort_cost": "7.00"
|
|
},
|
|
"table": {
|
|
"table_name": "t1",
|
|
"access_type": "ALL",
|
|
"rows_examined_per_scan": 7,
|
|
"rows_produced_per_join": 7,
|
|
"filtered": "100.00",
|
|
"cost_info": {
|
|
"read_cost": "0.25",
|
|
"eval_cost": "0.70",
|
|
"prefix_cost": "0.95",
|
|
"data_read_per_join": "112"
|
|
},
|
|
"used_columns": [
|
|
"id",
|
|
"sex"
|
|
]
|
|
}
|
|
}
|
|
}
|
|
}
|
|
Warnings:
|
|
Note 3599 Window function 'row_number' ignores the frame clause of window 'w' and aggregates over the whole partition
|
|
Note 1003 /* select#1 */ select row_number() OVER `w` AS `ROW_NUMBER() OVER w`,`test`.`t1`.`id` AS `id`,sum(`test`.`t1`.`id`) OVER `w` AS `SUM(id) OVER w`,`test`.`t1`.`sex` AS `sex` from `test`.`t1` window `w` AS (PARTITION BY `test`.`t1`.`sex` ORDER BY `test`.`t1`.`id` ROWS BETWEEN UNBOUNDED PRECEDING AND UNBOUNDED FOLLOWING)
|
|
EXPLAIN FORMAT=JSON SELECT ROW_NUMBER() OVER w, SUM(id) OVER w FROM t1
|
|
WINDOW w AS (PARTITION BY sex ORDER BY id
|
|
ROWS BETWEEN 1 FOLLOWING AND 2 FOLLOWING);
|
|
EXPLAIN
|
|
{
|
|
"query_block": {
|
|
"select_id": 1,
|
|
"cost_info": {
|
|
"query_cost": "7.95"
|
|
},
|
|
"windowing": {
|
|
"windows": [
|
|
{
|
|
"name": "w",
|
|
"using_filesort": true,
|
|
"filesort_key": [
|
|
"`sex`",
|
|
"`id`"
|
|
],
|
|
"frame_buffer": {
|
|
"using_temporary_table": true,
|
|
"optimized_frame_evaluation": true
|
|
},
|
|
"functions": [
|
|
"row_number",
|
|
"sum"
|
|
]
|
|
}
|
|
],
|
|
"cost_info": {
|
|
"sort_cost": "7.00"
|
|
},
|
|
"table": {
|
|
"table_name": "t1",
|
|
"access_type": "ALL",
|
|
"rows_examined_per_scan": 7,
|
|
"rows_produced_per_join": 7,
|
|
"filtered": "100.00",
|
|
"cost_info": {
|
|
"read_cost": "0.25",
|
|
"eval_cost": "0.70",
|
|
"prefix_cost": "0.95",
|
|
"data_read_per_join": "112"
|
|
},
|
|
"used_columns": [
|
|
"id",
|
|
"sex"
|
|
]
|
|
}
|
|
}
|
|
}
|
|
}
|
|
Warnings:
|
|
Note 3599 Window function 'row_number' ignores the frame clause of window 'w' and aggregates over the whole partition
|
|
Note 1003 /* select#1 */ select row_number() OVER `w` AS `ROW_NUMBER() OVER w`,sum(`test`.`t1`.`id`) OVER `w` AS `SUM(id) OVER w` from `test`.`t1` window `w` AS (PARTITION BY `test`.`t1`.`sex` ORDER BY `test`.`t1`.`id` ROWS BETWEEN 1 FOLLOWING AND 2 FOLLOWING)
|
|
INSERT INTO t1 VALUES (10, NULL);
|
|
ANALYZE TABLE t1;
|
|
Table Op Msg_type Msg_text
|
|
test.t1 analyze status OK
|
|
EXPLAIN FORMAT=JSON SELECT RANK() OVER w, id, SUM(id) OVER w, sex FROM t1
|
|
WINDOW w AS (PARTITION BY sex ORDER BY id);
|
|
EXPLAIN
|
|
{
|
|
"query_block": {
|
|
"select_id": 1,
|
|
"cost_info": {
|
|
"query_cost": "9.05"
|
|
},
|
|
"windowing": {
|
|
"windows": [
|
|
{
|
|
"name": "w",
|
|
"using_filesort": true,
|
|
"filesort_key": [
|
|
"`sex`",
|
|
"`id`"
|
|
],
|
|
"frame_buffer": {
|
|
"using_temporary_table": true,
|
|
"optimized_frame_evaluation": true
|
|
},
|
|
"functions": [
|
|
"rank",
|
|
"sum"
|
|
]
|
|
}
|
|
],
|
|
"cost_info": {
|
|
"sort_cost": "8.00"
|
|
},
|
|
"table": {
|
|
"table_name": "t1",
|
|
"access_type": "ALL",
|
|
"rows_examined_per_scan": 8,
|
|
"rows_produced_per_join": 8,
|
|
"filtered": "100.00",
|
|
"cost_info": {
|
|
"read_cost": "0.25",
|
|
"eval_cost": "0.80",
|
|
"prefix_cost": "1.05",
|
|
"data_read_per_join": "128"
|
|
},
|
|
"used_columns": [
|
|
"id",
|
|
"sex"
|
|
]
|
|
}
|
|
}
|
|
}
|
|
}
|
|
Warnings:
|
|
Note 1003 /* select#1 */ select rank() OVER `w` AS `RANK() OVER w`,`test`.`t1`.`id` AS `id`,sum(`test`.`t1`.`id`) OVER `w` AS `SUM(id) OVER w`,`test`.`t1`.`sex` AS `sex` from `test`.`t1` window `w` AS (PARTITION BY `test`.`t1`.`sex` ORDER BY `test`.`t1`.`id` )
|
|
EXPLAIN FORMAT=JSON SELECT RANK() OVER w, SUM(id) OVER w FROM t1
|
|
WINDOW w AS (PARTITION BY sex ORDER BY id
|
|
ROWS BETWEEN 1 FOLLOWING AND 2 FOLLOWING);
|
|
EXPLAIN
|
|
{
|
|
"query_block": {
|
|
"select_id": 1,
|
|
"cost_info": {
|
|
"query_cost": "9.05"
|
|
},
|
|
"windowing": {
|
|
"windows": [
|
|
{
|
|
"name": "w",
|
|
"using_filesort": true,
|
|
"filesort_key": [
|
|
"`sex`",
|
|
"`id`"
|
|
],
|
|
"frame_buffer": {
|
|
"using_temporary_table": true,
|
|
"optimized_frame_evaluation": true
|
|
},
|
|
"functions": [
|
|
"rank",
|
|
"sum"
|
|
]
|
|
}
|
|
],
|
|
"cost_info": {
|
|
"sort_cost": "8.00"
|
|
},
|
|
"table": {
|
|
"table_name": "t1",
|
|
"access_type": "ALL",
|
|
"rows_examined_per_scan": 8,
|
|
"rows_produced_per_join": 8,
|
|
"filtered": "100.00",
|
|
"cost_info": {
|
|
"read_cost": "0.25",
|
|
"eval_cost": "0.80",
|
|
"prefix_cost": "1.05",
|
|
"data_read_per_join": "128"
|
|
},
|
|
"used_columns": [
|
|
"id",
|
|
"sex"
|
|
]
|
|
}
|
|
}
|
|
}
|
|
}
|
|
Warnings:
|
|
Note 3599 Window function 'rank' ignores the frame clause of window 'w' and aggregates over the whole partition
|
|
Note 1003 /* select#1 */ select rank() OVER `w` AS `RANK() OVER w`,sum(`test`.`t1`.`id`) OVER `w` AS `SUM(id) OVER w` from `test`.`t1` window `w` AS (PARTITION BY `test`.`t1`.`sex` ORDER BY `test`.`t1`.`id` ROWS BETWEEN 1 FOLLOWING AND 2 FOLLOWING)
|
|
EXPLAIN FORMAT=JSON SELECT id, sex, SUM(id) OVER w,
|
|
ROW_NUMBER() OVER w,
|
|
RANK() OVER w FROM t1
|
|
WINDOW w AS (PARTITION BY sex ORDER BY id ROWS BETWEEN 2 PRECEDING AND 1 PRECEDING);
|
|
EXPLAIN
|
|
{
|
|
"query_block": {
|
|
"select_id": 1,
|
|
"cost_info": {
|
|
"query_cost": "9.05"
|
|
},
|
|
"windowing": {
|
|
"windows": [
|
|
{
|
|
"name": "w",
|
|
"using_filesort": true,
|
|
"filesort_key": [
|
|
"`sex`",
|
|
"`id`"
|
|
],
|
|
"frame_buffer": {
|
|
"using_temporary_table": true,
|
|
"optimized_frame_evaluation": true
|
|
},
|
|
"functions": [
|
|
"sum",
|
|
"row_number",
|
|
"rank"
|
|
]
|
|
}
|
|
],
|
|
"cost_info": {
|
|
"sort_cost": "8.00"
|
|
},
|
|
"table": {
|
|
"table_name": "t1",
|
|
"access_type": "ALL",
|
|
"rows_examined_per_scan": 8,
|
|
"rows_produced_per_join": 8,
|
|
"filtered": "100.00",
|
|
"cost_info": {
|
|
"read_cost": "0.25",
|
|
"eval_cost": "0.80",
|
|
"prefix_cost": "1.05",
|
|
"data_read_per_join": "128"
|
|
},
|
|
"used_columns": [
|
|
"id",
|
|
"sex"
|
|
]
|
|
}
|
|
}
|
|
}
|
|
}
|
|
Warnings:
|
|
Note 3599 Window function 'row_number' ignores the frame clause of window 'w' and aggregates over the whole partition
|
|
Note 3599 Window function 'rank' ignores the frame clause of window 'w' and aggregates over the whole partition
|
|
Note 1003 /* select#1 */ select `test`.`t1`.`id` AS `id`,`test`.`t1`.`sex` AS `sex`,sum(`test`.`t1`.`id`) OVER `w` AS `SUM(id) OVER w`,row_number() OVER `w` AS `ROW_NUMBER() OVER w`,rank() OVER `w` AS `RANK() OVER w` from `test`.`t1` window `w` AS (PARTITION BY `test`.`t1`.`sex` ORDER BY `test`.`t1`.`id` ROWS BETWEEN 2 PRECEDING AND 1 PRECEDING)
|
|
----------------------------------------------------------------------
|
|
- FIRST_VALUE
|
|
----------------------------------------------------------------------
|
|
INSERT INTO t1 VALUES (NULL, 'M');
|
|
ANALYZE TABLE t1;
|
|
Table Op Msg_type Msg_text
|
|
test.t1 analyze status OK
|
|
EXPLAIN FORMAT=JSON SELECT id, FIRST_VALUE(id) OVER w FROM t1 WINDOW w AS ();
|
|
EXPLAIN
|
|
{
|
|
"query_block": {
|
|
"select_id": 1,
|
|
"cost_info": {
|
|
"query_cost": "1.15"
|
|
},
|
|
"windowing": {
|
|
"windows": [
|
|
{
|
|
"name": "w",
|
|
"frame_buffer": {
|
|
"using_temporary_table": true,
|
|
"optimized_frame_evaluation": true
|
|
},
|
|
"functions": [
|
|
"first_value"
|
|
]
|
|
}
|
|
],
|
|
"table": {
|
|
"table_name": "t1",
|
|
"access_type": "ALL",
|
|
"rows_examined_per_scan": 9,
|
|
"rows_produced_per_join": 9,
|
|
"filtered": "100.00",
|
|
"cost_info": {
|
|
"read_cost": "0.25",
|
|
"eval_cost": "0.90",
|
|
"prefix_cost": "1.15",
|
|
"data_read_per_join": "144"
|
|
},
|
|
"used_columns": [
|
|
"id"
|
|
]
|
|
}
|
|
}
|
|
}
|
|
}
|
|
Warnings:
|
|
Note 1003 /* select#1 */ select `test`.`t1`.`id` AS `id`,first_value(`test`.`t1`.`id`) OVER `w` AS `FIRST_VALUE(id) OVER w` from `test`.`t1` window `w` AS ()
|
|
select id, FIRST_VALUE(id) OVER (ROWS UNBOUNDED PRECEDING) FROM t1;
|
|
id FIRST_VALUE(id) OVER (ROWS UNBOUNDED PRECEDING)
|
|
1 1
|
|
2 1
|
|
3 1
|
|
4 1
|
|
5 1
|
|
10 1
|
|
11 1
|
|
10 1
|
|
NULL 1
|
|
EXPLAIN FORMAT=JSON SELECT id, FIRST_VALUE(id) OVER w FROM t1 WINDOW w AS (ORDER BY id);
|
|
EXPLAIN
|
|
{
|
|
"query_block": {
|
|
"select_id": 1,
|
|
"cost_info": {
|
|
"query_cost": "10.15"
|
|
},
|
|
"windowing": {
|
|
"windows": [
|
|
{
|
|
"name": "w",
|
|
"using_filesort": true,
|
|
"filesort_key": [
|
|
"`id`"
|
|
],
|
|
"frame_buffer": {
|
|
"using_temporary_table": true,
|
|
"optimized_frame_evaluation": true
|
|
},
|
|
"functions": [
|
|
"first_value"
|
|
]
|
|
}
|
|
],
|
|
"cost_info": {
|
|
"sort_cost": "9.00"
|
|
},
|
|
"table": {
|
|
"table_name": "t1",
|
|
"access_type": "ALL",
|
|
"rows_examined_per_scan": 9,
|
|
"rows_produced_per_join": 9,
|
|
"filtered": "100.00",
|
|
"cost_info": {
|
|
"read_cost": "0.25",
|
|
"eval_cost": "0.90",
|
|
"prefix_cost": "1.15",
|
|
"data_read_per_join": "144"
|
|
},
|
|
"used_columns": [
|
|
"id"
|
|
]
|
|
}
|
|
}
|
|
}
|
|
}
|
|
Warnings:
|
|
Note 1003 /* select#1 */ select `test`.`t1`.`id` AS `id`,first_value(`test`.`t1`.`id`) OVER `w` AS `FIRST_VALUE(id) OVER w` from `test`.`t1` window `w` AS (ORDER BY `test`.`t1`.`id` )
|
|
EXPLAIN FORMAT=JSON SELECT id, FIRST_VALUE(id) OVER w FROM t1 WINDOW w AS (PARTITION BY sex ORDER BY id);
|
|
EXPLAIN
|
|
{
|
|
"query_block": {
|
|
"select_id": 1,
|
|
"cost_info": {
|
|
"query_cost": "10.15"
|
|
},
|
|
"windowing": {
|
|
"windows": [
|
|
{
|
|
"name": "w",
|
|
"using_filesort": true,
|
|
"filesort_key": [
|
|
"`sex`",
|
|
"`id`"
|
|
],
|
|
"frame_buffer": {
|
|
"using_temporary_table": true,
|
|
"optimized_frame_evaluation": true
|
|
},
|
|
"functions": [
|
|
"first_value"
|
|
]
|
|
}
|
|
],
|
|
"cost_info": {
|
|
"sort_cost": "9.00"
|
|
},
|
|
"table": {
|
|
"table_name": "t1",
|
|
"access_type": "ALL",
|
|
"rows_examined_per_scan": 9,
|
|
"rows_produced_per_join": 9,
|
|
"filtered": "100.00",
|
|
"cost_info": {
|
|
"read_cost": "0.25",
|
|
"eval_cost": "0.90",
|
|
"prefix_cost": "1.15",
|
|
"data_read_per_join": "144"
|
|
},
|
|
"used_columns": [
|
|
"id",
|
|
"sex"
|
|
]
|
|
}
|
|
}
|
|
}
|
|
}
|
|
Warnings:
|
|
Note 1003 /* select#1 */ select `test`.`t1`.`id` AS `id`,first_value(`test`.`t1`.`id`) OVER `w` AS `FIRST_VALUE(id) OVER w` from `test`.`t1` window `w` AS (PARTITION BY `test`.`t1`.`sex` ORDER BY `test`.`t1`.`id` )
|
|
EXPLAIN FORMAT=JSON SELECT id, FIRST_VALUE(id) OVER w FROM t1 WINDOW w AS (ORDER BY id DESC);
|
|
EXPLAIN
|
|
{
|
|
"query_block": {
|
|
"select_id": 1,
|
|
"cost_info": {
|
|
"query_cost": "10.15"
|
|
},
|
|
"windowing": {
|
|
"windows": [
|
|
{
|
|
"name": "w",
|
|
"using_filesort": true,
|
|
"filesort_key": [
|
|
"`id` desc"
|
|
],
|
|
"frame_buffer": {
|
|
"using_temporary_table": true,
|
|
"optimized_frame_evaluation": true
|
|
},
|
|
"functions": [
|
|
"first_value"
|
|
]
|
|
}
|
|
],
|
|
"cost_info": {
|
|
"sort_cost": "9.00"
|
|
},
|
|
"table": {
|
|
"table_name": "t1",
|
|
"access_type": "ALL",
|
|
"rows_examined_per_scan": 9,
|
|
"rows_produced_per_join": 9,
|
|
"filtered": "100.00",
|
|
"cost_info": {
|
|
"read_cost": "0.25",
|
|
"eval_cost": "0.90",
|
|
"prefix_cost": "1.15",
|
|
"data_read_per_join": "144"
|
|
},
|
|
"used_columns": [
|
|
"id"
|
|
]
|
|
}
|
|
}
|
|
}
|
|
}
|
|
Warnings:
|
|
Note 1003 /* select#1 */ select `test`.`t1`.`id` AS `id`,first_value(`test`.`t1`.`id`) OVER `w` AS `FIRST_VALUE(id) OVER w` from `test`.`t1` window `w` AS (ORDER BY `test`.`t1`.`id` desc )
|
|
EXPLAIN FORMAT=JSON SELECT id, FIRST_VALUE(id) OVER w FROM t1 WINDOW w AS (ORDER BY id ROWS 2 PRECEDING);
|
|
EXPLAIN
|
|
{
|
|
"query_block": {
|
|
"select_id": 1,
|
|
"cost_info": {
|
|
"query_cost": "10.15"
|
|
},
|
|
"windowing": {
|
|
"windows": [
|
|
{
|
|
"name": "w",
|
|
"using_filesort": true,
|
|
"filesort_key": [
|
|
"`id`"
|
|
],
|
|
"frame_buffer": {
|
|
"using_temporary_table": true,
|
|
"optimized_frame_evaluation": true
|
|
},
|
|
"functions": [
|
|
"first_value"
|
|
]
|
|
}
|
|
],
|
|
"cost_info": {
|
|
"sort_cost": "9.00"
|
|
},
|
|
"table": {
|
|
"table_name": "t1",
|
|
"access_type": "ALL",
|
|
"rows_examined_per_scan": 9,
|
|
"rows_produced_per_join": 9,
|
|
"filtered": "100.00",
|
|
"cost_info": {
|
|
"read_cost": "0.25",
|
|
"eval_cost": "0.90",
|
|
"prefix_cost": "1.15",
|
|
"data_read_per_join": "144"
|
|
},
|
|
"used_columns": [
|
|
"id"
|
|
]
|
|
}
|
|
}
|
|
}
|
|
}
|
|
Warnings:
|
|
Note 1003 /* select#1 */ select `test`.`t1`.`id` AS `id`,first_value(`test`.`t1`.`id`) OVER `w` AS `FIRST_VALUE(id) OVER w` from `test`.`t1` window `w` AS (ORDER BY `test`.`t1`.`id` ROWS BETWEEN 2 PRECEDING AND CURRENT ROW)
|
|
EXPLAIN FORMAT=JSON SELECT id, FIRST_VALUE(id) OVER w FROM t1 WINDOW w AS (ORDER BY id RANGE 2 PRECEDING);
|
|
EXPLAIN
|
|
{
|
|
"query_block": {
|
|
"select_id": 1,
|
|
"cost_info": {
|
|
"query_cost": "10.15"
|
|
},
|
|
"windowing": {
|
|
"windows": [
|
|
{
|
|
"name": "w",
|
|
"using_filesort": true,
|
|
"filesort_key": [
|
|
"`id`"
|
|
],
|
|
"frame_buffer": {
|
|
"using_temporary_table": true,
|
|
"optimized_frame_evaluation": true
|
|
},
|
|
"functions": [
|
|
"first_value"
|
|
]
|
|
}
|
|
],
|
|
"cost_info": {
|
|
"sort_cost": "9.00"
|
|
},
|
|
"table": {
|
|
"table_name": "t1",
|
|
"access_type": "ALL",
|
|
"rows_examined_per_scan": 9,
|
|
"rows_produced_per_join": 9,
|
|
"filtered": "100.00",
|
|
"cost_info": {
|
|
"read_cost": "0.25",
|
|
"eval_cost": "0.90",
|
|
"prefix_cost": "1.15",
|
|
"data_read_per_join": "144"
|
|
},
|
|
"used_columns": [
|
|
"id"
|
|
]
|
|
}
|
|
}
|
|
}
|
|
}
|
|
Warnings:
|
|
Note 1003 /* select#1 */ select `test`.`t1`.`id` AS `id`,first_value(`test`.`t1`.`id`) OVER `w` AS `FIRST_VALUE(id) OVER w` from `test`.`t1` window `w` AS (ORDER BY `test`.`t1`.`id` RANGE BETWEEN 2 PRECEDING AND CURRENT ROW)
|
|
EXPLAIN FORMAT=JSON SELECT id, FIRST_VALUE(id) OVER w FROM t1 WINDOW w AS (ORDER BY id ROWS BETWEEN 2 PRECEDING AND 1 PRECEDING);
|
|
EXPLAIN
|
|
{
|
|
"query_block": {
|
|
"select_id": 1,
|
|
"cost_info": {
|
|
"query_cost": "10.15"
|
|
},
|
|
"windowing": {
|
|
"windows": [
|
|
{
|
|
"name": "w",
|
|
"using_filesort": true,
|
|
"filesort_key": [
|
|
"`id`"
|
|
],
|
|
"frame_buffer": {
|
|
"using_temporary_table": true,
|
|
"optimized_frame_evaluation": true
|
|
},
|
|
"functions": [
|
|
"first_value"
|
|
]
|
|
}
|
|
],
|
|
"cost_info": {
|
|
"sort_cost": "9.00"
|
|
},
|
|
"table": {
|
|
"table_name": "t1",
|
|
"access_type": "ALL",
|
|
"rows_examined_per_scan": 9,
|
|
"rows_produced_per_join": 9,
|
|
"filtered": "100.00",
|
|
"cost_info": {
|
|
"read_cost": "0.25",
|
|
"eval_cost": "0.90",
|
|
"prefix_cost": "1.15",
|
|
"data_read_per_join": "144"
|
|
},
|
|
"used_columns": [
|
|
"id"
|
|
]
|
|
}
|
|
}
|
|
}
|
|
}
|
|
Warnings:
|
|
Note 1003 /* select#1 */ select `test`.`t1`.`id` AS `id`,first_value(`test`.`t1`.`id`) OVER `w` AS `FIRST_VALUE(id) OVER w` from `test`.`t1` window `w` AS (ORDER BY `test`.`t1`.`id` ROWS BETWEEN 2 PRECEDING AND 1 PRECEDING)
|
|
EXPLAIN FORMAT=JSON SELECT id, FIRST_VALUE(id) OVER w FROM t1 WINDOW w AS (ORDER BY id RANGE BETWEEN 2 PRECEDING AND 1 PRECEDING);
|
|
EXPLAIN
|
|
{
|
|
"query_block": {
|
|
"select_id": 1,
|
|
"cost_info": {
|
|
"query_cost": "10.15"
|
|
},
|
|
"windowing": {
|
|
"windows": [
|
|
{
|
|
"name": "w",
|
|
"using_filesort": true,
|
|
"filesort_key": [
|
|
"`id`"
|
|
],
|
|
"frame_buffer": {
|
|
"using_temporary_table": true,
|
|
"optimized_frame_evaluation": true
|
|
},
|
|
"functions": [
|
|
"first_value"
|
|
]
|
|
}
|
|
],
|
|
"cost_info": {
|
|
"sort_cost": "9.00"
|
|
},
|
|
"table": {
|
|
"table_name": "t1",
|
|
"access_type": "ALL",
|
|
"rows_examined_per_scan": 9,
|
|
"rows_produced_per_join": 9,
|
|
"filtered": "100.00",
|
|
"cost_info": {
|
|
"read_cost": "0.25",
|
|
"eval_cost": "0.90",
|
|
"prefix_cost": "1.15",
|
|
"data_read_per_join": "144"
|
|
},
|
|
"used_columns": [
|
|
"id"
|
|
]
|
|
}
|
|
}
|
|
}
|
|
}
|
|
Warnings:
|
|
Note 1003 /* select#1 */ select `test`.`t1`.`id` AS `id`,first_value(`test`.`t1`.`id`) OVER `w` AS `FIRST_VALUE(id) OVER w` from `test`.`t1` window `w` AS (ORDER BY `test`.`t1`.`id` RANGE BETWEEN 2 PRECEDING AND 1 PRECEDING)
|
|
EXPLAIN FORMAT=JSON SELECT id, FIRST_VALUE(id) OVER w FROM t1 WINDOW w AS (ORDER BY id ROWS BETWEEN CURRENT ROW AND UNBOUNDED FOLLOWING);
|
|
EXPLAIN
|
|
{
|
|
"query_block": {
|
|
"select_id": 1,
|
|
"cost_info": {
|
|
"query_cost": "10.15"
|
|
},
|
|
"windowing": {
|
|
"windows": [
|
|
{
|
|
"name": "w",
|
|
"using_filesort": true,
|
|
"filesort_key": [
|
|
"`id`"
|
|
],
|
|
"frame_buffer": {
|
|
"using_temporary_table": true,
|
|
"optimized_frame_evaluation": true
|
|
},
|
|
"functions": [
|
|
"first_value"
|
|
]
|
|
}
|
|
],
|
|
"cost_info": {
|
|
"sort_cost": "9.00"
|
|
},
|
|
"table": {
|
|
"table_name": "t1",
|
|
"access_type": "ALL",
|
|
"rows_examined_per_scan": 9,
|
|
"rows_produced_per_join": 9,
|
|
"filtered": "100.00",
|
|
"cost_info": {
|
|
"read_cost": "0.25",
|
|
"eval_cost": "0.90",
|
|
"prefix_cost": "1.15",
|
|
"data_read_per_join": "144"
|
|
},
|
|
"used_columns": [
|
|
"id"
|
|
]
|
|
}
|
|
}
|
|
}
|
|
}
|
|
Warnings:
|
|
Note 1003 /* select#1 */ select `test`.`t1`.`id` AS `id`,first_value(`test`.`t1`.`id`) OVER `w` AS `FIRST_VALUE(id) OVER w` from `test`.`t1` window `w` AS (ORDER BY `test`.`t1`.`id` ROWS BETWEEN CURRENT ROW AND UNBOUNDED FOLLOWING)
|
|
EXPLAIN FORMAT=JSON SELECT id, FIRST_VALUE(id) OVER w FROM t1 WINDOW w AS (ORDER BY id RANGE BETWEEN CURRENT ROW AND UNBOUNDED FOLLOWING);
|
|
EXPLAIN
|
|
{
|
|
"query_block": {
|
|
"select_id": 1,
|
|
"cost_info": {
|
|
"query_cost": "10.15"
|
|
},
|
|
"windowing": {
|
|
"windows": [
|
|
{
|
|
"name": "w",
|
|
"using_filesort": true,
|
|
"filesort_key": [
|
|
"`id`"
|
|
],
|
|
"frame_buffer": {
|
|
"using_temporary_table": true,
|
|
"optimized_frame_evaluation": true
|
|
},
|
|
"functions": [
|
|
"first_value"
|
|
]
|
|
}
|
|
],
|
|
"cost_info": {
|
|
"sort_cost": "9.00"
|
|
},
|
|
"table": {
|
|
"table_name": "t1",
|
|
"access_type": "ALL",
|
|
"rows_examined_per_scan": 9,
|
|
"rows_produced_per_join": 9,
|
|
"filtered": "100.00",
|
|
"cost_info": {
|
|
"read_cost": "0.25",
|
|
"eval_cost": "0.90",
|
|
"prefix_cost": "1.15",
|
|
"data_read_per_join": "144"
|
|
},
|
|
"used_columns": [
|
|
"id"
|
|
]
|
|
}
|
|
}
|
|
}
|
|
}
|
|
Warnings:
|
|
Note 1003 /* select#1 */ select `test`.`t1`.`id` AS `id`,first_value(`test`.`t1`.`id`) OVER `w` AS `FIRST_VALUE(id) OVER w` from `test`.`t1` window `w` AS (ORDER BY `test`.`t1`.`id` RANGE BETWEEN CURRENT ROW AND UNBOUNDED FOLLOWING)
|
|
CREATE VIEW v AS
|
|
SELECT id, FIRST_VALUE(id) OVER w FROM t1 WINDOW w AS (ORDER BY id RANGE BETWEEN CURRENT ROW AND UNBOUNDED FOLLOWING);
|
|
SHOW CREATE VIEW v;
|
|
View Create View character_set_client collation_connection
|
|
v CREATE ALGORITHM=UNDEFINED DEFINER=`root`@`localhost` SQL SECURITY DEFINER VIEW `v` AS select `t1`.`id` AS `id`,first_value(`t1`.`id`) OVER `w` AS `FIRST_VALUE(id) OVER w` from `t1` window `w` AS (ORDER BY `t1`.`id` RANGE BETWEEN CURRENT ROW AND UNBOUNDED FOLLOWING) utf8 utf8_general_ci
|
|
EXPLAIN FORMAT=JSON SELECT * FROM v;
|
|
EXPLAIN
|
|
{
|
|
"query_block": {
|
|
"select_id": 1,
|
|
"cost_info": {
|
|
"query_cost": "3.51"
|
|
},
|
|
"table": {
|
|
"table_name": "v",
|
|
"access_type": "ALL",
|
|
"rows_examined_per_scan": 9,
|
|
"rows_produced_per_join": 9,
|
|
"filtered": "100.00",
|
|
"cost_info": {
|
|
"read_cost": "2.61",
|
|
"eval_cost": "0.90",
|
|
"prefix_cost": "3.51",
|
|
"data_read_per_join": "216"
|
|
},
|
|
"used_columns": [
|
|
"id",
|
|
"FIRST_VALUE(id) OVER w"
|
|
],
|
|
"materialized_from_subquery": {
|
|
"using_temporary_table": true,
|
|
"dependent": false,
|
|
"cacheable": true,
|
|
"query_block": {
|
|
"select_id": 2,
|
|
"cost_info": {
|
|
"query_cost": "10.15"
|
|
},
|
|
"windowing": {
|
|
"windows": [
|
|
{
|
|
"name": "w",
|
|
"using_filesort": true,
|
|
"filesort_key": [
|
|
"`id`"
|
|
],
|
|
"frame_buffer": {
|
|
"using_temporary_table": true,
|
|
"optimized_frame_evaluation": true
|
|
},
|
|
"functions": [
|
|
"first_value"
|
|
]
|
|
}
|
|
],
|
|
"cost_info": {
|
|
"sort_cost": "9.00"
|
|
},
|
|
"table": {
|
|
"table_name": "t1",
|
|
"access_type": "ALL",
|
|
"rows_examined_per_scan": 9,
|
|
"rows_produced_per_join": 9,
|
|
"filtered": "100.00",
|
|
"cost_info": {
|
|
"read_cost": "0.25",
|
|
"eval_cost": "0.90",
|
|
"prefix_cost": "1.15",
|
|
"data_read_per_join": "144"
|
|
},
|
|
"used_columns": [
|
|
"id"
|
|
]
|
|
}
|
|
}
|
|
}
|
|
}
|
|
}
|
|
}
|
|
}
|
|
Warnings:
|
|
Note 1003 /* select#1 */ select `v`.`id` AS `id`,`v`.`FIRST_VALUE(id) OVER w` AS `FIRST_VALUE(id) OVER w` from `test`.`v`
|
|
DROP VIEW v;
|
|
EXPLAIN FORMAT=JSON SELECT id, FIRST_VALUE(id) OVER w FROM t1 WINDOW w AS (ORDER BY id ROWS BETWEEN 2 FOLLOWING AND 3 FOLLOWING);
|
|
EXPLAIN
|
|
{
|
|
"query_block": {
|
|
"select_id": 1,
|
|
"cost_info": {
|
|
"query_cost": "10.15"
|
|
},
|
|
"windowing": {
|
|
"windows": [
|
|
{
|
|
"name": "w",
|
|
"using_filesort": true,
|
|
"filesort_key": [
|
|
"`id`"
|
|
],
|
|
"frame_buffer": {
|
|
"using_temporary_table": true,
|
|
"optimized_frame_evaluation": true
|
|
},
|
|
"functions": [
|
|
"first_value"
|
|
]
|
|
}
|
|
],
|
|
"cost_info": {
|
|
"sort_cost": "9.00"
|
|
},
|
|
"table": {
|
|
"table_name": "t1",
|
|
"access_type": "ALL",
|
|
"rows_examined_per_scan": 9,
|
|
"rows_produced_per_join": 9,
|
|
"filtered": "100.00",
|
|
"cost_info": {
|
|
"read_cost": "0.25",
|
|
"eval_cost": "0.90",
|
|
"prefix_cost": "1.15",
|
|
"data_read_per_join": "144"
|
|
},
|
|
"used_columns": [
|
|
"id"
|
|
]
|
|
}
|
|
}
|
|
}
|
|
}
|
|
Warnings:
|
|
Note 1003 /* select#1 */ select `test`.`t1`.`id` AS `id`,first_value(`test`.`t1`.`id`) OVER `w` AS `FIRST_VALUE(id) OVER w` from `test`.`t1` window `w` AS (ORDER BY `test`.`t1`.`id` ROWS BETWEEN 2 FOLLOWING AND 3 FOLLOWING)
|
|
EXPLAIN FORMAT=JSON SELECT id, FIRST_VALUE(id) OVER w FROM t1 WINDOW w AS (ORDER BY id RANGE BETWEEN 2 FOLLOWING AND 3 FOLLOWING);
|
|
EXPLAIN
|
|
{
|
|
"query_block": {
|
|
"select_id": 1,
|
|
"cost_info": {
|
|
"query_cost": "10.15"
|
|
},
|
|
"windowing": {
|
|
"windows": [
|
|
{
|
|
"name": "w",
|
|
"using_filesort": true,
|
|
"filesort_key": [
|
|
"`id`"
|
|
],
|
|
"frame_buffer": {
|
|
"using_temporary_table": true,
|
|
"optimized_frame_evaluation": true
|
|
},
|
|
"functions": [
|
|
"first_value"
|
|
]
|
|
}
|
|
],
|
|
"cost_info": {
|
|
"sort_cost": "9.00"
|
|
},
|
|
"table": {
|
|
"table_name": "t1",
|
|
"access_type": "ALL",
|
|
"rows_examined_per_scan": 9,
|
|
"rows_produced_per_join": 9,
|
|
"filtered": "100.00",
|
|
"cost_info": {
|
|
"read_cost": "0.25",
|
|
"eval_cost": "0.90",
|
|
"prefix_cost": "1.15",
|
|
"data_read_per_join": "144"
|
|
},
|
|
"used_columns": [
|
|
"id"
|
|
]
|
|
}
|
|
}
|
|
}
|
|
}
|
|
Warnings:
|
|
Note 1003 /* select#1 */ select `test`.`t1`.`id` AS `id`,first_value(`test`.`t1`.`id`) OVER `w` AS `FIRST_VALUE(id) OVER w` from `test`.`t1` window `w` AS (ORDER BY `test`.`t1`.`id` RANGE BETWEEN 2 FOLLOWING AND 3 FOLLOWING)
|
|
CREATE TABLE td1 (id DOUBLE, sex CHAR(1));
|
|
INSERT INTO td1 SELECT * FROM t1;
|
|
ANALYZE TABLE td1;
|
|
Table Op Msg_type Msg_text
|
|
test.td1 analyze status OK
|
|
EXPLAIN FORMAT=JSON SELECT id, FIRST_VALUE(id) OVER w FROM td1 WINDOW w AS ();
|
|
EXPLAIN
|
|
{
|
|
"query_block": {
|
|
"select_id": 1,
|
|
"cost_info": {
|
|
"query_cost": "1.15"
|
|
},
|
|
"windowing": {
|
|
"windows": [
|
|
{
|
|
"name": "w",
|
|
"frame_buffer": {
|
|
"using_temporary_table": true,
|
|
"optimized_frame_evaluation": true
|
|
},
|
|
"functions": [
|
|
"first_value"
|
|
]
|
|
}
|
|
],
|
|
"table": {
|
|
"table_name": "td1",
|
|
"access_type": "ALL",
|
|
"rows_examined_per_scan": 9,
|
|
"rows_produced_per_join": 9,
|
|
"filtered": "100.00",
|
|
"cost_info": {
|
|
"read_cost": "0.25",
|
|
"eval_cost": "0.90",
|
|
"prefix_cost": "1.15",
|
|
"data_read_per_join": "144"
|
|
},
|
|
"used_columns": [
|
|
"id"
|
|
]
|
|
}
|
|
}
|
|
}
|
|
}
|
|
Warnings:
|
|
Note 1003 /* select#1 */ select `test`.`td1`.`id` AS `id`,first_value(`test`.`td1`.`id`) OVER `w` AS `FIRST_VALUE(id) OVER w` from `test`.`td1` window `w` AS ()
|
|
EXPLAIN FORMAT=JSON SELECT id, FIRST_VALUE(id) OVER w FROM td1 WINDOW w AS (ORDER BY id);
|
|
EXPLAIN
|
|
{
|
|
"query_block": {
|
|
"select_id": 1,
|
|
"cost_info": {
|
|
"query_cost": "10.15"
|
|
},
|
|
"windowing": {
|
|
"windows": [
|
|
{
|
|
"name": "w",
|
|
"using_filesort": true,
|
|
"filesort_key": [
|
|
"`id`"
|
|
],
|
|
"frame_buffer": {
|
|
"using_temporary_table": true,
|
|
"optimized_frame_evaluation": true
|
|
},
|
|
"functions": [
|
|
"first_value"
|
|
]
|
|
}
|
|
],
|
|
"cost_info": {
|
|
"sort_cost": "9.00"
|
|
},
|
|
"table": {
|
|
"table_name": "td1",
|
|
"access_type": "ALL",
|
|
"rows_examined_per_scan": 9,
|
|
"rows_produced_per_join": 9,
|
|
"filtered": "100.00",
|
|
"cost_info": {
|
|
"read_cost": "0.25",
|
|
"eval_cost": "0.90",
|
|
"prefix_cost": "1.15",
|
|
"data_read_per_join": "144"
|
|
},
|
|
"used_columns": [
|
|
"id"
|
|
]
|
|
}
|
|
}
|
|
}
|
|
}
|
|
Warnings:
|
|
Note 1003 /* select#1 */ select `test`.`td1`.`id` AS `id`,first_value(`test`.`td1`.`id`) OVER `w` AS `FIRST_VALUE(id) OVER w` from `test`.`td1` window `w` AS (ORDER BY `test`.`td1`.`id` )
|
|
EXPLAIN FORMAT=JSON SELECT id, FIRST_VALUE(id) OVER w FROM td1 WINDOW w AS (PARTITION BY sex ORDER BY id);
|
|
EXPLAIN
|
|
{
|
|
"query_block": {
|
|
"select_id": 1,
|
|
"cost_info": {
|
|
"query_cost": "10.15"
|
|
},
|
|
"windowing": {
|
|
"windows": [
|
|
{
|
|
"name": "w",
|
|
"using_filesort": true,
|
|
"filesort_key": [
|
|
"`sex`",
|
|
"`id`"
|
|
],
|
|
"frame_buffer": {
|
|
"using_temporary_table": true,
|
|
"optimized_frame_evaluation": true
|
|
},
|
|
"functions": [
|
|
"first_value"
|
|
]
|
|
}
|
|
],
|
|
"cost_info": {
|
|
"sort_cost": "9.00"
|
|
},
|
|
"table": {
|
|
"table_name": "td1",
|
|
"access_type": "ALL",
|
|
"rows_examined_per_scan": 9,
|
|
"rows_produced_per_join": 9,
|
|
"filtered": "100.00",
|
|
"cost_info": {
|
|
"read_cost": "0.25",
|
|
"eval_cost": "0.90",
|
|
"prefix_cost": "1.15",
|
|
"data_read_per_join": "144"
|
|
},
|
|
"used_columns": [
|
|
"id",
|
|
"sex"
|
|
]
|
|
}
|
|
}
|
|
}
|
|
}
|
|
Warnings:
|
|
Note 1003 /* select#1 */ select `test`.`td1`.`id` AS `id`,first_value(`test`.`td1`.`id`) OVER `w` AS `FIRST_VALUE(id) OVER w` from `test`.`td1` window `w` AS (PARTITION BY `test`.`td1`.`sex` ORDER BY `test`.`td1`.`id` )
|
|
EXPLAIN FORMAT=JSON SELECT id, FIRST_VALUE(id) OVER w FROM td1 WINDOW w AS (ORDER BY id DESC);
|
|
EXPLAIN
|
|
{
|
|
"query_block": {
|
|
"select_id": 1,
|
|
"cost_info": {
|
|
"query_cost": "10.15"
|
|
},
|
|
"windowing": {
|
|
"windows": [
|
|
{
|
|
"name": "w",
|
|
"using_filesort": true,
|
|
"filesort_key": [
|
|
"`id` desc"
|
|
],
|
|
"frame_buffer": {
|
|
"using_temporary_table": true,
|
|
"optimized_frame_evaluation": true
|
|
},
|
|
"functions": [
|
|
"first_value"
|
|
]
|
|
}
|
|
],
|
|
"cost_info": {
|
|
"sort_cost": "9.00"
|
|
},
|
|
"table": {
|
|
"table_name": "td1",
|
|
"access_type": "ALL",
|
|
"rows_examined_per_scan": 9,
|
|
"rows_produced_per_join": 9,
|
|
"filtered": "100.00",
|
|
"cost_info": {
|
|
"read_cost": "0.25",
|
|
"eval_cost": "0.90",
|
|
"prefix_cost": "1.15",
|
|
"data_read_per_join": "144"
|
|
},
|
|
"used_columns": [
|
|
"id"
|
|
]
|
|
}
|
|
}
|
|
}
|
|
}
|
|
Warnings:
|
|
Note 1003 /* select#1 */ select `test`.`td1`.`id` AS `id`,first_value(`test`.`td1`.`id`) OVER `w` AS `FIRST_VALUE(id) OVER w` from `test`.`td1` window `w` AS (ORDER BY `test`.`td1`.`id` desc )
|
|
EXPLAIN FORMAT=JSON SELECT id, FIRST_VALUE(id) OVER w FROM td1 WINDOW w AS (ORDER BY id ROWS 2 PRECEDING);
|
|
EXPLAIN
|
|
{
|
|
"query_block": {
|
|
"select_id": 1,
|
|
"cost_info": {
|
|
"query_cost": "10.15"
|
|
},
|
|
"windowing": {
|
|
"windows": [
|
|
{
|
|
"name": "w",
|
|
"using_filesort": true,
|
|
"filesort_key": [
|
|
"`id`"
|
|
],
|
|
"frame_buffer": {
|
|
"using_temporary_table": true,
|
|
"optimized_frame_evaluation": true
|
|
},
|
|
"functions": [
|
|
"first_value"
|
|
]
|
|
}
|
|
],
|
|
"cost_info": {
|
|
"sort_cost": "9.00"
|
|
},
|
|
"table": {
|
|
"table_name": "td1",
|
|
"access_type": "ALL",
|
|
"rows_examined_per_scan": 9,
|
|
"rows_produced_per_join": 9,
|
|
"filtered": "100.00",
|
|
"cost_info": {
|
|
"read_cost": "0.25",
|
|
"eval_cost": "0.90",
|
|
"prefix_cost": "1.15",
|
|
"data_read_per_join": "144"
|
|
},
|
|
"used_columns": [
|
|
"id"
|
|
]
|
|
}
|
|
}
|
|
}
|
|
}
|
|
Warnings:
|
|
Note 1003 /* select#1 */ select `test`.`td1`.`id` AS `id`,first_value(`test`.`td1`.`id`) OVER `w` AS `FIRST_VALUE(id) OVER w` from `test`.`td1` window `w` AS (ORDER BY `test`.`td1`.`id` ROWS BETWEEN 2 PRECEDING AND CURRENT ROW)
|
|
EXPLAIN FORMAT=JSON SELECT id, FIRST_VALUE(id) OVER w FROM td1 WINDOW w AS (ORDER BY id RANGE 2 PRECEDING);
|
|
EXPLAIN
|
|
{
|
|
"query_block": {
|
|
"select_id": 1,
|
|
"cost_info": {
|
|
"query_cost": "10.15"
|
|
},
|
|
"windowing": {
|
|
"windows": [
|
|
{
|
|
"name": "w",
|
|
"using_filesort": true,
|
|
"filesort_key": [
|
|
"`id`"
|
|
],
|
|
"frame_buffer": {
|
|
"using_temporary_table": true,
|
|
"optimized_frame_evaluation": true
|
|
},
|
|
"functions": [
|
|
"first_value"
|
|
]
|
|
}
|
|
],
|
|
"cost_info": {
|
|
"sort_cost": "9.00"
|
|
},
|
|
"table": {
|
|
"table_name": "td1",
|
|
"access_type": "ALL",
|
|
"rows_examined_per_scan": 9,
|
|
"rows_produced_per_join": 9,
|
|
"filtered": "100.00",
|
|
"cost_info": {
|
|
"read_cost": "0.25",
|
|
"eval_cost": "0.90",
|
|
"prefix_cost": "1.15",
|
|
"data_read_per_join": "144"
|
|
},
|
|
"used_columns": [
|
|
"id"
|
|
]
|
|
}
|
|
}
|
|
}
|
|
}
|
|
Warnings:
|
|
Note 1003 /* select#1 */ select `test`.`td1`.`id` AS `id`,first_value(`test`.`td1`.`id`) OVER `w` AS `FIRST_VALUE(id) OVER w` from `test`.`td1` window `w` AS (ORDER BY `test`.`td1`.`id` RANGE BETWEEN 2 PRECEDING AND CURRENT ROW)
|
|
EXPLAIN FORMAT=JSON SELECT id, FIRST_VALUE(id) OVER w FROM td1 WINDOW w AS (ORDER BY id ROWS BETWEEN 2 PRECEDING AND 1 PRECEDING);
|
|
EXPLAIN
|
|
{
|
|
"query_block": {
|
|
"select_id": 1,
|
|
"cost_info": {
|
|
"query_cost": "10.15"
|
|
},
|
|
"windowing": {
|
|
"windows": [
|
|
{
|
|
"name": "w",
|
|
"using_filesort": true,
|
|
"filesort_key": [
|
|
"`id`"
|
|
],
|
|
"frame_buffer": {
|
|
"using_temporary_table": true,
|
|
"optimized_frame_evaluation": true
|
|
},
|
|
"functions": [
|
|
"first_value"
|
|
]
|
|
}
|
|
],
|
|
"cost_info": {
|
|
"sort_cost": "9.00"
|
|
},
|
|
"table": {
|
|
"table_name": "td1",
|
|
"access_type": "ALL",
|
|
"rows_examined_per_scan": 9,
|
|
"rows_produced_per_join": 9,
|
|
"filtered": "100.00",
|
|
"cost_info": {
|
|
"read_cost": "0.25",
|
|
"eval_cost": "0.90",
|
|
"prefix_cost": "1.15",
|
|
"data_read_per_join": "144"
|
|
},
|
|
"used_columns": [
|
|
"id"
|
|
]
|
|
}
|
|
}
|
|
}
|
|
}
|
|
Warnings:
|
|
Note 1003 /* select#1 */ select `test`.`td1`.`id` AS `id`,first_value(`test`.`td1`.`id`) OVER `w` AS `FIRST_VALUE(id) OVER w` from `test`.`td1` window `w` AS (ORDER BY `test`.`td1`.`id` ROWS BETWEEN 2 PRECEDING AND 1 PRECEDING)
|
|
EXPLAIN FORMAT=JSON SELECT id, FIRST_VALUE(id) OVER w FROM td1 WINDOW w AS (ORDER BY id RANGE BETWEEN 2 PRECEDING AND 1 PRECEDING);
|
|
EXPLAIN
|
|
{
|
|
"query_block": {
|
|
"select_id": 1,
|
|
"cost_info": {
|
|
"query_cost": "10.15"
|
|
},
|
|
"windowing": {
|
|
"windows": [
|
|
{
|
|
"name": "w",
|
|
"using_filesort": true,
|
|
"filesort_key": [
|
|
"`id`"
|
|
],
|
|
"frame_buffer": {
|
|
"using_temporary_table": true,
|
|
"optimized_frame_evaluation": true
|
|
},
|
|
"functions": [
|
|
"first_value"
|
|
]
|
|
}
|
|
],
|
|
"cost_info": {
|
|
"sort_cost": "9.00"
|
|
},
|
|
"table": {
|
|
"table_name": "td1",
|
|
"access_type": "ALL",
|
|
"rows_examined_per_scan": 9,
|
|
"rows_produced_per_join": 9,
|
|
"filtered": "100.00",
|
|
"cost_info": {
|
|
"read_cost": "0.25",
|
|
"eval_cost": "0.90",
|
|
"prefix_cost": "1.15",
|
|
"data_read_per_join": "144"
|
|
},
|
|
"used_columns": [
|
|
"id"
|
|
]
|
|
}
|
|
}
|
|
}
|
|
}
|
|
Warnings:
|
|
Note 1003 /* select#1 */ select `test`.`td1`.`id` AS `id`,first_value(`test`.`td1`.`id`) OVER `w` AS `FIRST_VALUE(id) OVER w` from `test`.`td1` window `w` AS (ORDER BY `test`.`td1`.`id` RANGE BETWEEN 2 PRECEDING AND 1 PRECEDING)
|
|
EXPLAIN FORMAT=JSON SELECT id, FIRST_VALUE(id) OVER w FROM td1 WINDOW w AS (ORDER BY id ROWS BETWEEN CURRENT ROW AND UNBOUNDED FOLLOWING);
|
|
EXPLAIN
|
|
{
|
|
"query_block": {
|
|
"select_id": 1,
|
|
"cost_info": {
|
|
"query_cost": "10.15"
|
|
},
|
|
"windowing": {
|
|
"windows": [
|
|
{
|
|
"name": "w",
|
|
"using_filesort": true,
|
|
"filesort_key": [
|
|
"`id`"
|
|
],
|
|
"frame_buffer": {
|
|
"using_temporary_table": true,
|
|
"optimized_frame_evaluation": true
|
|
},
|
|
"functions": [
|
|
"first_value"
|
|
]
|
|
}
|
|
],
|
|
"cost_info": {
|
|
"sort_cost": "9.00"
|
|
},
|
|
"table": {
|
|
"table_name": "td1",
|
|
"access_type": "ALL",
|
|
"rows_examined_per_scan": 9,
|
|
"rows_produced_per_join": 9,
|
|
"filtered": "100.00",
|
|
"cost_info": {
|
|
"read_cost": "0.25",
|
|
"eval_cost": "0.90",
|
|
"prefix_cost": "1.15",
|
|
"data_read_per_join": "144"
|
|
},
|
|
"used_columns": [
|
|
"id"
|
|
]
|
|
}
|
|
}
|
|
}
|
|
}
|
|
Warnings:
|
|
Note 1003 /* select#1 */ select `test`.`td1`.`id` AS `id`,first_value(`test`.`td1`.`id`) OVER `w` AS `FIRST_VALUE(id) OVER w` from `test`.`td1` window `w` AS (ORDER BY `test`.`td1`.`id` ROWS BETWEEN CURRENT ROW AND UNBOUNDED FOLLOWING)
|
|
EXPLAIN FORMAT=JSON SELECT id, FIRST_VALUE(id) OVER w FROM td1 WINDOW w AS (ORDER BY id RANGE BETWEEN CURRENT ROW AND UNBOUNDED FOLLOWING);
|
|
EXPLAIN
|
|
{
|
|
"query_block": {
|
|
"select_id": 1,
|
|
"cost_info": {
|
|
"query_cost": "10.15"
|
|
},
|
|
"windowing": {
|
|
"windows": [
|
|
{
|
|
"name": "w",
|
|
"using_filesort": true,
|
|
"filesort_key": [
|
|
"`id`"
|
|
],
|
|
"frame_buffer": {
|
|
"using_temporary_table": true,
|
|
"optimized_frame_evaluation": true
|
|
},
|
|
"functions": [
|
|
"first_value"
|
|
]
|
|
}
|
|
],
|
|
"cost_info": {
|
|
"sort_cost": "9.00"
|
|
},
|
|
"table": {
|
|
"table_name": "td1",
|
|
"access_type": "ALL",
|
|
"rows_examined_per_scan": 9,
|
|
"rows_produced_per_join": 9,
|
|
"filtered": "100.00",
|
|
"cost_info": {
|
|
"read_cost": "0.25",
|
|
"eval_cost": "0.90",
|
|
"prefix_cost": "1.15",
|
|
"data_read_per_join": "144"
|
|
},
|
|
"used_columns": [
|
|
"id"
|
|
]
|
|
}
|
|
}
|
|
}
|
|
}
|
|
Warnings:
|
|
Note 1003 /* select#1 */ select `test`.`td1`.`id` AS `id`,first_value(`test`.`td1`.`id`) OVER `w` AS `FIRST_VALUE(id) OVER w` from `test`.`td1` window `w` AS (ORDER BY `test`.`td1`.`id` RANGE BETWEEN CURRENT ROW AND UNBOUNDED FOLLOWING)
|
|
EXPLAIN FORMAT=JSON SELECT id, FIRST_VALUE(id) OVER w FROM td1 WINDOW w AS (ORDER BY id ROWS BETWEEN 2 FOLLOWING AND 3 FOLLOWING);
|
|
EXPLAIN
|
|
{
|
|
"query_block": {
|
|
"select_id": 1,
|
|
"cost_info": {
|
|
"query_cost": "10.15"
|
|
},
|
|
"windowing": {
|
|
"windows": [
|
|
{
|
|
"name": "w",
|
|
"using_filesort": true,
|
|
"filesort_key": [
|
|
"`id`"
|
|
],
|
|
"frame_buffer": {
|
|
"using_temporary_table": true,
|
|
"optimized_frame_evaluation": true
|
|
},
|
|
"functions": [
|
|
"first_value"
|
|
]
|
|
}
|
|
],
|
|
"cost_info": {
|
|
"sort_cost": "9.00"
|
|
},
|
|
"table": {
|
|
"table_name": "td1",
|
|
"access_type": "ALL",
|
|
"rows_examined_per_scan": 9,
|
|
"rows_produced_per_join": 9,
|
|
"filtered": "100.00",
|
|
"cost_info": {
|
|
"read_cost": "0.25",
|
|
"eval_cost": "0.90",
|
|
"prefix_cost": "1.15",
|
|
"data_read_per_join": "144"
|
|
},
|
|
"used_columns": [
|
|
"id"
|
|
]
|
|
}
|
|
}
|
|
}
|
|
}
|
|
Warnings:
|
|
Note 1003 /* select#1 */ select `test`.`td1`.`id` AS `id`,first_value(`test`.`td1`.`id`) OVER `w` AS `FIRST_VALUE(id) OVER w` from `test`.`td1` window `w` AS (ORDER BY `test`.`td1`.`id` ROWS BETWEEN 2 FOLLOWING AND 3 FOLLOWING)
|
|
EXPLAIN FORMAT=JSON SELECT id, FIRST_VALUE(id) OVER w FROM td1 WINDOW w AS (ORDER BY id RANGE BETWEEN 2 FOLLOWING AND 3 FOLLOWING);
|
|
EXPLAIN
|
|
{
|
|
"query_block": {
|
|
"select_id": 1,
|
|
"cost_info": {
|
|
"query_cost": "10.15"
|
|
},
|
|
"windowing": {
|
|
"windows": [
|
|
{
|
|
"name": "w",
|
|
"using_filesort": true,
|
|
"filesort_key": [
|
|
"`id`"
|
|
],
|
|
"frame_buffer": {
|
|
"using_temporary_table": true,
|
|
"optimized_frame_evaluation": true
|
|
},
|
|
"functions": [
|
|
"first_value"
|
|
]
|
|
}
|
|
],
|
|
"cost_info": {
|
|
"sort_cost": "9.00"
|
|
},
|
|
"table": {
|
|
"table_name": "td1",
|
|
"access_type": "ALL",
|
|
"rows_examined_per_scan": 9,
|
|
"rows_produced_per_join": 9,
|
|
"filtered": "100.00",
|
|
"cost_info": {
|
|
"read_cost": "0.25",
|
|
"eval_cost": "0.90",
|
|
"prefix_cost": "1.15",
|
|
"data_read_per_join": "144"
|
|
},
|
|
"used_columns": [
|
|
"id"
|
|
]
|
|
}
|
|
}
|
|
}
|
|
}
|
|
Warnings:
|
|
Note 1003 /* select#1 */ select `test`.`td1`.`id` AS `id`,first_value(`test`.`td1`.`id`) OVER `w` AS `FIRST_VALUE(id) OVER w` from `test`.`td1` window `w` AS (ORDER BY `test`.`td1`.`id` RANGE BETWEEN 2 FOLLOWING AND 3 FOLLOWING)
|
|
DROP TABLE td1;
|
|
CREATE TABLE td_dec (id DECIMAL(10,2), sex CHAR(1));
|
|
INSERT INTO td_dec SELECT * FROM t1;
|
|
ANALYZE TABLE td_dec;
|
|
Table Op Msg_type Msg_text
|
|
test.td_dec analyze status OK
|
|
EXPLAIN FORMAT=JSON SELECT id, FIRST_VALUE(id) OVER w FROM td_dec WINDOW w AS ();
|
|
EXPLAIN
|
|
{
|
|
"query_block": {
|
|
"select_id": 1,
|
|
"cost_info": {
|
|
"query_cost": "1.15"
|
|
},
|
|
"windowing": {
|
|
"windows": [
|
|
{
|
|
"name": "w",
|
|
"frame_buffer": {
|
|
"using_temporary_table": true,
|
|
"optimized_frame_evaluation": true
|
|
},
|
|
"functions": [
|
|
"first_value"
|
|
]
|
|
}
|
|
],
|
|
"table": {
|
|
"table_name": "td_dec",
|
|
"access_type": "ALL",
|
|
"rows_examined_per_scan": 9,
|
|
"rows_produced_per_join": 9,
|
|
"filtered": "100.00",
|
|
"cost_info": {
|
|
"read_cost": "0.25",
|
|
"eval_cost": "0.90",
|
|
"prefix_cost": "1.15",
|
|
"data_read_per_join": "144"
|
|
},
|
|
"used_columns": [
|
|
"id"
|
|
]
|
|
}
|
|
}
|
|
}
|
|
}
|
|
Warnings:
|
|
Note 1003 /* select#1 */ select `test`.`td_dec`.`id` AS `id`,first_value(`test`.`td_dec`.`id`) OVER `w` AS `FIRST_VALUE(id) OVER w` from `test`.`td_dec` window `w` AS ()
|
|
EXPLAIN FORMAT=JSON SELECT id, FIRST_VALUE(id) OVER w FROM td_dec WINDOW w AS (ORDER BY id);
|
|
EXPLAIN
|
|
{
|
|
"query_block": {
|
|
"select_id": 1,
|
|
"cost_info": {
|
|
"query_cost": "10.15"
|
|
},
|
|
"windowing": {
|
|
"windows": [
|
|
{
|
|
"name": "w",
|
|
"using_filesort": true,
|
|
"filesort_key": [
|
|
"`id`"
|
|
],
|
|
"frame_buffer": {
|
|
"using_temporary_table": true,
|
|
"optimized_frame_evaluation": true
|
|
},
|
|
"functions": [
|
|
"first_value"
|
|
]
|
|
}
|
|
],
|
|
"cost_info": {
|
|
"sort_cost": "9.00"
|
|
},
|
|
"table": {
|
|
"table_name": "td_dec",
|
|
"access_type": "ALL",
|
|
"rows_examined_per_scan": 9,
|
|
"rows_produced_per_join": 9,
|
|
"filtered": "100.00",
|
|
"cost_info": {
|
|
"read_cost": "0.25",
|
|
"eval_cost": "0.90",
|
|
"prefix_cost": "1.15",
|
|
"data_read_per_join": "144"
|
|
},
|
|
"used_columns": [
|
|
"id"
|
|
]
|
|
}
|
|
}
|
|
}
|
|
}
|
|
Warnings:
|
|
Note 1003 /* select#1 */ select `test`.`td_dec`.`id` AS `id`,first_value(`test`.`td_dec`.`id`) OVER `w` AS `FIRST_VALUE(id) OVER w` from `test`.`td_dec` window `w` AS (ORDER BY `test`.`td_dec`.`id` )
|
|
EXPLAIN FORMAT=JSON SELECT id, FIRST_VALUE(id) OVER w FROM td_dec WINDOW w AS (PARTITION BY sex ORDER BY id);
|
|
EXPLAIN
|
|
{
|
|
"query_block": {
|
|
"select_id": 1,
|
|
"cost_info": {
|
|
"query_cost": "10.15"
|
|
},
|
|
"windowing": {
|
|
"windows": [
|
|
{
|
|
"name": "w",
|
|
"using_filesort": true,
|
|
"filesort_key": [
|
|
"`sex`",
|
|
"`id`"
|
|
],
|
|
"frame_buffer": {
|
|
"using_temporary_table": true,
|
|
"optimized_frame_evaluation": true
|
|
},
|
|
"functions": [
|
|
"first_value"
|
|
]
|
|
}
|
|
],
|
|
"cost_info": {
|
|
"sort_cost": "9.00"
|
|
},
|
|
"table": {
|
|
"table_name": "td_dec",
|
|
"access_type": "ALL",
|
|
"rows_examined_per_scan": 9,
|
|
"rows_produced_per_join": 9,
|
|
"filtered": "100.00",
|
|
"cost_info": {
|
|
"read_cost": "0.25",
|
|
"eval_cost": "0.90",
|
|
"prefix_cost": "1.15",
|
|
"data_read_per_join": "144"
|
|
},
|
|
"used_columns": [
|
|
"id",
|
|
"sex"
|
|
]
|
|
}
|
|
}
|
|
}
|
|
}
|
|
Warnings:
|
|
Note 1003 /* select#1 */ select `test`.`td_dec`.`id` AS `id`,first_value(`test`.`td_dec`.`id`) OVER `w` AS `FIRST_VALUE(id) OVER w` from `test`.`td_dec` window `w` AS (PARTITION BY `test`.`td_dec`.`sex` ORDER BY `test`.`td_dec`.`id` )
|
|
EXPLAIN FORMAT=JSON SELECT id, FIRST_VALUE(id) OVER w FROM td_dec WINDOW w AS (ORDER BY id DESC);
|
|
EXPLAIN
|
|
{
|
|
"query_block": {
|
|
"select_id": 1,
|
|
"cost_info": {
|
|
"query_cost": "10.15"
|
|
},
|
|
"windowing": {
|
|
"windows": [
|
|
{
|
|
"name": "w",
|
|
"using_filesort": true,
|
|
"filesort_key": [
|
|
"`id` desc"
|
|
],
|
|
"frame_buffer": {
|
|
"using_temporary_table": true,
|
|
"optimized_frame_evaluation": true
|
|
},
|
|
"functions": [
|
|
"first_value"
|
|
]
|
|
}
|
|
],
|
|
"cost_info": {
|
|
"sort_cost": "9.00"
|
|
},
|
|
"table": {
|
|
"table_name": "td_dec",
|
|
"access_type": "ALL",
|
|
"rows_examined_per_scan": 9,
|
|
"rows_produced_per_join": 9,
|
|
"filtered": "100.00",
|
|
"cost_info": {
|
|
"read_cost": "0.25",
|
|
"eval_cost": "0.90",
|
|
"prefix_cost": "1.15",
|
|
"data_read_per_join": "144"
|
|
},
|
|
"used_columns": [
|
|
"id"
|
|
]
|
|
}
|
|
}
|
|
}
|
|
}
|
|
Warnings:
|
|
Note 1003 /* select#1 */ select `test`.`td_dec`.`id` AS `id`,first_value(`test`.`td_dec`.`id`) OVER `w` AS `FIRST_VALUE(id) OVER w` from `test`.`td_dec` window `w` AS (ORDER BY `test`.`td_dec`.`id` desc )
|
|
EXPLAIN FORMAT=JSON SELECT id, FIRST_VALUE(id) OVER w FROM td_dec WINDOW w AS (ORDER BY id ROWS 2 PRECEDING);
|
|
EXPLAIN
|
|
{
|
|
"query_block": {
|
|
"select_id": 1,
|
|
"cost_info": {
|
|
"query_cost": "10.15"
|
|
},
|
|
"windowing": {
|
|
"windows": [
|
|
{
|
|
"name": "w",
|
|
"using_filesort": true,
|
|
"filesort_key": [
|
|
"`id`"
|
|
],
|
|
"frame_buffer": {
|
|
"using_temporary_table": true,
|
|
"optimized_frame_evaluation": true
|
|
},
|
|
"functions": [
|
|
"first_value"
|
|
]
|
|
}
|
|
],
|
|
"cost_info": {
|
|
"sort_cost": "9.00"
|
|
},
|
|
"table": {
|
|
"table_name": "td_dec",
|
|
"access_type": "ALL",
|
|
"rows_examined_per_scan": 9,
|
|
"rows_produced_per_join": 9,
|
|
"filtered": "100.00",
|
|
"cost_info": {
|
|
"read_cost": "0.25",
|
|
"eval_cost": "0.90",
|
|
"prefix_cost": "1.15",
|
|
"data_read_per_join": "144"
|
|
},
|
|
"used_columns": [
|
|
"id"
|
|
]
|
|
}
|
|
}
|
|
}
|
|
}
|
|
Warnings:
|
|
Note 1003 /* select#1 */ select `test`.`td_dec`.`id` AS `id`,first_value(`test`.`td_dec`.`id`) OVER `w` AS `FIRST_VALUE(id) OVER w` from `test`.`td_dec` window `w` AS (ORDER BY `test`.`td_dec`.`id` ROWS BETWEEN 2 PRECEDING AND CURRENT ROW)
|
|
EXPLAIN FORMAT=JSON SELECT id, FIRST_VALUE(id) OVER w FROM td_dec WINDOW w AS (ORDER BY id RANGE 2 PRECEDING);
|
|
EXPLAIN
|
|
{
|
|
"query_block": {
|
|
"select_id": 1,
|
|
"cost_info": {
|
|
"query_cost": "10.15"
|
|
},
|
|
"windowing": {
|
|
"windows": [
|
|
{
|
|
"name": "w",
|
|
"using_filesort": true,
|
|
"filesort_key": [
|
|
"`id`"
|
|
],
|
|
"frame_buffer": {
|
|
"using_temporary_table": true,
|
|
"optimized_frame_evaluation": true
|
|
},
|
|
"functions": [
|
|
"first_value"
|
|
]
|
|
}
|
|
],
|
|
"cost_info": {
|
|
"sort_cost": "9.00"
|
|
},
|
|
"table": {
|
|
"table_name": "td_dec",
|
|
"access_type": "ALL",
|
|
"rows_examined_per_scan": 9,
|
|
"rows_produced_per_join": 9,
|
|
"filtered": "100.00",
|
|
"cost_info": {
|
|
"read_cost": "0.25",
|
|
"eval_cost": "0.90",
|
|
"prefix_cost": "1.15",
|
|
"data_read_per_join": "144"
|
|
},
|
|
"used_columns": [
|
|
"id"
|
|
]
|
|
}
|
|
}
|
|
}
|
|
}
|
|
Warnings:
|
|
Note 1003 /* select#1 */ select `test`.`td_dec`.`id` AS `id`,first_value(`test`.`td_dec`.`id`) OVER `w` AS `FIRST_VALUE(id) OVER w` from `test`.`td_dec` window `w` AS (ORDER BY `test`.`td_dec`.`id` RANGE BETWEEN 2 PRECEDING AND CURRENT ROW)
|
|
EXPLAIN FORMAT=JSON SELECT id, FIRST_VALUE(id) OVER w FROM td_dec WINDOW w AS (ORDER BY id ROWS BETWEEN 2 PRECEDING AND 1 PRECEDING);
|
|
EXPLAIN
|
|
{
|
|
"query_block": {
|
|
"select_id": 1,
|
|
"cost_info": {
|
|
"query_cost": "10.15"
|
|
},
|
|
"windowing": {
|
|
"windows": [
|
|
{
|
|
"name": "w",
|
|
"using_filesort": true,
|
|
"filesort_key": [
|
|
"`id`"
|
|
],
|
|
"frame_buffer": {
|
|
"using_temporary_table": true,
|
|
"optimized_frame_evaluation": true
|
|
},
|
|
"functions": [
|
|
"first_value"
|
|
]
|
|
}
|
|
],
|
|
"cost_info": {
|
|
"sort_cost": "9.00"
|
|
},
|
|
"table": {
|
|
"table_name": "td_dec",
|
|
"access_type": "ALL",
|
|
"rows_examined_per_scan": 9,
|
|
"rows_produced_per_join": 9,
|
|
"filtered": "100.00",
|
|
"cost_info": {
|
|
"read_cost": "0.25",
|
|
"eval_cost": "0.90",
|
|
"prefix_cost": "1.15",
|
|
"data_read_per_join": "144"
|
|
},
|
|
"used_columns": [
|
|
"id"
|
|
]
|
|
}
|
|
}
|
|
}
|
|
}
|
|
Warnings:
|
|
Note 1003 /* select#1 */ select `test`.`td_dec`.`id` AS `id`,first_value(`test`.`td_dec`.`id`) OVER `w` AS `FIRST_VALUE(id) OVER w` from `test`.`td_dec` window `w` AS (ORDER BY `test`.`td_dec`.`id` ROWS BETWEEN 2 PRECEDING AND 1 PRECEDING)
|
|
EXPLAIN FORMAT=JSON SELECT id, FIRST_VALUE(id) OVER w FROM td_dec WINDOW w AS (ORDER BY id RANGE BETWEEN 2 PRECEDING AND 1 PRECEDING);
|
|
EXPLAIN
|
|
{
|
|
"query_block": {
|
|
"select_id": 1,
|
|
"cost_info": {
|
|
"query_cost": "10.15"
|
|
},
|
|
"windowing": {
|
|
"windows": [
|
|
{
|
|
"name": "w",
|
|
"using_filesort": true,
|
|
"filesort_key": [
|
|
"`id`"
|
|
],
|
|
"frame_buffer": {
|
|
"using_temporary_table": true,
|
|
"optimized_frame_evaluation": true
|
|
},
|
|
"functions": [
|
|
"first_value"
|
|
]
|
|
}
|
|
],
|
|
"cost_info": {
|
|
"sort_cost": "9.00"
|
|
},
|
|
"table": {
|
|
"table_name": "td_dec",
|
|
"access_type": "ALL",
|
|
"rows_examined_per_scan": 9,
|
|
"rows_produced_per_join": 9,
|
|
"filtered": "100.00",
|
|
"cost_info": {
|
|
"read_cost": "0.25",
|
|
"eval_cost": "0.90",
|
|
"prefix_cost": "1.15",
|
|
"data_read_per_join": "144"
|
|
},
|
|
"used_columns": [
|
|
"id"
|
|
]
|
|
}
|
|
}
|
|
}
|
|
}
|
|
Warnings:
|
|
Note 1003 /* select#1 */ select `test`.`td_dec`.`id` AS `id`,first_value(`test`.`td_dec`.`id`) OVER `w` AS `FIRST_VALUE(id) OVER w` from `test`.`td_dec` window `w` AS (ORDER BY `test`.`td_dec`.`id` RANGE BETWEEN 2 PRECEDING AND 1 PRECEDING)
|
|
EXPLAIN FORMAT=JSON SELECT id, FIRST_VALUE(id) OVER w FROM td_dec WINDOW w AS (ORDER BY id ROWS BETWEEN CURRENT ROW AND UNBOUNDED FOLLOWING);
|
|
EXPLAIN
|
|
{
|
|
"query_block": {
|
|
"select_id": 1,
|
|
"cost_info": {
|
|
"query_cost": "10.15"
|
|
},
|
|
"windowing": {
|
|
"windows": [
|
|
{
|
|
"name": "w",
|
|
"using_filesort": true,
|
|
"filesort_key": [
|
|
"`id`"
|
|
],
|
|
"frame_buffer": {
|
|
"using_temporary_table": true,
|
|
"optimized_frame_evaluation": true
|
|
},
|
|
"functions": [
|
|
"first_value"
|
|
]
|
|
}
|
|
],
|
|
"cost_info": {
|
|
"sort_cost": "9.00"
|
|
},
|
|
"table": {
|
|
"table_name": "td_dec",
|
|
"access_type": "ALL",
|
|
"rows_examined_per_scan": 9,
|
|
"rows_produced_per_join": 9,
|
|
"filtered": "100.00",
|
|
"cost_info": {
|
|
"read_cost": "0.25",
|
|
"eval_cost": "0.90",
|
|
"prefix_cost": "1.15",
|
|
"data_read_per_join": "144"
|
|
},
|
|
"used_columns": [
|
|
"id"
|
|
]
|
|
}
|
|
}
|
|
}
|
|
}
|
|
Warnings:
|
|
Note 1003 /* select#1 */ select `test`.`td_dec`.`id` AS `id`,first_value(`test`.`td_dec`.`id`) OVER `w` AS `FIRST_VALUE(id) OVER w` from `test`.`td_dec` window `w` AS (ORDER BY `test`.`td_dec`.`id` ROWS BETWEEN CURRENT ROW AND UNBOUNDED FOLLOWING)
|
|
EXPLAIN FORMAT=JSON SELECT id, FIRST_VALUE(id) OVER w FROM td_dec WINDOW w AS (ORDER BY id RANGE BETWEEN CURRENT ROW AND UNBOUNDED FOLLOWING);
|
|
EXPLAIN
|
|
{
|
|
"query_block": {
|
|
"select_id": 1,
|
|
"cost_info": {
|
|
"query_cost": "10.15"
|
|
},
|
|
"windowing": {
|
|
"windows": [
|
|
{
|
|
"name": "w",
|
|
"using_filesort": true,
|
|
"filesort_key": [
|
|
"`id`"
|
|
],
|
|
"frame_buffer": {
|
|
"using_temporary_table": true,
|
|
"optimized_frame_evaluation": true
|
|
},
|
|
"functions": [
|
|
"first_value"
|
|
]
|
|
}
|
|
],
|
|
"cost_info": {
|
|
"sort_cost": "9.00"
|
|
},
|
|
"table": {
|
|
"table_name": "td_dec",
|
|
"access_type": "ALL",
|
|
"rows_examined_per_scan": 9,
|
|
"rows_produced_per_join": 9,
|
|
"filtered": "100.00",
|
|
"cost_info": {
|
|
"read_cost": "0.25",
|
|
"eval_cost": "0.90",
|
|
"prefix_cost": "1.15",
|
|
"data_read_per_join": "144"
|
|
},
|
|
"used_columns": [
|
|
"id"
|
|
]
|
|
}
|
|
}
|
|
}
|
|
}
|
|
Warnings:
|
|
Note 1003 /* select#1 */ select `test`.`td_dec`.`id` AS `id`,first_value(`test`.`td_dec`.`id`) OVER `w` AS `FIRST_VALUE(id) OVER w` from `test`.`td_dec` window `w` AS (ORDER BY `test`.`td_dec`.`id` RANGE BETWEEN CURRENT ROW AND UNBOUNDED FOLLOWING)
|
|
EXPLAIN FORMAT=JSON SELECT id, FIRST_VALUE(id) OVER w FROM td_dec WINDOW w AS (ORDER BY id ROWS BETWEEN 2 FOLLOWING AND 3 FOLLOWING);
|
|
EXPLAIN
|
|
{
|
|
"query_block": {
|
|
"select_id": 1,
|
|
"cost_info": {
|
|
"query_cost": "10.15"
|
|
},
|
|
"windowing": {
|
|
"windows": [
|
|
{
|
|
"name": "w",
|
|
"using_filesort": true,
|
|
"filesort_key": [
|
|
"`id`"
|
|
],
|
|
"frame_buffer": {
|
|
"using_temporary_table": true,
|
|
"optimized_frame_evaluation": true
|
|
},
|
|
"functions": [
|
|
"first_value"
|
|
]
|
|
}
|
|
],
|
|
"cost_info": {
|
|
"sort_cost": "9.00"
|
|
},
|
|
"table": {
|
|
"table_name": "td_dec",
|
|
"access_type": "ALL",
|
|
"rows_examined_per_scan": 9,
|
|
"rows_produced_per_join": 9,
|
|
"filtered": "100.00",
|
|
"cost_info": {
|
|
"read_cost": "0.25",
|
|
"eval_cost": "0.90",
|
|
"prefix_cost": "1.15",
|
|
"data_read_per_join": "144"
|
|
},
|
|
"used_columns": [
|
|
"id"
|
|
]
|
|
}
|
|
}
|
|
}
|
|
}
|
|
Warnings:
|
|
Note 1003 /* select#1 */ select `test`.`td_dec`.`id` AS `id`,first_value(`test`.`td_dec`.`id`) OVER `w` AS `FIRST_VALUE(id) OVER w` from `test`.`td_dec` window `w` AS (ORDER BY `test`.`td_dec`.`id` ROWS BETWEEN 2 FOLLOWING AND 3 FOLLOWING)
|
|
EXPLAIN FORMAT=JSON SELECT id, FIRST_VALUE(id) OVER w FROM td_dec WINDOW w AS (ORDER BY id RANGE BETWEEN 2 FOLLOWING AND 3 FOLLOWING);
|
|
EXPLAIN
|
|
{
|
|
"query_block": {
|
|
"select_id": 1,
|
|
"cost_info": {
|
|
"query_cost": "10.15"
|
|
},
|
|
"windowing": {
|
|
"windows": [
|
|
{
|
|
"name": "w",
|
|
"using_filesort": true,
|
|
"filesort_key": [
|
|
"`id`"
|
|
],
|
|
"frame_buffer": {
|
|
"using_temporary_table": true,
|
|
"optimized_frame_evaluation": true
|
|
},
|
|
"functions": [
|
|
"first_value"
|
|
]
|
|
}
|
|
],
|
|
"cost_info": {
|
|
"sort_cost": "9.00"
|
|
},
|
|
"table": {
|
|
"table_name": "td_dec",
|
|
"access_type": "ALL",
|
|
"rows_examined_per_scan": 9,
|
|
"rows_produced_per_join": 9,
|
|
"filtered": "100.00",
|
|
"cost_info": {
|
|
"read_cost": "0.25",
|
|
"eval_cost": "0.90",
|
|
"prefix_cost": "1.15",
|
|
"data_read_per_join": "144"
|
|
},
|
|
"used_columns": [
|
|
"id"
|
|
]
|
|
}
|
|
}
|
|
}
|
|
}
|
|
Warnings:
|
|
Note 1003 /* select#1 */ select `test`.`td_dec`.`id` AS `id`,first_value(`test`.`td_dec`.`id`) OVER `w` AS `FIRST_VALUE(id) OVER w` from `test`.`td_dec` window `w` AS (ORDER BY `test`.`td_dec`.`id` RANGE BETWEEN 2 FOLLOWING AND 3 FOLLOWING)
|
|
DROP TABLE td_dec;
|
|
CREATE TABLE td_str (id VARCHAR(20), sex CHAR(1));
|
|
INSERT INTO td_str SELECT * FROM t1;
|
|
ANALYZE TABLE td_str;
|
|
Table Op Msg_type Msg_text
|
|
test.td_str analyze status OK
|
|
EXPLAIN FORMAT=JSON SELECT id, FIRST_VALUE(id) OVER w FROM td_str WINDOW w AS ();
|
|
EXPLAIN
|
|
{
|
|
"query_block": {
|
|
"select_id": 1,
|
|
"cost_info": {
|
|
"query_cost": "1.15"
|
|
},
|
|
"windowing": {
|
|
"windows": [
|
|
{
|
|
"name": "w",
|
|
"frame_buffer": {
|
|
"using_temporary_table": true,
|
|
"optimized_frame_evaluation": true
|
|
},
|
|
"functions": [
|
|
"first_value"
|
|
]
|
|
}
|
|
],
|
|
"table": {
|
|
"table_name": "td_str",
|
|
"access_type": "ALL",
|
|
"rows_examined_per_scan": 9,
|
|
"rows_produced_per_join": 9,
|
|
"filtered": "100.00",
|
|
"cost_info": {
|
|
"read_cost": "0.25",
|
|
"eval_cost": "0.90",
|
|
"prefix_cost": "1.15",
|
|
"data_read_per_join": "792"
|
|
},
|
|
"used_columns": [
|
|
"id"
|
|
]
|
|
}
|
|
}
|
|
}
|
|
}
|
|
Warnings:
|
|
Note 1003 /* select#1 */ select `test`.`td_str`.`id` AS `id`,first_value(`test`.`td_str`.`id`) OVER `w` AS `FIRST_VALUE(id) OVER w` from `test`.`td_str` window `w` AS ()
|
|
EXPLAIN FORMAT=JSON SELECT id, FIRST_VALUE(id) OVER w FROM td_str WINDOW w AS (ORDER BY id);
|
|
EXPLAIN
|
|
{
|
|
"query_block": {
|
|
"select_id": 1,
|
|
"cost_info": {
|
|
"query_cost": "10.15"
|
|
},
|
|
"windowing": {
|
|
"windows": [
|
|
{
|
|
"name": "w",
|
|
"using_filesort": true,
|
|
"filesort_key": [
|
|
"`id`"
|
|
],
|
|
"frame_buffer": {
|
|
"using_temporary_table": true,
|
|
"optimized_frame_evaluation": true
|
|
},
|
|
"functions": [
|
|
"first_value"
|
|
]
|
|
}
|
|
],
|
|
"cost_info": {
|
|
"sort_cost": "9.00"
|
|
},
|
|
"table": {
|
|
"table_name": "td_str",
|
|
"access_type": "ALL",
|
|
"rows_examined_per_scan": 9,
|
|
"rows_produced_per_join": 9,
|
|
"filtered": "100.00",
|
|
"cost_info": {
|
|
"read_cost": "0.25",
|
|
"eval_cost": "0.90",
|
|
"prefix_cost": "1.15",
|
|
"data_read_per_join": "792"
|
|
},
|
|
"used_columns": [
|
|
"id"
|
|
]
|
|
}
|
|
}
|
|
}
|
|
}
|
|
Warnings:
|
|
Note 1003 /* select#1 */ select `test`.`td_str`.`id` AS `id`,first_value(`test`.`td_str`.`id`) OVER `w` AS `FIRST_VALUE(id) OVER w` from `test`.`td_str` window `w` AS (ORDER BY `test`.`td_str`.`id` )
|
|
EXPLAIN FORMAT=JSON SELECT id, FIRST_VALUE(id) OVER w FROM td_str WINDOW w AS (PARTITION BY sex ORDER BY id);
|
|
EXPLAIN
|
|
{
|
|
"query_block": {
|
|
"select_id": 1,
|
|
"cost_info": {
|
|
"query_cost": "10.15"
|
|
},
|
|
"windowing": {
|
|
"windows": [
|
|
{
|
|
"name": "w",
|
|
"using_filesort": true,
|
|
"filesort_key": [
|
|
"`sex`",
|
|
"`id`"
|
|
],
|
|
"frame_buffer": {
|
|
"using_temporary_table": true,
|
|
"optimized_frame_evaluation": true
|
|
},
|
|
"functions": [
|
|
"first_value"
|
|
]
|
|
}
|
|
],
|
|
"cost_info": {
|
|
"sort_cost": "9.00"
|
|
},
|
|
"table": {
|
|
"table_name": "td_str",
|
|
"access_type": "ALL",
|
|
"rows_examined_per_scan": 9,
|
|
"rows_produced_per_join": 9,
|
|
"filtered": "100.00",
|
|
"cost_info": {
|
|
"read_cost": "0.25",
|
|
"eval_cost": "0.90",
|
|
"prefix_cost": "1.15",
|
|
"data_read_per_join": "792"
|
|
},
|
|
"used_columns": [
|
|
"id",
|
|
"sex"
|
|
]
|
|
}
|
|
}
|
|
}
|
|
}
|
|
Warnings:
|
|
Note 1003 /* select#1 */ select `test`.`td_str`.`id` AS `id`,first_value(`test`.`td_str`.`id`) OVER `w` AS `FIRST_VALUE(id) OVER w` from `test`.`td_str` window `w` AS (PARTITION BY `test`.`td_str`.`sex` ORDER BY `test`.`td_str`.`id` )
|
|
EXPLAIN FORMAT=JSON SELECT id, FIRST_VALUE(id) OVER w FROM td_str WINDOW w AS (ORDER BY id DESC);
|
|
EXPLAIN
|
|
{
|
|
"query_block": {
|
|
"select_id": 1,
|
|
"cost_info": {
|
|
"query_cost": "10.15"
|
|
},
|
|
"windowing": {
|
|
"windows": [
|
|
{
|
|
"name": "w",
|
|
"using_filesort": true,
|
|
"filesort_key": [
|
|
"`id` desc"
|
|
],
|
|
"frame_buffer": {
|
|
"using_temporary_table": true,
|
|
"optimized_frame_evaluation": true
|
|
},
|
|
"functions": [
|
|
"first_value"
|
|
]
|
|
}
|
|
],
|
|
"cost_info": {
|
|
"sort_cost": "9.00"
|
|
},
|
|
"table": {
|
|
"table_name": "td_str",
|
|
"access_type": "ALL",
|
|
"rows_examined_per_scan": 9,
|
|
"rows_produced_per_join": 9,
|
|
"filtered": "100.00",
|
|
"cost_info": {
|
|
"read_cost": "0.25",
|
|
"eval_cost": "0.90",
|
|
"prefix_cost": "1.15",
|
|
"data_read_per_join": "792"
|
|
},
|
|
"used_columns": [
|
|
"id"
|
|
]
|
|
}
|
|
}
|
|
}
|
|
}
|
|
Warnings:
|
|
Note 1003 /* select#1 */ select `test`.`td_str`.`id` AS `id`,first_value(`test`.`td_str`.`id`) OVER `w` AS `FIRST_VALUE(id) OVER w` from `test`.`td_str` window `w` AS (ORDER BY `test`.`td_str`.`id` desc )
|
|
EXPLAIN FORMAT=JSON SELECT id, FIRST_VALUE(id) OVER w FROM td_str WINDOW w AS (ORDER BY id ROWS 2 PRECEDING);
|
|
EXPLAIN
|
|
{
|
|
"query_block": {
|
|
"select_id": 1,
|
|
"cost_info": {
|
|
"query_cost": "10.15"
|
|
},
|
|
"windowing": {
|
|
"windows": [
|
|
{
|
|
"name": "w",
|
|
"using_filesort": true,
|
|
"filesort_key": [
|
|
"`id`"
|
|
],
|
|
"frame_buffer": {
|
|
"using_temporary_table": true,
|
|
"optimized_frame_evaluation": true
|
|
},
|
|
"functions": [
|
|
"first_value"
|
|
]
|
|
}
|
|
],
|
|
"cost_info": {
|
|
"sort_cost": "9.00"
|
|
},
|
|
"table": {
|
|
"table_name": "td_str",
|
|
"access_type": "ALL",
|
|
"rows_examined_per_scan": 9,
|
|
"rows_produced_per_join": 9,
|
|
"filtered": "100.00",
|
|
"cost_info": {
|
|
"read_cost": "0.25",
|
|
"eval_cost": "0.90",
|
|
"prefix_cost": "1.15",
|
|
"data_read_per_join": "792"
|
|
},
|
|
"used_columns": [
|
|
"id"
|
|
]
|
|
}
|
|
}
|
|
}
|
|
}
|
|
Warnings:
|
|
Note 1003 /* select#1 */ select `test`.`td_str`.`id` AS `id`,first_value(`test`.`td_str`.`id`) OVER `w` AS `FIRST_VALUE(id) OVER w` from `test`.`td_str` window `w` AS (ORDER BY `test`.`td_str`.`id` ROWS BETWEEN 2 PRECEDING AND CURRENT ROW)
|
|
EXPLAIN FORMAT=JSON SELECT id, FIRST_VALUE(id) OVER w FROM td_str WINDOW w AS (ORDER BY id ROWS BETWEEN 2 PRECEDING AND 1 PRECEDING);
|
|
EXPLAIN
|
|
{
|
|
"query_block": {
|
|
"select_id": 1,
|
|
"cost_info": {
|
|
"query_cost": "10.15"
|
|
},
|
|
"windowing": {
|
|
"windows": [
|
|
{
|
|
"name": "w",
|
|
"using_filesort": true,
|
|
"filesort_key": [
|
|
"`id`"
|
|
],
|
|
"frame_buffer": {
|
|
"using_temporary_table": true,
|
|
"optimized_frame_evaluation": true
|
|
},
|
|
"functions": [
|
|
"first_value"
|
|
]
|
|
}
|
|
],
|
|
"cost_info": {
|
|
"sort_cost": "9.00"
|
|
},
|
|
"table": {
|
|
"table_name": "td_str",
|
|
"access_type": "ALL",
|
|
"rows_examined_per_scan": 9,
|
|
"rows_produced_per_join": 9,
|
|
"filtered": "100.00",
|
|
"cost_info": {
|
|
"read_cost": "0.25",
|
|
"eval_cost": "0.90",
|
|
"prefix_cost": "1.15",
|
|
"data_read_per_join": "792"
|
|
},
|
|
"used_columns": [
|
|
"id"
|
|
]
|
|
}
|
|
}
|
|
}
|
|
}
|
|
Warnings:
|
|
Note 1003 /* select#1 */ select `test`.`td_str`.`id` AS `id`,first_value(`test`.`td_str`.`id`) OVER `w` AS `FIRST_VALUE(id) OVER w` from `test`.`td_str` window `w` AS (ORDER BY `test`.`td_str`.`id` ROWS BETWEEN 2 PRECEDING AND 1 PRECEDING)
|
|
EXPLAIN FORMAT=JSON SELECT id, FIRST_VALUE(id) OVER w FROM td_str WINDOW w AS (ORDER BY id ROWS BETWEEN CURRENT ROW AND UNBOUNDED FOLLOWING);
|
|
EXPLAIN
|
|
{
|
|
"query_block": {
|
|
"select_id": 1,
|
|
"cost_info": {
|
|
"query_cost": "10.15"
|
|
},
|
|
"windowing": {
|
|
"windows": [
|
|
{
|
|
"name": "w",
|
|
"using_filesort": true,
|
|
"filesort_key": [
|
|
"`id`"
|
|
],
|
|
"frame_buffer": {
|
|
"using_temporary_table": true,
|
|
"optimized_frame_evaluation": true
|
|
},
|
|
"functions": [
|
|
"first_value"
|
|
]
|
|
}
|
|
],
|
|
"cost_info": {
|
|
"sort_cost": "9.00"
|
|
},
|
|
"table": {
|
|
"table_name": "td_str",
|
|
"access_type": "ALL",
|
|
"rows_examined_per_scan": 9,
|
|
"rows_produced_per_join": 9,
|
|
"filtered": "100.00",
|
|
"cost_info": {
|
|
"read_cost": "0.25",
|
|
"eval_cost": "0.90",
|
|
"prefix_cost": "1.15",
|
|
"data_read_per_join": "792"
|
|
},
|
|
"used_columns": [
|
|
"id"
|
|
]
|
|
}
|
|
}
|
|
}
|
|
}
|
|
Warnings:
|
|
Note 1003 /* select#1 */ select `test`.`td_str`.`id` AS `id`,first_value(`test`.`td_str`.`id`) OVER `w` AS `FIRST_VALUE(id) OVER w` from `test`.`td_str` window `w` AS (ORDER BY `test`.`td_str`.`id` ROWS BETWEEN CURRENT ROW AND UNBOUNDED FOLLOWING)
|
|
EXPLAIN FORMAT=JSON SELECT id, FIRST_VALUE(id) OVER w FROM td_str WINDOW w AS (ORDER BY id ROWS BETWEEN 2 FOLLOWING AND 3 FOLLOWING);
|
|
EXPLAIN
|
|
{
|
|
"query_block": {
|
|
"select_id": 1,
|
|
"cost_info": {
|
|
"query_cost": "10.15"
|
|
},
|
|
"windowing": {
|
|
"windows": [
|
|
{
|
|
"name": "w",
|
|
"using_filesort": true,
|
|
"filesort_key": [
|
|
"`id`"
|
|
],
|
|
"frame_buffer": {
|
|
"using_temporary_table": true,
|
|
"optimized_frame_evaluation": true
|
|
},
|
|
"functions": [
|
|
"first_value"
|
|
]
|
|
}
|
|
],
|
|
"cost_info": {
|
|
"sort_cost": "9.00"
|
|
},
|
|
"table": {
|
|
"table_name": "td_str",
|
|
"access_type": "ALL",
|
|
"rows_examined_per_scan": 9,
|
|
"rows_produced_per_join": 9,
|
|
"filtered": "100.00",
|
|
"cost_info": {
|
|
"read_cost": "0.25",
|
|
"eval_cost": "0.90",
|
|
"prefix_cost": "1.15",
|
|
"data_read_per_join": "792"
|
|
},
|
|
"used_columns": [
|
|
"id"
|
|
]
|
|
}
|
|
}
|
|
}
|
|
}
|
|
Warnings:
|
|
Note 1003 /* select#1 */ select `test`.`td_str`.`id` AS `id`,first_value(`test`.`td_str`.`id`) OVER `w` AS `FIRST_VALUE(id) OVER w` from `test`.`td_str` window `w` AS (ORDER BY `test`.`td_str`.`id` ROWS BETWEEN 2 FOLLOWING AND 3 FOLLOWING)
|
|
DROP TABLE td_str;
|
|
CREATE TABLE t_date(id DATE);
|
|
INSERT INTO t_date VALUES ('2002-06-09'),
|
|
('2002-06-09'),
|
|
('2002-06-10'),
|
|
('2002-06-09'),
|
|
('2015-08-01'),
|
|
('2002-06-09'),
|
|
('2015-08-01');
|
|
ANALYZE TABLE t_date;
|
|
Table Op Msg_type Msg_text
|
|
test.t_date analyze status OK
|
|
EXPLAIN FORMAT=JSON SELECT id, FIRST_VALUE(id) OVER w FROM t_date WINDOW w AS ();
|
|
EXPLAIN
|
|
{
|
|
"query_block": {
|
|
"select_id": 1,
|
|
"cost_info": {
|
|
"query_cost": "0.95"
|
|
},
|
|
"windowing": {
|
|
"windows": [
|
|
{
|
|
"name": "w",
|
|
"frame_buffer": {
|
|
"using_temporary_table": true,
|
|
"optimized_frame_evaluation": true
|
|
},
|
|
"functions": [
|
|
"first_value"
|
|
]
|
|
}
|
|
],
|
|
"table": {
|
|
"table_name": "t_date",
|
|
"access_type": "ALL",
|
|
"rows_examined_per_scan": 7,
|
|
"rows_produced_per_join": 7,
|
|
"filtered": "100.00",
|
|
"cost_info": {
|
|
"read_cost": "0.25",
|
|
"eval_cost": "0.70",
|
|
"prefix_cost": "0.95",
|
|
"data_read_per_join": "56"
|
|
},
|
|
"used_columns": [
|
|
"id"
|
|
]
|
|
}
|
|
}
|
|
}
|
|
}
|
|
Warnings:
|
|
Note 1003 /* select#1 */ select `test`.`t_date`.`id` AS `id`,first_value(`test`.`t_date`.`id`) OVER `w` AS `FIRST_VALUE(id) OVER w` from `test`.`t_date` window `w` AS ()
|
|
EXPLAIN FORMAT=JSON SELECT id, FIRST_VALUE(id) OVER w FROM t_date WINDOW w AS (ORDER BY id);
|
|
EXPLAIN
|
|
{
|
|
"query_block": {
|
|
"select_id": 1,
|
|
"cost_info": {
|
|
"query_cost": "7.95"
|
|
},
|
|
"windowing": {
|
|
"windows": [
|
|
{
|
|
"name": "w",
|
|
"using_filesort": true,
|
|
"filesort_key": [
|
|
"`id`"
|
|
],
|
|
"frame_buffer": {
|
|
"using_temporary_table": true,
|
|
"optimized_frame_evaluation": true
|
|
},
|
|
"functions": [
|
|
"first_value"
|
|
]
|
|
}
|
|
],
|
|
"cost_info": {
|
|
"sort_cost": "7.00"
|
|
},
|
|
"table": {
|
|
"table_name": "t_date",
|
|
"access_type": "ALL",
|
|
"rows_examined_per_scan": 7,
|
|
"rows_produced_per_join": 7,
|
|
"filtered": "100.00",
|
|
"cost_info": {
|
|
"read_cost": "0.25",
|
|
"eval_cost": "0.70",
|
|
"prefix_cost": "0.95",
|
|
"data_read_per_join": "56"
|
|
},
|
|
"used_columns": [
|
|
"id"
|
|
]
|
|
}
|
|
}
|
|
}
|
|
}
|
|
Warnings:
|
|
Note 1003 /* select#1 */ select `test`.`t_date`.`id` AS `id`,first_value(`test`.`t_date`.`id`) OVER `w` AS `FIRST_VALUE(id) OVER w` from `test`.`t_date` window `w` AS (ORDER BY `test`.`t_date`.`id` )
|
|
EXPLAIN FORMAT=JSON SELECT id, FIRST_VALUE(id) OVER w FROM t_date WINDOW w AS (ORDER BY id DESC);
|
|
EXPLAIN
|
|
{
|
|
"query_block": {
|
|
"select_id": 1,
|
|
"cost_info": {
|
|
"query_cost": "7.95"
|
|
},
|
|
"windowing": {
|
|
"windows": [
|
|
{
|
|
"name": "w",
|
|
"using_filesort": true,
|
|
"filesort_key": [
|
|
"`id` desc"
|
|
],
|
|
"frame_buffer": {
|
|
"using_temporary_table": true,
|
|
"optimized_frame_evaluation": true
|
|
},
|
|
"functions": [
|
|
"first_value"
|
|
]
|
|
}
|
|
],
|
|
"cost_info": {
|
|
"sort_cost": "7.00"
|
|
},
|
|
"table": {
|
|
"table_name": "t_date",
|
|
"access_type": "ALL",
|
|
"rows_examined_per_scan": 7,
|
|
"rows_produced_per_join": 7,
|
|
"filtered": "100.00",
|
|
"cost_info": {
|
|
"read_cost": "0.25",
|
|
"eval_cost": "0.70",
|
|
"prefix_cost": "0.95",
|
|
"data_read_per_join": "56"
|
|
},
|
|
"used_columns": [
|
|
"id"
|
|
]
|
|
}
|
|
}
|
|
}
|
|
}
|
|
Warnings:
|
|
Note 1003 /* select#1 */ select `test`.`t_date`.`id` AS `id`,first_value(`test`.`t_date`.`id`) OVER `w` AS `FIRST_VALUE(id) OVER w` from `test`.`t_date` window `w` AS (ORDER BY `test`.`t_date`.`id` desc )
|
|
EXPLAIN FORMAT=JSON SELECT id, FIRST_VALUE(id) OVER w FROM t_date WINDOW w AS (ORDER BY id ROWS 2 PRECEDING);
|
|
EXPLAIN
|
|
{
|
|
"query_block": {
|
|
"select_id": 1,
|
|
"cost_info": {
|
|
"query_cost": "7.95"
|
|
},
|
|
"windowing": {
|
|
"windows": [
|
|
{
|
|
"name": "w",
|
|
"using_filesort": true,
|
|
"filesort_key": [
|
|
"`id`"
|
|
],
|
|
"frame_buffer": {
|
|
"using_temporary_table": true,
|
|
"optimized_frame_evaluation": true
|
|
},
|
|
"functions": [
|
|
"first_value"
|
|
]
|
|
}
|
|
],
|
|
"cost_info": {
|
|
"sort_cost": "7.00"
|
|
},
|
|
"table": {
|
|
"table_name": "t_date",
|
|
"access_type": "ALL",
|
|
"rows_examined_per_scan": 7,
|
|
"rows_produced_per_join": 7,
|
|
"filtered": "100.00",
|
|
"cost_info": {
|
|
"read_cost": "0.25",
|
|
"eval_cost": "0.70",
|
|
"prefix_cost": "0.95",
|
|
"data_read_per_join": "56"
|
|
},
|
|
"used_columns": [
|
|
"id"
|
|
]
|
|
}
|
|
}
|
|
}
|
|
}
|
|
Warnings:
|
|
Note 1003 /* select#1 */ select `test`.`t_date`.`id` AS `id`,first_value(`test`.`t_date`.`id`) OVER `w` AS `FIRST_VALUE(id) OVER w` from `test`.`t_date` window `w` AS (ORDER BY `test`.`t_date`.`id` ROWS BETWEEN 2 PRECEDING AND CURRENT ROW)
|
|
EXPLAIN FORMAT=JSON SELECT id, FIRST_VALUE(id) OVER w FROM t_date WINDOW w AS (ORDER BY id RANGE INTERVAL 2 DAY PRECEDING);
|
|
EXPLAIN
|
|
{
|
|
"query_block": {
|
|
"select_id": 1,
|
|
"cost_info": {
|
|
"query_cost": "7.95"
|
|
},
|
|
"windowing": {
|
|
"windows": [
|
|
{
|
|
"name": "w",
|
|
"using_filesort": true,
|
|
"filesort_key": [
|
|
"`id`"
|
|
],
|
|
"frame_buffer": {
|
|
"using_temporary_table": true,
|
|
"optimized_frame_evaluation": true
|
|
},
|
|
"functions": [
|
|
"first_value"
|
|
]
|
|
}
|
|
],
|
|
"cost_info": {
|
|
"sort_cost": "7.00"
|
|
},
|
|
"table": {
|
|
"table_name": "t_date",
|
|
"access_type": "ALL",
|
|
"rows_examined_per_scan": 7,
|
|
"rows_produced_per_join": 7,
|
|
"filtered": "100.00",
|
|
"cost_info": {
|
|
"read_cost": "0.25",
|
|
"eval_cost": "0.70",
|
|
"prefix_cost": "0.95",
|
|
"data_read_per_join": "56"
|
|
},
|
|
"used_columns": [
|
|
"id"
|
|
]
|
|
}
|
|
}
|
|
}
|
|
}
|
|
Warnings:
|
|
Note 1003 /* select#1 */ select `test`.`t_date`.`id` AS `id`,first_value(`test`.`t_date`.`id`) OVER `w` AS `FIRST_VALUE(id) OVER w` from `test`.`t_date` window `w` AS (ORDER BY `test`.`t_date`.`id` RANGE BETWEEN INTERVAL 2 day PRECEDING AND CURRENT ROW)
|
|
EXPLAIN FORMAT=JSON SELECT id, FIRST_VALUE(id) OVER w FROM t_date WINDOW w AS (ORDER BY id ROWS BETWEEN 2 PRECEDING AND 1 PRECEDING);
|
|
EXPLAIN
|
|
{
|
|
"query_block": {
|
|
"select_id": 1,
|
|
"cost_info": {
|
|
"query_cost": "7.95"
|
|
},
|
|
"windowing": {
|
|
"windows": [
|
|
{
|
|
"name": "w",
|
|
"using_filesort": true,
|
|
"filesort_key": [
|
|
"`id`"
|
|
],
|
|
"frame_buffer": {
|
|
"using_temporary_table": true,
|
|
"optimized_frame_evaluation": true
|
|
},
|
|
"functions": [
|
|
"first_value"
|
|
]
|
|
}
|
|
],
|
|
"cost_info": {
|
|
"sort_cost": "7.00"
|
|
},
|
|
"table": {
|
|
"table_name": "t_date",
|
|
"access_type": "ALL",
|
|
"rows_examined_per_scan": 7,
|
|
"rows_produced_per_join": 7,
|
|
"filtered": "100.00",
|
|
"cost_info": {
|
|
"read_cost": "0.25",
|
|
"eval_cost": "0.70",
|
|
"prefix_cost": "0.95",
|
|
"data_read_per_join": "56"
|
|
},
|
|
"used_columns": [
|
|
"id"
|
|
]
|
|
}
|
|
}
|
|
}
|
|
}
|
|
Warnings:
|
|
Note 1003 /* select#1 */ select `test`.`t_date`.`id` AS `id`,first_value(`test`.`t_date`.`id`) OVER `w` AS `FIRST_VALUE(id) OVER w` from `test`.`t_date` window `w` AS (ORDER BY `test`.`t_date`.`id` ROWS BETWEEN 2 PRECEDING AND 1 PRECEDING)
|
|
EXPLAIN FORMAT=JSON SELECT id, FIRST_VALUE(id) OVER w FROM t_date WINDOW w AS (ORDER BY id RANGE BETWEEN INTERVAL 2 DAY PRECEDING AND INTERVAL 1 DAY PRECEDING);
|
|
EXPLAIN
|
|
{
|
|
"query_block": {
|
|
"select_id": 1,
|
|
"cost_info": {
|
|
"query_cost": "7.95"
|
|
},
|
|
"windowing": {
|
|
"windows": [
|
|
{
|
|
"name": "w",
|
|
"using_filesort": true,
|
|
"filesort_key": [
|
|
"`id`"
|
|
],
|
|
"frame_buffer": {
|
|
"using_temporary_table": true,
|
|
"optimized_frame_evaluation": true
|
|
},
|
|
"functions": [
|
|
"first_value"
|
|
]
|
|
}
|
|
],
|
|
"cost_info": {
|
|
"sort_cost": "7.00"
|
|
},
|
|
"table": {
|
|
"table_name": "t_date",
|
|
"access_type": "ALL",
|
|
"rows_examined_per_scan": 7,
|
|
"rows_produced_per_join": 7,
|
|
"filtered": "100.00",
|
|
"cost_info": {
|
|
"read_cost": "0.25",
|
|
"eval_cost": "0.70",
|
|
"prefix_cost": "0.95",
|
|
"data_read_per_join": "56"
|
|
},
|
|
"used_columns": [
|
|
"id"
|
|
]
|
|
}
|
|
}
|
|
}
|
|
}
|
|
Warnings:
|
|
Note 1003 /* select#1 */ select `test`.`t_date`.`id` AS `id`,first_value(`test`.`t_date`.`id`) OVER `w` AS `FIRST_VALUE(id) OVER w` from `test`.`t_date` window `w` AS (ORDER BY `test`.`t_date`.`id` RANGE BETWEEN INTERVAL 2 day PRECEDING AND INTERVAL 1 day PRECEDING)
|
|
EXPLAIN FORMAT=JSON SELECT id, FIRST_VALUE(id) OVER w FROM t_date WINDOW w AS (ORDER BY id ROWS BETWEEN CURRENT ROW AND UNBOUNDED FOLLOWING);
|
|
EXPLAIN
|
|
{
|
|
"query_block": {
|
|
"select_id": 1,
|
|
"cost_info": {
|
|
"query_cost": "7.95"
|
|
},
|
|
"windowing": {
|
|
"windows": [
|
|
{
|
|
"name": "w",
|
|
"using_filesort": true,
|
|
"filesort_key": [
|
|
"`id`"
|
|
],
|
|
"frame_buffer": {
|
|
"using_temporary_table": true,
|
|
"optimized_frame_evaluation": true
|
|
},
|
|
"functions": [
|
|
"first_value"
|
|
]
|
|
}
|
|
],
|
|
"cost_info": {
|
|
"sort_cost": "7.00"
|
|
},
|
|
"table": {
|
|
"table_name": "t_date",
|
|
"access_type": "ALL",
|
|
"rows_examined_per_scan": 7,
|
|
"rows_produced_per_join": 7,
|
|
"filtered": "100.00",
|
|
"cost_info": {
|
|
"read_cost": "0.25",
|
|
"eval_cost": "0.70",
|
|
"prefix_cost": "0.95",
|
|
"data_read_per_join": "56"
|
|
},
|
|
"used_columns": [
|
|
"id"
|
|
]
|
|
}
|
|
}
|
|
}
|
|
}
|
|
Warnings:
|
|
Note 1003 /* select#1 */ select `test`.`t_date`.`id` AS `id`,first_value(`test`.`t_date`.`id`) OVER `w` AS `FIRST_VALUE(id) OVER w` from `test`.`t_date` window `w` AS (ORDER BY `test`.`t_date`.`id` ROWS BETWEEN CURRENT ROW AND UNBOUNDED FOLLOWING)
|
|
EXPLAIN FORMAT=JSON SELECT id, FIRST_VALUE(id) OVER w FROM t_date WINDOW w AS (ORDER BY id RANGE BETWEEN CURRENT ROW AND UNBOUNDED FOLLOWING);
|
|
EXPLAIN
|
|
{
|
|
"query_block": {
|
|
"select_id": 1,
|
|
"cost_info": {
|
|
"query_cost": "7.95"
|
|
},
|
|
"windowing": {
|
|
"windows": [
|
|
{
|
|
"name": "w",
|
|
"using_filesort": true,
|
|
"filesort_key": [
|
|
"`id`"
|
|
],
|
|
"frame_buffer": {
|
|
"using_temporary_table": true,
|
|
"optimized_frame_evaluation": true
|
|
},
|
|
"functions": [
|
|
"first_value"
|
|
]
|
|
}
|
|
],
|
|
"cost_info": {
|
|
"sort_cost": "7.00"
|
|
},
|
|
"table": {
|
|
"table_name": "t_date",
|
|
"access_type": "ALL",
|
|
"rows_examined_per_scan": 7,
|
|
"rows_produced_per_join": 7,
|
|
"filtered": "100.00",
|
|
"cost_info": {
|
|
"read_cost": "0.25",
|
|
"eval_cost": "0.70",
|
|
"prefix_cost": "0.95",
|
|
"data_read_per_join": "56"
|
|
},
|
|
"used_columns": [
|
|
"id"
|
|
]
|
|
}
|
|
}
|
|
}
|
|
}
|
|
Warnings:
|
|
Note 1003 /* select#1 */ select `test`.`t_date`.`id` AS `id`,first_value(`test`.`t_date`.`id`) OVER `w` AS `FIRST_VALUE(id) OVER w` from `test`.`t_date` window `w` AS (ORDER BY `test`.`t_date`.`id` RANGE BETWEEN CURRENT ROW AND UNBOUNDED FOLLOWING)
|
|
CREATE VIEW v AS
|
|
SELECT id, FIRST_VALUE(id) OVER w FROM t_date WINDOW w AS (ORDER BY id RANGE BETWEEN CURRENT ROW AND UNBOUNDED FOLLOWING);
|
|
SHOW CREATE VIEW v;
|
|
View Create View character_set_client collation_connection
|
|
v CREATE ALGORITHM=UNDEFINED DEFINER=`root`@`localhost` SQL SECURITY DEFINER VIEW `v` AS select `t_date`.`id` AS `id`,first_value(`t_date`.`id`) OVER `w` AS `FIRST_VALUE(id) OVER w` from `t_date` window `w` AS (ORDER BY `t_date`.`id` RANGE BETWEEN CURRENT ROW AND UNBOUNDED FOLLOWING) utf8 utf8_general_ci
|
|
EXPLAIN FORMAT=JSON SELECT * FROM v;
|
|
EXPLAIN
|
|
{
|
|
"query_block": {
|
|
"select_id": 1,
|
|
"cost_info": {
|
|
"query_cost": "3.29"
|
|
},
|
|
"table": {
|
|
"table_name": "v",
|
|
"access_type": "ALL",
|
|
"rows_examined_per_scan": 7,
|
|
"rows_produced_per_join": 7,
|
|
"filtered": "100.00",
|
|
"cost_info": {
|
|
"read_cost": "2.59",
|
|
"eval_cost": "0.70",
|
|
"prefix_cost": "3.29",
|
|
"data_read_per_join": "112"
|
|
},
|
|
"used_columns": [
|
|
"id",
|
|
"FIRST_VALUE(id) OVER w"
|
|
],
|
|
"materialized_from_subquery": {
|
|
"using_temporary_table": true,
|
|
"dependent": false,
|
|
"cacheable": true,
|
|
"query_block": {
|
|
"select_id": 2,
|
|
"cost_info": {
|
|
"query_cost": "7.95"
|
|
},
|
|
"windowing": {
|
|
"windows": [
|
|
{
|
|
"name": "w",
|
|
"using_filesort": true,
|
|
"filesort_key": [
|
|
"`id`"
|
|
],
|
|
"frame_buffer": {
|
|
"using_temporary_table": true,
|
|
"optimized_frame_evaluation": true
|
|
},
|
|
"functions": [
|
|
"first_value"
|
|
]
|
|
}
|
|
],
|
|
"cost_info": {
|
|
"sort_cost": "7.00"
|
|
},
|
|
"table": {
|
|
"table_name": "t_date",
|
|
"access_type": "ALL",
|
|
"rows_examined_per_scan": 7,
|
|
"rows_produced_per_join": 7,
|
|
"filtered": "100.00",
|
|
"cost_info": {
|
|
"read_cost": "0.25",
|
|
"eval_cost": "0.70",
|
|
"prefix_cost": "0.95",
|
|
"data_read_per_join": "56"
|
|
},
|
|
"used_columns": [
|
|
"id"
|
|
]
|
|
}
|
|
}
|
|
}
|
|
}
|
|
}
|
|
}
|
|
}
|
|
Warnings:
|
|
Note 1003 /* select#1 */ select `v`.`id` AS `id`,`v`.`FIRST_VALUE(id) OVER w` AS `FIRST_VALUE(id) OVER w` from `test`.`v`
|
|
DROP VIEW v;
|
|
EXPLAIN FORMAT=JSON SELECT id, FIRST_VALUE(id) OVER w FROM t_date WINDOW w AS (ORDER BY id ROWS BETWEEN 2 FOLLOWING AND 3 FOLLOWING);
|
|
EXPLAIN
|
|
{
|
|
"query_block": {
|
|
"select_id": 1,
|
|
"cost_info": {
|
|
"query_cost": "7.95"
|
|
},
|
|
"windowing": {
|
|
"windows": [
|
|
{
|
|
"name": "w",
|
|
"using_filesort": true,
|
|
"filesort_key": [
|
|
"`id`"
|
|
],
|
|
"frame_buffer": {
|
|
"using_temporary_table": true,
|
|
"optimized_frame_evaluation": true
|
|
},
|
|
"functions": [
|
|
"first_value"
|
|
]
|
|
}
|
|
],
|
|
"cost_info": {
|
|
"sort_cost": "7.00"
|
|
},
|
|
"table": {
|
|
"table_name": "t_date",
|
|
"access_type": "ALL",
|
|
"rows_examined_per_scan": 7,
|
|
"rows_produced_per_join": 7,
|
|
"filtered": "100.00",
|
|
"cost_info": {
|
|
"read_cost": "0.25",
|
|
"eval_cost": "0.70",
|
|
"prefix_cost": "0.95",
|
|
"data_read_per_join": "56"
|
|
},
|
|
"used_columns": [
|
|
"id"
|
|
]
|
|
}
|
|
}
|
|
}
|
|
}
|
|
Warnings:
|
|
Note 1003 /* select#1 */ select `test`.`t_date`.`id` AS `id`,first_value(`test`.`t_date`.`id`) OVER `w` AS `FIRST_VALUE(id) OVER w` from `test`.`t_date` window `w` AS (ORDER BY `test`.`t_date`.`id` ROWS BETWEEN 2 FOLLOWING AND 3 FOLLOWING)
|
|
EXPLAIN FORMAT=JSON SELECT id, FIRST_VALUE(id) OVER w FROM t_date WINDOW w AS (ORDER BY id RANGE BETWEEN INTERVAL 2 DAY FOLLOWING AND INTERVAL 3 DAY FOLLOWING);
|
|
EXPLAIN
|
|
{
|
|
"query_block": {
|
|
"select_id": 1,
|
|
"cost_info": {
|
|
"query_cost": "7.95"
|
|
},
|
|
"windowing": {
|
|
"windows": [
|
|
{
|
|
"name": "w",
|
|
"using_filesort": true,
|
|
"filesort_key": [
|
|
"`id`"
|
|
],
|
|
"frame_buffer": {
|
|
"using_temporary_table": true,
|
|
"optimized_frame_evaluation": true
|
|
},
|
|
"functions": [
|
|
"first_value"
|
|
]
|
|
}
|
|
],
|
|
"cost_info": {
|
|
"sort_cost": "7.00"
|
|
},
|
|
"table": {
|
|
"table_name": "t_date",
|
|
"access_type": "ALL",
|
|
"rows_examined_per_scan": 7,
|
|
"rows_produced_per_join": 7,
|
|
"filtered": "100.00",
|
|
"cost_info": {
|
|
"read_cost": "0.25",
|
|
"eval_cost": "0.70",
|
|
"prefix_cost": "0.95",
|
|
"data_read_per_join": "56"
|
|
},
|
|
"used_columns": [
|
|
"id"
|
|
]
|
|
}
|
|
}
|
|
}
|
|
}
|
|
Warnings:
|
|
Note 1003 /* select#1 */ select `test`.`t_date`.`id` AS `id`,first_value(`test`.`t_date`.`id`) OVER `w` AS `FIRST_VALUE(id) OVER w` from `test`.`t_date` window `w` AS (ORDER BY `test`.`t_date`.`id` RANGE BETWEEN INTERVAL 2 day FOLLOWING AND INTERVAL 3 day FOLLOWING)
|
|
CREATE VIEW v AS
|
|
SELECT id, FIRST_VALUE(id) OVER w FROM t_date WINDOW w AS (ORDER BY id RANGE BETWEEN INTERVAL 2 DAY FOLLOWING AND INTERVAL 3 DAY FOLLOWING);
|
|
SHOW CREATE VIEW v;
|
|
View Create View character_set_client collation_connection
|
|
v CREATE ALGORITHM=UNDEFINED DEFINER=`root`@`localhost` SQL SECURITY DEFINER VIEW `v` AS select `t_date`.`id` AS `id`,first_value(`t_date`.`id`) OVER `w` AS `FIRST_VALUE(id) OVER w` from `t_date` window `w` AS (ORDER BY `t_date`.`id` RANGE BETWEEN INTERVAL 2 day FOLLOWING AND INTERVAL 3 day FOLLOWING) utf8 utf8_general_ci
|
|
EXPLAIN FORMAT=JSON SELECT * FROM v;
|
|
EXPLAIN
|
|
{
|
|
"query_block": {
|
|
"select_id": 1,
|
|
"cost_info": {
|
|
"query_cost": "3.29"
|
|
},
|
|
"table": {
|
|
"table_name": "v",
|
|
"access_type": "ALL",
|
|
"rows_examined_per_scan": 7,
|
|
"rows_produced_per_join": 7,
|
|
"filtered": "100.00",
|
|
"cost_info": {
|
|
"read_cost": "2.59",
|
|
"eval_cost": "0.70",
|
|
"prefix_cost": "3.29",
|
|
"data_read_per_join": "112"
|
|
},
|
|
"used_columns": [
|
|
"id",
|
|
"FIRST_VALUE(id) OVER w"
|
|
],
|
|
"materialized_from_subquery": {
|
|
"using_temporary_table": true,
|
|
"dependent": false,
|
|
"cacheable": true,
|
|
"query_block": {
|
|
"select_id": 2,
|
|
"cost_info": {
|
|
"query_cost": "7.95"
|
|
},
|
|
"windowing": {
|
|
"windows": [
|
|
{
|
|
"name": "w",
|
|
"using_filesort": true,
|
|
"filesort_key": [
|
|
"`id`"
|
|
],
|
|
"frame_buffer": {
|
|
"using_temporary_table": true,
|
|
"optimized_frame_evaluation": true
|
|
},
|
|
"functions": [
|
|
"first_value"
|
|
]
|
|
}
|
|
],
|
|
"cost_info": {
|
|
"sort_cost": "7.00"
|
|
},
|
|
"table": {
|
|
"table_name": "t_date",
|
|
"access_type": "ALL",
|
|
"rows_examined_per_scan": 7,
|
|
"rows_produced_per_join": 7,
|
|
"filtered": "100.00",
|
|
"cost_info": {
|
|
"read_cost": "0.25",
|
|
"eval_cost": "0.70",
|
|
"prefix_cost": "0.95",
|
|
"data_read_per_join": "56"
|
|
},
|
|
"used_columns": [
|
|
"id"
|
|
]
|
|
}
|
|
}
|
|
}
|
|
}
|
|
}
|
|
}
|
|
}
|
|
Warnings:
|
|
Note 1003 /* select#1 */ select `v`.`id` AS `id`,`v`.`FIRST_VALUE(id) OVER w` AS `FIRST_VALUE(id) OVER w` from `test`.`v`
|
|
DROP VIEW v;
|
|
DROP TABLE t_date;
|
|
CREATE TABLE t_time(t TIME, ts TIMESTAMP);
|
|
INSERT INTO t_time VALUES ('12:30', '2016-07-05 08:30:42');
|
|
INSERT INTO t_time VALUES ('22:30', '2015-07-05 08:30:43');
|
|
INSERT INTO t_time VALUES ('13:30', '2014-07-05 08:30:44');
|
|
INSERT INTO t_time VALUES ('01:30', '2013-07-05 08:30:45');
|
|
INSERT INTO t_time VALUES ('15:30', '2016-08-05 08:31:42');
|
|
INSERT INTO t_time VALUES ('20:30', '2016-09-05 08:32:42');
|
|
INSERT INTO t_time VALUES ('04:30', '2016-10-05 08:33:42');
|
|
INSERT INTO t_time VALUES ('06:30', '2016-11-05 08:34:42');
|
|
INSERT INTO t_time VALUES ('18:30', '2016-07-05 09:30:42');
|
|
INSERT INTO t_time VALUES ('21:30', '2016-07-06 10:30:42');
|
|
INSERT INTO t_time VALUES ('00:30', '2016-07-07 11:30:42');
|
|
INSERT INTO t_time VALUES ('00:31', '2016-07-08 12:30:42');
|
|
ANALYZE TABLE t_time;
|
|
Table Op Msg_type Msg_text
|
|
test.t_time analyze status OK
|
|
CREATE TABLE t_time2(t TIME, ts TIMESTAMP, p INTEGER DEFAULT 1);
|
|
INSERT INTO t_time2(t, ts) SELECT * FROM t_time;
|
|
UPDATE t_time2 SET p=p+1;
|
|
INSERT INTO t_time2(t, ts) SELECT * FROM t_time;
|
|
ANALYZE TABLE t_time2;
|
|
Table Op Msg_type Msg_text
|
|
test.t_time2 analyze status OK
|
|
EXPLAIN FORMAT=JSON SELECT t, FIRST_VALUE(t) OVER w FROM t_time WINDOW w AS ();
|
|
EXPLAIN
|
|
"first_value"
|
|
"optimized_frame_evaluation": true
|
|
"using_temporary_table": true,
|
|
"data_read_per_join": "192"
|
|
"eval_cost": "1.20",
|
|
"frame_buffer": {
|
|
"functions": [
|
|
"name": "w",
|
|
"prefix_cost": "1.45",
|
|
"read_cost": "0.25",
|
|
"t"
|
|
]
|
|
},
|
|
"access_type": "ALL",
|
|
"cost_info": {
|
|
"filtered": "100.00",
|
|
"rows_examined_per_scan": 12,
|
|
"rows_produced_per_join": 12,
|
|
"table_name": "t_time",
|
|
"used_columns": [
|
|
]
|
|
{
|
|
}
|
|
},
|
|
"query_cost": "1.45"
|
|
"table": {
|
|
"windows": [
|
|
],
|
|
}
|
|
"cost_info": {
|
|
"select_id": 1,
|
|
"windowing": {
|
|
}
|
|
},
|
|
"query_block": {
|
|
}
|
|
Note 1003 /* select#1 */ select `test`.`t_time`.`t` AS `t`,first_value(`test`.`t_time`.`t`) OVER `w` AS `FIRST_VALUE(t) OVER w` from `test`.`t_time` window `w` AS ()
|
|
Warnings:
|
|
{
|
|
}
|
|
EXPLAIN FORMAT=JSON SELECT t, FIRST_VALUE(t) OVER w FROM t_time WINDOW w AS (ORDER BY t);
|
|
EXPLAIN
|
|
"`t`"
|
|
"first_value"
|
|
"optimized_frame_evaluation": true
|
|
"using_temporary_table": true,
|
|
"data_read_per_join": "192"
|
|
"eval_cost": "1.20",
|
|
"filesort_key": [
|
|
"frame_buffer": {
|
|
"functions": [
|
|
"name": "w",
|
|
"prefix_cost": "1.45",
|
|
"read_cost": "0.25",
|
|
"t"
|
|
"using_filesort": true,
|
|
]
|
|
],
|
|
},
|
|
"access_type": "ALL",
|
|
"cost_info": {
|
|
"filtered": "100.00",
|
|
"rows_examined_per_scan": 12,
|
|
"rows_produced_per_join": 12,
|
|
"sort_cost": "12.00"
|
|
"table_name": "t_time",
|
|
"used_columns": [
|
|
]
|
|
{
|
|
}
|
|
},
|
|
"cost_info": {
|
|
"query_cost": "13.45"
|
|
"table": {
|
|
"windows": [
|
|
],
|
|
}
|
|
},
|
|
"cost_info": {
|
|
"select_id": 1,
|
|
"windowing": {
|
|
}
|
|
},
|
|
"query_block": {
|
|
}
|
|
Note 1003 /* select#1 */ select `test`.`t_time`.`t` AS `t`,first_value(`test`.`t_time`.`t`) OVER `w` AS `FIRST_VALUE(t) OVER w` from `test`.`t_time` window `w` AS (ORDER BY `test`.`t_time`.`t` )
|
|
Warnings:
|
|
{
|
|
}
|
|
EXPLAIN FORMAT=JSON SELECT t, FIRST_VALUE(t) OVER w FROM t_time WINDOW w AS (ORDER BY t DESC);
|
|
EXPLAIN
|
|
{
|
|
"query_block": {
|
|
"select_id": 1,
|
|
"cost_info": {
|
|
"query_cost": "13.45"
|
|
},
|
|
"windowing": {
|
|
"windows": [
|
|
{
|
|
"name": "w",
|
|
"using_filesort": true,
|
|
"filesort_key": [
|
|
"`t` desc"
|
|
],
|
|
"frame_buffer": {
|
|
"using_temporary_table": true,
|
|
"optimized_frame_evaluation": true
|
|
},
|
|
"functions": [
|
|
"first_value"
|
|
]
|
|
}
|
|
],
|
|
"cost_info": {
|
|
"sort_cost": "12.00"
|
|
},
|
|
"table": {
|
|
"table_name": "t_time",
|
|
"access_type": "ALL",
|
|
"rows_examined_per_scan": 12,
|
|
"rows_produced_per_join": 12,
|
|
"filtered": "100.00",
|
|
"cost_info": {
|
|
"read_cost": "0.25",
|
|
"eval_cost": "1.20",
|
|
"prefix_cost": "1.45",
|
|
"data_read_per_join": "192"
|
|
},
|
|
"used_columns": [
|
|
"t"
|
|
]
|
|
}
|
|
}
|
|
}
|
|
}
|
|
Warnings:
|
|
Note 1003 /* select#1 */ select `test`.`t_time`.`t` AS `t`,first_value(`test`.`t_time`.`t`) OVER `w` AS `FIRST_VALUE(t) OVER w` from `test`.`t_time` window `w` AS (ORDER BY `test`.`t_time`.`t` desc )
|
|
EXPLAIN FORMAT=JSON SELECT t, FIRST_VALUE(t) OVER w FROM t_time WINDOW w AS (ORDER BY t ROWS 2 PRECEDING);
|
|
EXPLAIN
|
|
{
|
|
"query_block": {
|
|
"select_id": 1,
|
|
"cost_info": {
|
|
"query_cost": "13.45"
|
|
},
|
|
"windowing": {
|
|
"windows": [
|
|
{
|
|
"name": "w",
|
|
"using_filesort": true,
|
|
"filesort_key": [
|
|
"`t`"
|
|
],
|
|
"frame_buffer": {
|
|
"using_temporary_table": true,
|
|
"optimized_frame_evaluation": true
|
|
},
|
|
"functions": [
|
|
"first_value"
|
|
]
|
|
}
|
|
],
|
|
"cost_info": {
|
|
"sort_cost": "12.00"
|
|
},
|
|
"table": {
|
|
"table_name": "t_time",
|
|
"access_type": "ALL",
|
|
"rows_examined_per_scan": 12,
|
|
"rows_produced_per_join": 12,
|
|
"filtered": "100.00",
|
|
"cost_info": {
|
|
"read_cost": "0.25",
|
|
"eval_cost": "1.20",
|
|
"prefix_cost": "1.45",
|
|
"data_read_per_join": "192"
|
|
},
|
|
"used_columns": [
|
|
"t"
|
|
]
|
|
}
|
|
}
|
|
}
|
|
}
|
|
Warnings:
|
|
Note 1003 /* select#1 */ select `test`.`t_time`.`t` AS `t`,first_value(`test`.`t_time`.`t`) OVER `w` AS `FIRST_VALUE(t) OVER w` from `test`.`t_time` window `w` AS (ORDER BY `test`.`t_time`.`t` ROWS BETWEEN 2 PRECEDING AND CURRENT ROW)
|
|
EXPLAIN FORMAT=JSON SELECT t, FIRST_VALUE(t) OVER w FROM t_time WINDOW w AS (ORDER BY t RANGE INTERVAL 2 HOUR PRECEDING);
|
|
EXPLAIN
|
|
{
|
|
"query_block": {
|
|
"select_id": 1,
|
|
"cost_info": {
|
|
"query_cost": "13.45"
|
|
},
|
|
"windowing": {
|
|
"windows": [
|
|
{
|
|
"name": "w",
|
|
"using_filesort": true,
|
|
"filesort_key": [
|
|
"`t`"
|
|
],
|
|
"frame_buffer": {
|
|
"using_temporary_table": true,
|
|
"optimized_frame_evaluation": true
|
|
},
|
|
"functions": [
|
|
"first_value"
|
|
]
|
|
}
|
|
],
|
|
"cost_info": {
|
|
"sort_cost": "12.00"
|
|
},
|
|
"table": {
|
|
"table_name": "t_time",
|
|
"access_type": "ALL",
|
|
"rows_examined_per_scan": 12,
|
|
"rows_produced_per_join": 12,
|
|
"filtered": "100.00",
|
|
"cost_info": {
|
|
"read_cost": "0.25",
|
|
"eval_cost": "1.20",
|
|
"prefix_cost": "1.45",
|
|
"data_read_per_join": "192"
|
|
},
|
|
"used_columns": [
|
|
"t"
|
|
]
|
|
}
|
|
}
|
|
}
|
|
}
|
|
Warnings:
|
|
Note 1003 /* select#1 */ select `test`.`t_time`.`t` AS `t`,first_value(`test`.`t_time`.`t`) OVER `w` AS `FIRST_VALUE(t) OVER w` from `test`.`t_time` window `w` AS (ORDER BY `test`.`t_time`.`t` RANGE BETWEEN INTERVAL 2 hour PRECEDING AND CURRENT ROW)
|
|
EXPLAIN FORMAT=JSON SELECT t, FIRST_VALUE(t) OVER w FROM t_time WINDOW w AS (ORDER BY t ROWS BETWEEN 2 PRECEDING AND 1 PRECEDING);
|
|
EXPLAIN
|
|
{
|
|
"query_block": {
|
|
"select_id": 1,
|
|
"cost_info": {
|
|
"query_cost": "13.45"
|
|
},
|
|
"windowing": {
|
|
"windows": [
|
|
{
|
|
"name": "w",
|
|
"using_filesort": true,
|
|
"filesort_key": [
|
|
"`t`"
|
|
],
|
|
"frame_buffer": {
|
|
"using_temporary_table": true,
|
|
"optimized_frame_evaluation": true
|
|
},
|
|
"functions": [
|
|
"first_value"
|
|
]
|
|
}
|
|
],
|
|
"cost_info": {
|
|
"sort_cost": "12.00"
|
|
},
|
|
"table": {
|
|
"table_name": "t_time",
|
|
"access_type": "ALL",
|
|
"rows_examined_per_scan": 12,
|
|
"rows_produced_per_join": 12,
|
|
"filtered": "100.00",
|
|
"cost_info": {
|
|
"read_cost": "0.25",
|
|
"eval_cost": "1.20",
|
|
"prefix_cost": "1.45",
|
|
"data_read_per_join": "192"
|
|
},
|
|
"used_columns": [
|
|
"t"
|
|
]
|
|
}
|
|
}
|
|
}
|
|
}
|
|
Warnings:
|
|
Note 1003 /* select#1 */ select `test`.`t_time`.`t` AS `t`,first_value(`test`.`t_time`.`t`) OVER `w` AS `FIRST_VALUE(t) OVER w` from `test`.`t_time` window `w` AS (ORDER BY `test`.`t_time`.`t` ROWS BETWEEN 2 PRECEDING AND 1 PRECEDING)
|
|
EXPLAIN FORMAT=JSON SELECT t, FIRST_VALUE(t) OVER w FROM t_time WINDOW w AS (ORDER BY t RANGE BETWEEN INTERVAL 2 HOUR PRECEDING AND INTERVAL 1 HOUR PRECEDING);
|
|
EXPLAIN
|
|
{
|
|
"query_block": {
|
|
"select_id": 1,
|
|
"cost_info": {
|
|
"query_cost": "13.45"
|
|
},
|
|
"windowing": {
|
|
"windows": [
|
|
{
|
|
"name": "w",
|
|
"using_filesort": true,
|
|
"filesort_key": [
|
|
"`t`"
|
|
],
|
|
"frame_buffer": {
|
|
"using_temporary_table": true,
|
|
"optimized_frame_evaluation": true
|
|
},
|
|
"functions": [
|
|
"first_value"
|
|
]
|
|
}
|
|
],
|
|
"cost_info": {
|
|
"sort_cost": "12.00"
|
|
},
|
|
"table": {
|
|
"table_name": "t_time",
|
|
"access_type": "ALL",
|
|
"rows_examined_per_scan": 12,
|
|
"rows_produced_per_join": 12,
|
|
"filtered": "100.00",
|
|
"cost_info": {
|
|
"read_cost": "0.25",
|
|
"eval_cost": "1.20",
|
|
"prefix_cost": "1.45",
|
|
"data_read_per_join": "192"
|
|
},
|
|
"used_columns": [
|
|
"t"
|
|
]
|
|
}
|
|
}
|
|
}
|
|
}
|
|
Warnings:
|
|
Note 1003 /* select#1 */ select `test`.`t_time`.`t` AS `t`,first_value(`test`.`t_time`.`t`) OVER `w` AS `FIRST_VALUE(t) OVER w` from `test`.`t_time` window `w` AS (ORDER BY `test`.`t_time`.`t` RANGE BETWEEN INTERVAL 2 hour PRECEDING AND INTERVAL 1 hour PRECEDING)
|
|
EXPLAIN FORMAT=JSON SELECT t, FIRST_VALUE(t) OVER w FROM t_time WINDOW w AS (ORDER BY t ROWS BETWEEN CURRENT ROW AND UNBOUNDED FOLLOWING);
|
|
EXPLAIN
|
|
{
|
|
"query_block": {
|
|
"select_id": 1,
|
|
"cost_info": {
|
|
"query_cost": "13.45"
|
|
},
|
|
"windowing": {
|
|
"windows": [
|
|
{
|
|
"name": "w",
|
|
"using_filesort": true,
|
|
"filesort_key": [
|
|
"`t`"
|
|
],
|
|
"frame_buffer": {
|
|
"using_temporary_table": true,
|
|
"optimized_frame_evaluation": true
|
|
},
|
|
"functions": [
|
|
"first_value"
|
|
]
|
|
}
|
|
],
|
|
"cost_info": {
|
|
"sort_cost": "12.00"
|
|
},
|
|
"table": {
|
|
"table_name": "t_time",
|
|
"access_type": "ALL",
|
|
"rows_examined_per_scan": 12,
|
|
"rows_produced_per_join": 12,
|
|
"filtered": "100.00",
|
|
"cost_info": {
|
|
"read_cost": "0.25",
|
|
"eval_cost": "1.20",
|
|
"prefix_cost": "1.45",
|
|
"data_read_per_join": "192"
|
|
},
|
|
"used_columns": [
|
|
"t"
|
|
]
|
|
}
|
|
}
|
|
}
|
|
}
|
|
Warnings:
|
|
Note 1003 /* select#1 */ select `test`.`t_time`.`t` AS `t`,first_value(`test`.`t_time`.`t`) OVER `w` AS `FIRST_VALUE(t) OVER w` from `test`.`t_time` window `w` AS (ORDER BY `test`.`t_time`.`t` ROWS BETWEEN CURRENT ROW AND UNBOUNDED FOLLOWING)
|
|
EXPLAIN FORMAT=JSON SELECT t, FIRST_VALUE(t) OVER w FROM t_time WINDOW w AS (ORDER BY t RANGE BETWEEN CURRENT ROW AND UNBOUNDED FOLLOWING);
|
|
EXPLAIN
|
|
{
|
|
"query_block": {
|
|
"select_id": 1,
|
|
"cost_info": {
|
|
"query_cost": "13.45"
|
|
},
|
|
"windowing": {
|
|
"windows": [
|
|
{
|
|
"name": "w",
|
|
"using_filesort": true,
|
|
"filesort_key": [
|
|
"`t`"
|
|
],
|
|
"frame_buffer": {
|
|
"using_temporary_table": true,
|
|
"optimized_frame_evaluation": true
|
|
},
|
|
"functions": [
|
|
"first_value"
|
|
]
|
|
}
|
|
],
|
|
"cost_info": {
|
|
"sort_cost": "12.00"
|
|
},
|
|
"table": {
|
|
"table_name": "t_time",
|
|
"access_type": "ALL",
|
|
"rows_examined_per_scan": 12,
|
|
"rows_produced_per_join": 12,
|
|
"filtered": "100.00",
|
|
"cost_info": {
|
|
"read_cost": "0.25",
|
|
"eval_cost": "1.20",
|
|
"prefix_cost": "1.45",
|
|
"data_read_per_join": "192"
|
|
},
|
|
"used_columns": [
|
|
"t"
|
|
]
|
|
}
|
|
}
|
|
}
|
|
}
|
|
Warnings:
|
|
Note 1003 /* select#1 */ select `test`.`t_time`.`t` AS `t`,first_value(`test`.`t_time`.`t`) OVER `w` AS `FIRST_VALUE(t) OVER w` from `test`.`t_time` window `w` AS (ORDER BY `test`.`t_time`.`t` RANGE BETWEEN CURRENT ROW AND UNBOUNDED FOLLOWING)
|
|
EXPLAIN FORMAT=JSON SELECT t, FIRST_VALUE(t) OVER w FROM t_time WINDOW w AS (ORDER BY t ROWS BETWEEN 2 FOLLOWING AND 3 FOLLOWING);
|
|
EXPLAIN
|
|
{
|
|
"query_block": {
|
|
"select_id": 1,
|
|
"cost_info": {
|
|
"query_cost": "13.45"
|
|
},
|
|
"windowing": {
|
|
"windows": [
|
|
{
|
|
"name": "w",
|
|
"using_filesort": true,
|
|
"filesort_key": [
|
|
"`t`"
|
|
],
|
|
"frame_buffer": {
|
|
"using_temporary_table": true,
|
|
"optimized_frame_evaluation": true
|
|
},
|
|
"functions": [
|
|
"first_value"
|
|
]
|
|
}
|
|
],
|
|
"cost_info": {
|
|
"sort_cost": "12.00"
|
|
},
|
|
"table": {
|
|
"table_name": "t_time",
|
|
"access_type": "ALL",
|
|
"rows_examined_per_scan": 12,
|
|
"rows_produced_per_join": 12,
|
|
"filtered": "100.00",
|
|
"cost_info": {
|
|
"read_cost": "0.25",
|
|
"eval_cost": "1.20",
|
|
"prefix_cost": "1.45",
|
|
"data_read_per_join": "192"
|
|
},
|
|
"used_columns": [
|
|
"t"
|
|
]
|
|
}
|
|
}
|
|
}
|
|
}
|
|
Warnings:
|
|
Note 1003 /* select#1 */ select `test`.`t_time`.`t` AS `t`,first_value(`test`.`t_time`.`t`) OVER `w` AS `FIRST_VALUE(t) OVER w` from `test`.`t_time` window `w` AS (ORDER BY `test`.`t_time`.`t` ROWS BETWEEN 2 FOLLOWING AND 3 FOLLOWING)
|
|
EXPLAIN FORMAT=JSON SELECT t, FIRST_VALUE(t) OVER w FROM t_time WINDOW w AS (ORDER BY t RANGE BETWEEN INTERVAL 2 HOUR FOLLOWING AND INTERVAL 3 HOUR FOLLOWING);
|
|
EXPLAIN
|
|
{
|
|
"query_block": {
|
|
"select_id": 1,
|
|
"cost_info": {
|
|
"query_cost": "13.45"
|
|
},
|
|
"windowing": {
|
|
"windows": [
|
|
{
|
|
"name": "w",
|
|
"using_filesort": true,
|
|
"filesort_key": [
|
|
"`t`"
|
|
],
|
|
"frame_buffer": {
|
|
"using_temporary_table": true,
|
|
"optimized_frame_evaluation": true
|
|
},
|
|
"functions": [
|
|
"first_value"
|
|
]
|
|
}
|
|
],
|
|
"cost_info": {
|
|
"sort_cost": "12.00"
|
|
},
|
|
"table": {
|
|
"table_name": "t_time",
|
|
"access_type": "ALL",
|
|
"rows_examined_per_scan": 12,
|
|
"rows_produced_per_join": 12,
|
|
"filtered": "100.00",
|
|
"cost_info": {
|
|
"read_cost": "0.25",
|
|
"eval_cost": "1.20",
|
|
"prefix_cost": "1.45",
|
|
"data_read_per_join": "192"
|
|
},
|
|
"used_columns": [
|
|
"t"
|
|
]
|
|
}
|
|
}
|
|
}
|
|
}
|
|
Warnings:
|
|
Note 1003 /* select#1 */ select `test`.`t_time`.`t` AS `t`,first_value(`test`.`t_time`.`t`) OVER `w` AS `FIRST_VALUE(t) OVER w` from `test`.`t_time` window `w` AS (ORDER BY `test`.`t_time`.`t` RANGE BETWEEN INTERVAL 2 hour FOLLOWING AND INTERVAL 3 hour FOLLOWING)
|
|
EXPLAIN FORMAT=JSON SELECT p, t, FIRST_VALUE(t) OVER w FROM t_time2 WINDOW w AS (PARTITION by p ORDER BY t);
|
|
EXPLAIN
|
|
"`p`",
|
|
"`t`"
|
|
"first_value"
|
|
"optimized_frame_evaluation": true
|
|
"using_temporary_table": true,
|
|
"data_read_per_join": "384"
|
|
"eval_cost": "2.40",
|
|
"filesort_key": [
|
|
"frame_buffer": {
|
|
"functions": [
|
|
"name": "w",
|
|
"p"
|
|
"prefix_cost": "2.65",
|
|
"read_cost": "0.25",
|
|
"t",
|
|
"using_filesort": true,
|
|
]
|
|
],
|
|
},
|
|
"access_type": "ALL",
|
|
"cost_info": {
|
|
"filtered": "100.00",
|
|
"rows_examined_per_scan": 24,
|
|
"rows_produced_per_join": 24,
|
|
"sort_cost": "24.00"
|
|
"table_name": "t_time2",
|
|
"used_columns": [
|
|
]
|
|
{
|
|
}
|
|
},
|
|
"cost_info": {
|
|
"query_cost": "26.65"
|
|
"table": {
|
|
"windows": [
|
|
],
|
|
}
|
|
},
|
|
"cost_info": {
|
|
"select_id": 1,
|
|
"windowing": {
|
|
}
|
|
},
|
|
"query_block": {
|
|
}
|
|
Note 1003 /* select#1 */ select `test`.`t_time2`.`p` AS `p`,`test`.`t_time2`.`t` AS `t`,first_value(`test`.`t_time2`.`t`) OVER `w` AS `FIRST_VALUE(t) OVER w` from `test`.`t_time2` window `w` AS (PARTITION BY `test`.`t_time2`.`p` ORDER BY `test`.`t_time2`.`t` )
|
|
Warnings:
|
|
{
|
|
}
|
|
EXPLAIN FORMAT=JSON SELECT p, t, FIRST_VALUE(t) OVER w FROM t_time2 WINDOW w AS (PARTITION by p ORDER BY t DESC);
|
|
EXPLAIN
|
|
{
|
|
"query_block": {
|
|
"select_id": 1,
|
|
"cost_info": {
|
|
"query_cost": "26.65"
|
|
},
|
|
"windowing": {
|
|
"windows": [
|
|
{
|
|
"name": "w",
|
|
"using_filesort": true,
|
|
"filesort_key": [
|
|
"`p`",
|
|
"`t` desc"
|
|
],
|
|
"frame_buffer": {
|
|
"using_temporary_table": true,
|
|
"optimized_frame_evaluation": true
|
|
},
|
|
"functions": [
|
|
"first_value"
|
|
]
|
|
}
|
|
],
|
|
"cost_info": {
|
|
"sort_cost": "24.00"
|
|
},
|
|
"table": {
|
|
"table_name": "t_time2",
|
|
"access_type": "ALL",
|
|
"rows_examined_per_scan": 24,
|
|
"rows_produced_per_join": 24,
|
|
"filtered": "100.00",
|
|
"cost_info": {
|
|
"read_cost": "0.25",
|
|
"eval_cost": "2.40",
|
|
"prefix_cost": "2.65",
|
|
"data_read_per_join": "384"
|
|
},
|
|
"used_columns": [
|
|
"t",
|
|
"p"
|
|
]
|
|
}
|
|
}
|
|
}
|
|
}
|
|
Warnings:
|
|
Note 1003 /* select#1 */ select `test`.`t_time2`.`p` AS `p`,`test`.`t_time2`.`t` AS `t`,first_value(`test`.`t_time2`.`t`) OVER `w` AS `FIRST_VALUE(t) OVER w` from `test`.`t_time2` window `w` AS (PARTITION BY `test`.`t_time2`.`p` ORDER BY `test`.`t_time2`.`t` desc )
|
|
EXPLAIN FORMAT=JSON SELECT p, t, FIRST_VALUE(t) OVER w FROM t_time2 WINDOW w AS (PARTITION by p ORDER BY t ROWS 2 PRECEDING);
|
|
EXPLAIN
|
|
{
|
|
"query_block": {
|
|
"select_id": 1,
|
|
"cost_info": {
|
|
"query_cost": "26.65"
|
|
},
|
|
"windowing": {
|
|
"windows": [
|
|
{
|
|
"name": "w",
|
|
"using_filesort": true,
|
|
"filesort_key": [
|
|
"`p`",
|
|
"`t`"
|
|
],
|
|
"frame_buffer": {
|
|
"using_temporary_table": true,
|
|
"optimized_frame_evaluation": true
|
|
},
|
|
"functions": [
|
|
"first_value"
|
|
]
|
|
}
|
|
],
|
|
"cost_info": {
|
|
"sort_cost": "24.00"
|
|
},
|
|
"table": {
|
|
"table_name": "t_time2",
|
|
"access_type": "ALL",
|
|
"rows_examined_per_scan": 24,
|
|
"rows_produced_per_join": 24,
|
|
"filtered": "100.00",
|
|
"cost_info": {
|
|
"read_cost": "0.25",
|
|
"eval_cost": "2.40",
|
|
"prefix_cost": "2.65",
|
|
"data_read_per_join": "384"
|
|
},
|
|
"used_columns": [
|
|
"t",
|
|
"p"
|
|
]
|
|
}
|
|
}
|
|
}
|
|
}
|
|
Warnings:
|
|
Note 1003 /* select#1 */ select `test`.`t_time2`.`p` AS `p`,`test`.`t_time2`.`t` AS `t`,first_value(`test`.`t_time2`.`t`) OVER `w` AS `FIRST_VALUE(t) OVER w` from `test`.`t_time2` window `w` AS (PARTITION BY `test`.`t_time2`.`p` ORDER BY `test`.`t_time2`.`t` ROWS BETWEEN 2 PRECEDING AND CURRENT ROW)
|
|
EXPLAIN FORMAT=JSON SELECT p, t, FIRST_VALUE(t) OVER w FROM t_time2 WINDOW w AS (PARTITION by p ORDER BY t RANGE INTERVAL 2 HOUR PRECEDING);
|
|
EXPLAIN
|
|
{
|
|
"query_block": {
|
|
"select_id": 1,
|
|
"cost_info": {
|
|
"query_cost": "26.65"
|
|
},
|
|
"windowing": {
|
|
"windows": [
|
|
{
|
|
"name": "w",
|
|
"using_filesort": true,
|
|
"filesort_key": [
|
|
"`p`",
|
|
"`t`"
|
|
],
|
|
"frame_buffer": {
|
|
"using_temporary_table": true,
|
|
"optimized_frame_evaluation": true
|
|
},
|
|
"functions": [
|
|
"first_value"
|
|
]
|
|
}
|
|
],
|
|
"cost_info": {
|
|
"sort_cost": "24.00"
|
|
},
|
|
"table": {
|
|
"table_name": "t_time2",
|
|
"access_type": "ALL",
|
|
"rows_examined_per_scan": 24,
|
|
"rows_produced_per_join": 24,
|
|
"filtered": "100.00",
|
|
"cost_info": {
|
|
"read_cost": "0.25",
|
|
"eval_cost": "2.40",
|
|
"prefix_cost": "2.65",
|
|
"data_read_per_join": "384"
|
|
},
|
|
"used_columns": [
|
|
"t",
|
|
"p"
|
|
]
|
|
}
|
|
}
|
|
}
|
|
}
|
|
Warnings:
|
|
Note 1003 /* select#1 */ select `test`.`t_time2`.`p` AS `p`,`test`.`t_time2`.`t` AS `t`,first_value(`test`.`t_time2`.`t`) OVER `w` AS `FIRST_VALUE(t) OVER w` from `test`.`t_time2` window `w` AS (PARTITION BY `test`.`t_time2`.`p` ORDER BY `test`.`t_time2`.`t` RANGE BETWEEN INTERVAL 2 hour PRECEDING AND CURRENT ROW)
|
|
EXPLAIN FORMAT=JSON SELECT p, t, FIRST_VALUE(t) OVER w FROM t_time2 WINDOW w AS (PARTITION by p ORDER BY t ROWS BETWEEN 2 PRECEDING AND 1 PRECEDING);
|
|
EXPLAIN
|
|
{
|
|
"query_block": {
|
|
"select_id": 1,
|
|
"cost_info": {
|
|
"query_cost": "26.65"
|
|
},
|
|
"windowing": {
|
|
"windows": [
|
|
{
|
|
"name": "w",
|
|
"using_filesort": true,
|
|
"filesort_key": [
|
|
"`p`",
|
|
"`t`"
|
|
],
|
|
"frame_buffer": {
|
|
"using_temporary_table": true,
|
|
"optimized_frame_evaluation": true
|
|
},
|
|
"functions": [
|
|
"first_value"
|
|
]
|
|
}
|
|
],
|
|
"cost_info": {
|
|
"sort_cost": "24.00"
|
|
},
|
|
"table": {
|
|
"table_name": "t_time2",
|
|
"access_type": "ALL",
|
|
"rows_examined_per_scan": 24,
|
|
"rows_produced_per_join": 24,
|
|
"filtered": "100.00",
|
|
"cost_info": {
|
|
"read_cost": "0.25",
|
|
"eval_cost": "2.40",
|
|
"prefix_cost": "2.65",
|
|
"data_read_per_join": "384"
|
|
},
|
|
"used_columns": [
|
|
"t",
|
|
"p"
|
|
]
|
|
}
|
|
}
|
|
}
|
|
}
|
|
Warnings:
|
|
Note 1003 /* select#1 */ select `test`.`t_time2`.`p` AS `p`,`test`.`t_time2`.`t` AS `t`,first_value(`test`.`t_time2`.`t`) OVER `w` AS `FIRST_VALUE(t) OVER w` from `test`.`t_time2` window `w` AS (PARTITION BY `test`.`t_time2`.`p` ORDER BY `test`.`t_time2`.`t` ROWS BETWEEN 2 PRECEDING AND 1 PRECEDING)
|
|
EXPLAIN FORMAT=JSON SELECT p, t, FIRST_VALUE(t) OVER w FROM t_time2 WINDOW w AS (PARTITION by p ORDER BY t RANGE BETWEEN INTERVAL 2 HOUR PRECEDING AND INTERVAL 1 HOUR PRECEDING);
|
|
EXPLAIN
|
|
{
|
|
"query_block": {
|
|
"select_id": 1,
|
|
"cost_info": {
|
|
"query_cost": "26.65"
|
|
},
|
|
"windowing": {
|
|
"windows": [
|
|
{
|
|
"name": "w",
|
|
"using_filesort": true,
|
|
"filesort_key": [
|
|
"`p`",
|
|
"`t`"
|
|
],
|
|
"frame_buffer": {
|
|
"using_temporary_table": true,
|
|
"optimized_frame_evaluation": true
|
|
},
|
|
"functions": [
|
|
"first_value"
|
|
]
|
|
}
|
|
],
|
|
"cost_info": {
|
|
"sort_cost": "24.00"
|
|
},
|
|
"table": {
|
|
"table_name": "t_time2",
|
|
"access_type": "ALL",
|
|
"rows_examined_per_scan": 24,
|
|
"rows_produced_per_join": 24,
|
|
"filtered": "100.00",
|
|
"cost_info": {
|
|
"read_cost": "0.25",
|
|
"eval_cost": "2.40",
|
|
"prefix_cost": "2.65",
|
|
"data_read_per_join": "384"
|
|
},
|
|
"used_columns": [
|
|
"t",
|
|
"p"
|
|
]
|
|
}
|
|
}
|
|
}
|
|
}
|
|
Warnings:
|
|
Note 1003 /* select#1 */ select `test`.`t_time2`.`p` AS `p`,`test`.`t_time2`.`t` AS `t`,first_value(`test`.`t_time2`.`t`) OVER `w` AS `FIRST_VALUE(t) OVER w` from `test`.`t_time2` window `w` AS (PARTITION BY `test`.`t_time2`.`p` ORDER BY `test`.`t_time2`.`t` RANGE BETWEEN INTERVAL 2 hour PRECEDING AND INTERVAL 1 hour PRECEDING)
|
|
EXPLAIN FORMAT=JSON SELECT p, t, FIRST_VALUE(t) OVER w FROM t_time2 WINDOW w AS (PARTITION by p ORDER BY t ROWS BETWEEN CURRENT ROW AND UNBOUNDED FOLLOWING);
|
|
EXPLAIN
|
|
{
|
|
"query_block": {
|
|
"select_id": 1,
|
|
"cost_info": {
|
|
"query_cost": "26.65"
|
|
},
|
|
"windowing": {
|
|
"windows": [
|
|
{
|
|
"name": "w",
|
|
"using_filesort": true,
|
|
"filesort_key": [
|
|
"`p`",
|
|
"`t`"
|
|
],
|
|
"frame_buffer": {
|
|
"using_temporary_table": true,
|
|
"optimized_frame_evaluation": true
|
|
},
|
|
"functions": [
|
|
"first_value"
|
|
]
|
|
}
|
|
],
|
|
"cost_info": {
|
|
"sort_cost": "24.00"
|
|
},
|
|
"table": {
|
|
"table_name": "t_time2",
|
|
"access_type": "ALL",
|
|
"rows_examined_per_scan": 24,
|
|
"rows_produced_per_join": 24,
|
|
"filtered": "100.00",
|
|
"cost_info": {
|
|
"read_cost": "0.25",
|
|
"eval_cost": "2.40",
|
|
"prefix_cost": "2.65",
|
|
"data_read_per_join": "384"
|
|
},
|
|
"used_columns": [
|
|
"t",
|
|
"p"
|
|
]
|
|
}
|
|
}
|
|
}
|
|
}
|
|
Warnings:
|
|
Note 1003 /* select#1 */ select `test`.`t_time2`.`p` AS `p`,`test`.`t_time2`.`t` AS `t`,first_value(`test`.`t_time2`.`t`) OVER `w` AS `FIRST_VALUE(t) OVER w` from `test`.`t_time2` window `w` AS (PARTITION BY `test`.`t_time2`.`p` ORDER BY `test`.`t_time2`.`t` ROWS BETWEEN CURRENT ROW AND UNBOUNDED FOLLOWING)
|
|
EXPLAIN FORMAT=JSON SELECT p, t, FIRST_VALUE(t) OVER w FROM t_time2 WINDOW w AS (PARTITION by p ORDER BY t RANGE BETWEEN CURRENT ROW AND UNBOUNDED FOLLOWING);
|
|
EXPLAIN
|
|
{
|
|
"query_block": {
|
|
"select_id": 1,
|
|
"cost_info": {
|
|
"query_cost": "26.65"
|
|
},
|
|
"windowing": {
|
|
"windows": [
|
|
{
|
|
"name": "w",
|
|
"using_filesort": true,
|
|
"filesort_key": [
|
|
"`p`",
|
|
"`t`"
|
|
],
|
|
"frame_buffer": {
|
|
"using_temporary_table": true,
|
|
"optimized_frame_evaluation": true
|
|
},
|
|
"functions": [
|
|
"first_value"
|
|
]
|
|
}
|
|
],
|
|
"cost_info": {
|
|
"sort_cost": "24.00"
|
|
},
|
|
"table": {
|
|
"table_name": "t_time2",
|
|
"access_type": "ALL",
|
|
"rows_examined_per_scan": 24,
|
|
"rows_produced_per_join": 24,
|
|
"filtered": "100.00",
|
|
"cost_info": {
|
|
"read_cost": "0.25",
|
|
"eval_cost": "2.40",
|
|
"prefix_cost": "2.65",
|
|
"data_read_per_join": "384"
|
|
},
|
|
"used_columns": [
|
|
"t",
|
|
"p"
|
|
]
|
|
}
|
|
}
|
|
}
|
|
}
|
|
Warnings:
|
|
Note 1003 /* select#1 */ select `test`.`t_time2`.`p` AS `p`,`test`.`t_time2`.`t` AS `t`,first_value(`test`.`t_time2`.`t`) OVER `w` AS `FIRST_VALUE(t) OVER w` from `test`.`t_time2` window `w` AS (PARTITION BY `test`.`t_time2`.`p` ORDER BY `test`.`t_time2`.`t` RANGE BETWEEN CURRENT ROW AND UNBOUNDED FOLLOWING)
|
|
EXPLAIN FORMAT=JSON SELECT p, t, FIRST_VALUE(t) OVER w FROM t_time2 WINDOW w AS (PARTITION by p ORDER BY t ROWS BETWEEN 2 FOLLOWING AND 3 FOLLOWING);
|
|
EXPLAIN
|
|
{
|
|
"query_block": {
|
|
"select_id": 1,
|
|
"cost_info": {
|
|
"query_cost": "26.65"
|
|
},
|
|
"windowing": {
|
|
"windows": [
|
|
{
|
|
"name": "w",
|
|
"using_filesort": true,
|
|
"filesort_key": [
|
|
"`p`",
|
|
"`t`"
|
|
],
|
|
"frame_buffer": {
|
|
"using_temporary_table": true,
|
|
"optimized_frame_evaluation": true
|
|
},
|
|
"functions": [
|
|
"first_value"
|
|
]
|
|
}
|
|
],
|
|
"cost_info": {
|
|
"sort_cost": "24.00"
|
|
},
|
|
"table": {
|
|
"table_name": "t_time2",
|
|
"access_type": "ALL",
|
|
"rows_examined_per_scan": 24,
|
|
"rows_produced_per_join": 24,
|
|
"filtered": "100.00",
|
|
"cost_info": {
|
|
"read_cost": "0.25",
|
|
"eval_cost": "2.40",
|
|
"prefix_cost": "2.65",
|
|
"data_read_per_join": "384"
|
|
},
|
|
"used_columns": [
|
|
"t",
|
|
"p"
|
|
]
|
|
}
|
|
}
|
|
}
|
|
}
|
|
Warnings:
|
|
Note 1003 /* select#1 */ select `test`.`t_time2`.`p` AS `p`,`test`.`t_time2`.`t` AS `t`,first_value(`test`.`t_time2`.`t`) OVER `w` AS `FIRST_VALUE(t) OVER w` from `test`.`t_time2` window `w` AS (PARTITION BY `test`.`t_time2`.`p` ORDER BY `test`.`t_time2`.`t` ROWS BETWEEN 2 FOLLOWING AND 3 FOLLOWING)
|
|
EXPLAIN FORMAT=JSON SELECT p, t, FIRST_VALUE(t) OVER w FROM t_time2 WINDOW w AS (PARTITION by p ORDER BY t RANGE BETWEEN INTERVAL 2 HOUR FOLLOWING AND INTERVAL 3 HOUR FOLLOWING);
|
|
EXPLAIN
|
|
{
|
|
"query_block": {
|
|
"select_id": 1,
|
|
"cost_info": {
|
|
"query_cost": "26.65"
|
|
},
|
|
"windowing": {
|
|
"windows": [
|
|
{
|
|
"name": "w",
|
|
"using_filesort": true,
|
|
"filesort_key": [
|
|
"`p`",
|
|
"`t`"
|
|
],
|
|
"frame_buffer": {
|
|
"using_temporary_table": true,
|
|
"optimized_frame_evaluation": true
|
|
},
|
|
"functions": [
|
|
"first_value"
|
|
]
|
|
}
|
|
],
|
|
"cost_info": {
|
|
"sort_cost": "24.00"
|
|
},
|
|
"table": {
|
|
"table_name": "t_time2",
|
|
"access_type": "ALL",
|
|
"rows_examined_per_scan": 24,
|
|
"rows_produced_per_join": 24,
|
|
"filtered": "100.00",
|
|
"cost_info": {
|
|
"read_cost": "0.25",
|
|
"eval_cost": "2.40",
|
|
"prefix_cost": "2.65",
|
|
"data_read_per_join": "384"
|
|
},
|
|
"used_columns": [
|
|
"t",
|
|
"p"
|
|
]
|
|
}
|
|
}
|
|
}
|
|
}
|
|
Warnings:
|
|
Note 1003 /* select#1 */ select `test`.`t_time2`.`p` AS `p`,`test`.`t_time2`.`t` AS `t`,first_value(`test`.`t_time2`.`t`) OVER `w` AS `FIRST_VALUE(t) OVER w` from `test`.`t_time2` window `w` AS (PARTITION BY `test`.`t_time2`.`p` ORDER BY `test`.`t_time2`.`t` RANGE BETWEEN INTERVAL 2 hour FOLLOWING AND INTERVAL 3 hour FOLLOWING)
|
|
DROP TABLE t_time, t_time2;
|
|
----------------------------------------------------------------------
|
|
- Aggregates with RANGE frame specification
|
|
----------------------------------------------------------------------
|
|
EXPLAIN FORMAT=JSON SELECT * FROM t1;
|
|
EXPLAIN
|
|
{
|
|
"query_block": {
|
|
"select_id": 1,
|
|
"cost_info": {
|
|
"query_cost": "1.15"
|
|
},
|
|
"table": {
|
|
"table_name": "t1",
|
|
"access_type": "ALL",
|
|
"rows_examined_per_scan": 9,
|
|
"rows_produced_per_join": 9,
|
|
"filtered": "100.00",
|
|
"cost_info": {
|
|
"read_cost": "0.25",
|
|
"eval_cost": "0.90",
|
|
"prefix_cost": "1.15",
|
|
"data_read_per_join": "144"
|
|
},
|
|
"used_columns": [
|
|
"id",
|
|
"sex"
|
|
]
|
|
}
|
|
}
|
|
}
|
|
Warnings:
|
|
Note 1003 /* select#1 */ select `test`.`t1`.`id` AS `id`,`test`.`t1`.`sex` AS `sex` from `test`.`t1`
|
|
Make t11 a clone of t1 but with an extra partitioning column, but other values
|
|
repeated, so we can test it the same frames work on more than one partition
|
|
CREATE TABLE t11 (id INTEGER, sex CHAR(1), p INTEGER DEFAULT 1);
|
|
INSERT INTO t11(id, sex) SELECT * FROM t1;
|
|
UPDATE t11 SET p=p+1;
|
|
INSERT INTO t11(id, sex) SELECT * FROM t1;
|
|
ANALYZE TABLE t11;
|
|
Table Op Msg_type Msg_text
|
|
test.t11 analyze status OK
|
|
Make t22 a clone of t2 but with an extra partitioning column, but other values
|
|
repeated, so we can test it the same frames work on more than one partition
|
|
CREATE TABLE t22 (user_id INTEGER NOT NULL, date DATE, p INTEGER DEFAULT 1);
|
|
INSERT INTO t22(user_id, date) SELECT * FROM t2;
|
|
UPDATE t22 SET p=p+1;
|
|
INSERT INTO t22(user_id, date) SELECT * FROM t2;
|
|
ANALYZE TABLE t22;
|
|
Table Op Msg_type Msg_text
|
|
test.t22 analyze status OK
|
|
EXPLAIN FORMAT=JSON SELECT id, SUM(id) OVER (ORDER BY id RANGE 2 PRECEDING) FROM t1 ORDER BY id;
|
|
EXPLAIN
|
|
{
|
|
"query_block": {
|
|
"select_id": 1,
|
|
"cost_info": {
|
|
"query_cost": "19.15"
|
|
},
|
|
"ordering_operation": {
|
|
"using_filesort": true,
|
|
"cost_info": {
|
|
"sort_cost": "9.00"
|
|
},
|
|
"windowing": {
|
|
"windows": [
|
|
{
|
|
"name": "<unnamed window>",
|
|
"using_temporary_table": true,
|
|
"using_filesort": true,
|
|
"filesort_key": [
|
|
"`id`"
|
|
],
|
|
"frame_buffer": {
|
|
"using_temporary_table": true,
|
|
"optimized_frame_evaluation": true
|
|
},
|
|
"functions": [
|
|
"sum"
|
|
]
|
|
}
|
|
],
|
|
"cost_info": {
|
|
"sort_cost": "9.00"
|
|
},
|
|
"table": {
|
|
"table_name": "t1",
|
|
"access_type": "ALL",
|
|
"rows_examined_per_scan": 9,
|
|
"rows_produced_per_join": 9,
|
|
"filtered": "100.00",
|
|
"cost_info": {
|
|
"read_cost": "0.25",
|
|
"eval_cost": "0.90",
|
|
"prefix_cost": "1.15",
|
|
"data_read_per_join": "144"
|
|
},
|
|
"used_columns": [
|
|
"id"
|
|
]
|
|
}
|
|
}
|
|
}
|
|
}
|
|
}
|
|
Warnings:
|
|
Note 1003 /* select#1 */ select `test`.`t1`.`id` AS `id`,sum(`test`.`t1`.`id`) OVER (ORDER BY `test`.`t1`.`id` RANGE BETWEEN 2 PRECEDING AND CURRENT ROW) AS `SUM(id) OVER (ORDER BY id RANGE 2 PRECEDING)` from `test`.`t1` order by `test`.`t1`.`id`
|
|
EXPLAIN FORMAT=JSON SELECT id, SUM(id) OVER (ORDER BY id RANGE BETWEEN 1 PRECEDING AND 1 FOLLOWING) FROM t1 ORDER BY id;
|
|
EXPLAIN
|
|
{
|
|
"query_block": {
|
|
"select_id": 1,
|
|
"cost_info": {
|
|
"query_cost": "19.15"
|
|
},
|
|
"ordering_operation": {
|
|
"using_filesort": true,
|
|
"cost_info": {
|
|
"sort_cost": "9.00"
|
|
},
|
|
"windowing": {
|
|
"windows": [
|
|
{
|
|
"name": "<unnamed window>",
|
|
"using_temporary_table": true,
|
|
"using_filesort": true,
|
|
"filesort_key": [
|
|
"`id`"
|
|
],
|
|
"frame_buffer": {
|
|
"using_temporary_table": true,
|
|
"optimized_frame_evaluation": true
|
|
},
|
|
"functions": [
|
|
"sum"
|
|
]
|
|
}
|
|
],
|
|
"cost_info": {
|
|
"sort_cost": "9.00"
|
|
},
|
|
"table": {
|
|
"table_name": "t1",
|
|
"access_type": "ALL",
|
|
"rows_examined_per_scan": 9,
|
|
"rows_produced_per_join": 9,
|
|
"filtered": "100.00",
|
|
"cost_info": {
|
|
"read_cost": "0.25",
|
|
"eval_cost": "0.90",
|
|
"prefix_cost": "1.15",
|
|
"data_read_per_join": "144"
|
|
},
|
|
"used_columns": [
|
|
"id"
|
|
]
|
|
}
|
|
}
|
|
}
|
|
}
|
|
}
|
|
Warnings:
|
|
Note 1003 /* select#1 */ select `test`.`t1`.`id` AS `id`,sum(`test`.`t1`.`id`) OVER (ORDER BY `test`.`t1`.`id` RANGE BETWEEN 1 PRECEDING AND 1 FOLLOWING) AS `SUM(id) OVER (ORDER BY id RANGE BETWEEN 1 PRECEDING AND 1 FOLLOWING)` from `test`.`t1` order by `test`.`t1`.`id`
|
|
EXPLAIN FORMAT=JSON SELECT id, SUM(id) OVER (ORDER BY id RANGE UNBOUNDED PRECEDING) FROM t1 ORDER BY id;
|
|
EXPLAIN
|
|
{
|
|
"query_block": {
|
|
"select_id": 1,
|
|
"cost_info": {
|
|
"query_cost": "19.15"
|
|
},
|
|
"ordering_operation": {
|
|
"using_filesort": true,
|
|
"cost_info": {
|
|
"sort_cost": "9.00"
|
|
},
|
|
"windowing": {
|
|
"windows": [
|
|
{
|
|
"name": "<unnamed window>",
|
|
"using_temporary_table": true,
|
|
"using_filesort": true,
|
|
"filesort_key": [
|
|
"`id`"
|
|
],
|
|
"frame_buffer": {
|
|
"using_temporary_table": true,
|
|
"optimized_frame_evaluation": true
|
|
},
|
|
"functions": [
|
|
"sum"
|
|
]
|
|
}
|
|
],
|
|
"cost_info": {
|
|
"sort_cost": "9.00"
|
|
},
|
|
"table": {
|
|
"table_name": "t1",
|
|
"access_type": "ALL",
|
|
"rows_examined_per_scan": 9,
|
|
"rows_produced_per_join": 9,
|
|
"filtered": "100.00",
|
|
"cost_info": {
|
|
"read_cost": "0.25",
|
|
"eval_cost": "0.90",
|
|
"prefix_cost": "1.15",
|
|
"data_read_per_join": "144"
|
|
},
|
|
"used_columns": [
|
|
"id"
|
|
]
|
|
}
|
|
}
|
|
}
|
|
}
|
|
}
|
|
Warnings:
|
|
Note 1003 /* select#1 */ select `test`.`t1`.`id` AS `id`,sum(`test`.`t1`.`id`) OVER (ORDER BY `test`.`t1`.`id` RANGE BETWEEN UNBOUNDED PRECEDING AND CURRENT ROW) AS `SUM(id) OVER (ORDER BY id RANGE UNBOUNDED PRECEDING)` from `test`.`t1` order by `test`.`t1`.`id`
|
|
EXPLAIN FORMAT=JSON SELECT p, id, SUM(id) OVER (PARTITION BY p ORDER BY id RANGE 2 PRECEDING) FROM t11 ORDER BY p,id;
|
|
EXPLAIN
|
|
{
|
|
"query_block": {
|
|
"select_id": 1,
|
|
"cost_info": {
|
|
"query_cost": "38.05"
|
|
},
|
|
"ordering_operation": {
|
|
"using_filesort": true,
|
|
"cost_info": {
|
|
"sort_cost": "18.00"
|
|
},
|
|
"windowing": {
|
|
"windows": [
|
|
{
|
|
"name": "<unnamed window>",
|
|
"using_temporary_table": true,
|
|
"using_filesort": true,
|
|
"filesort_key": [
|
|
"`p`",
|
|
"`id`"
|
|
],
|
|
"frame_buffer": {
|
|
"using_temporary_table": true,
|
|
"optimized_frame_evaluation": true
|
|
},
|
|
"functions": [
|
|
"sum"
|
|
]
|
|
}
|
|
],
|
|
"cost_info": {
|
|
"sort_cost": "18.00"
|
|
},
|
|
"table": {
|
|
"table_name": "t11",
|
|
"access_type": "ALL",
|
|
"rows_examined_per_scan": 18,
|
|
"rows_produced_per_join": 18,
|
|
"filtered": "100.00",
|
|
"cost_info": {
|
|
"read_cost": "0.25",
|
|
"eval_cost": "1.80",
|
|
"prefix_cost": "2.05",
|
|
"data_read_per_join": "288"
|
|
},
|
|
"used_columns": [
|
|
"id",
|
|
"p"
|
|
]
|
|
}
|
|
}
|
|
}
|
|
}
|
|
}
|
|
Warnings:
|
|
Note 1003 /* select#1 */ select `test`.`t11`.`p` AS `p`,`test`.`t11`.`id` AS `id`,sum(`test`.`t11`.`id`) OVER (PARTITION BY `test`.`t11`.`p` ORDER BY `test`.`t11`.`id` RANGE BETWEEN 2 PRECEDING AND CURRENT ROW) AS `SUM(id) OVER (PARTITION BY p ORDER BY id RANGE 2 PRECEDING)` from `test`.`t11` order by `test`.`t11`.`p`,`test`.`t11`.`id`
|
|
EXPLAIN FORMAT=JSON SELECT p, id, SUM(id) OVER (PARTITION BY p ORDER BY id RANGE BETWEEN 1 PRECEDING AND 1 FOLLOWING) FROM t11 ORDER BY p,id;
|
|
EXPLAIN
|
|
{
|
|
"query_block": {
|
|
"select_id": 1,
|
|
"cost_info": {
|
|
"query_cost": "38.05"
|
|
},
|
|
"ordering_operation": {
|
|
"using_filesort": true,
|
|
"cost_info": {
|
|
"sort_cost": "18.00"
|
|
},
|
|
"windowing": {
|
|
"windows": [
|
|
{
|
|
"name": "<unnamed window>",
|
|
"using_temporary_table": true,
|
|
"using_filesort": true,
|
|
"filesort_key": [
|
|
"`p`",
|
|
"`id`"
|
|
],
|
|
"frame_buffer": {
|
|
"using_temporary_table": true,
|
|
"optimized_frame_evaluation": true
|
|
},
|
|
"functions": [
|
|
"sum"
|
|
]
|
|
}
|
|
],
|
|
"cost_info": {
|
|
"sort_cost": "18.00"
|
|
},
|
|
"table": {
|
|
"table_name": "t11",
|
|
"access_type": "ALL",
|
|
"rows_examined_per_scan": 18,
|
|
"rows_produced_per_join": 18,
|
|
"filtered": "100.00",
|
|
"cost_info": {
|
|
"read_cost": "0.25",
|
|
"eval_cost": "1.80",
|
|
"prefix_cost": "2.05",
|
|
"data_read_per_join": "288"
|
|
},
|
|
"used_columns": [
|
|
"id",
|
|
"p"
|
|
]
|
|
}
|
|
}
|
|
}
|
|
}
|
|
}
|
|
Warnings:
|
|
Note 1003 /* select#1 */ select `test`.`t11`.`p` AS `p`,`test`.`t11`.`id` AS `id`,sum(`test`.`t11`.`id`) OVER (PARTITION BY `test`.`t11`.`p` ORDER BY `test`.`t11`.`id` RANGE BETWEEN 1 PRECEDING AND 1 FOLLOWING) AS `SUM(id) OVER (PARTITION BY p ORDER BY id RANGE BETWEEN 1 PRECEDING AND 1 FOLLOWING)` from `test`.`t11` order by `test`.`t11`.`p`,`test`.`t11`.`id`
|
|
EXPLAIN FORMAT=JSON SELECT p, id, SUM(id) OVER (PARTITION BY p ORDER BY id RANGE UNBOUNDED PRECEDING) FROM t11 ORDER BY p,id;
|
|
EXPLAIN
|
|
{
|
|
"query_block": {
|
|
"select_id": 1,
|
|
"cost_info": {
|
|
"query_cost": "38.05"
|
|
},
|
|
"ordering_operation": {
|
|
"using_filesort": true,
|
|
"cost_info": {
|
|
"sort_cost": "18.00"
|
|
},
|
|
"windowing": {
|
|
"windows": [
|
|
{
|
|
"name": "<unnamed window>",
|
|
"using_temporary_table": true,
|
|
"using_filesort": true,
|
|
"filesort_key": [
|
|
"`p`",
|
|
"`id`"
|
|
],
|
|
"frame_buffer": {
|
|
"using_temporary_table": true,
|
|
"optimized_frame_evaluation": true
|
|
},
|
|
"functions": [
|
|
"sum"
|
|
]
|
|
}
|
|
],
|
|
"cost_info": {
|
|
"sort_cost": "18.00"
|
|
},
|
|
"table": {
|
|
"table_name": "t11",
|
|
"access_type": "ALL",
|
|
"rows_examined_per_scan": 18,
|
|
"rows_produced_per_join": 18,
|
|
"filtered": "100.00",
|
|
"cost_info": {
|
|
"read_cost": "0.25",
|
|
"eval_cost": "1.80",
|
|
"prefix_cost": "2.05",
|
|
"data_read_per_join": "288"
|
|
},
|
|
"used_columns": [
|
|
"id",
|
|
"p"
|
|
]
|
|
}
|
|
}
|
|
}
|
|
}
|
|
}
|
|
Warnings:
|
|
Note 1003 /* select#1 */ select `test`.`t11`.`p` AS `p`,`test`.`t11`.`id` AS `id`,sum(`test`.`t11`.`id`) OVER (PARTITION BY `test`.`t11`.`p` ORDER BY `test`.`t11`.`id` RANGE BETWEEN UNBOUNDED PRECEDING AND CURRENT ROW) AS `SUM(id) OVER (PARTITION BY p ORDER BY id RANGE UNBOUNDED PRECEDING)` from `test`.`t11` order by `test`.`t11`.`p`,`test`.`t11`.`id`
|
|
Implicit frame due to ORDER BY, with last in peer group as upper bound
|
|
EXPLAIN FORMAT=JSON SELECT user_id, SUM(user_id) OVER w, AVG(user_id) OVER w FROM t2 WINDOW w AS (ORDER BY user_id);
|
|
EXPLAIN
|
|
{
|
|
"query_block": {
|
|
"select_id": 1,
|
|
"cost_info": {
|
|
"query_cost": "7.95"
|
|
},
|
|
"windowing": {
|
|
"windows": [
|
|
{
|
|
"name": "w",
|
|
"using_filesort": true,
|
|
"filesort_key": [
|
|
"`user_id`"
|
|
],
|
|
"frame_buffer": {
|
|
"using_temporary_table": true,
|
|
"optimized_frame_evaluation": true
|
|
},
|
|
"functions": [
|
|
"sum",
|
|
"avg"
|
|
]
|
|
}
|
|
],
|
|
"cost_info": {
|
|
"sort_cost": "7.00"
|
|
},
|
|
"table": {
|
|
"table_name": "t2",
|
|
"access_type": "ALL",
|
|
"rows_examined_per_scan": 7,
|
|
"rows_produced_per_join": 7,
|
|
"filtered": "100.00",
|
|
"cost_info": {
|
|
"read_cost": "0.25",
|
|
"eval_cost": "0.70",
|
|
"prefix_cost": "0.95",
|
|
"data_read_per_join": "112"
|
|
},
|
|
"used_columns": [
|
|
"user_id"
|
|
]
|
|
}
|
|
}
|
|
}
|
|
}
|
|
Warnings:
|
|
Note 1003 /* select#1 */ select `test`.`t2`.`user_id` AS `user_id`,sum(`test`.`t2`.`user_id`) OVER `w` AS `SUM(user_id) OVER w`,avg(`test`.`t2`.`user_id`) OVER `w` AS `AVG(user_id) OVER w` from `test`.`t2` window `w` AS (ORDER BY `test`.`t2`.`user_id` )
|
|
EXPLAIN FORMAT=JSON SELECT p, user_id, SUM(user_id) OVER w, AVG(user_id) OVER w FROM t22 WINDOW w AS (PARTITION BY p ORDER BY user_id) ORDER BY p;
|
|
EXPLAIN
|
|
"`p`",
|
|
"`user_id`"
|
|
"avg"
|
|
"optimized_frame_evaluation": true
|
|
"sum",
|
|
"using_temporary_table": true,
|
|
"data_read_per_join": "224"
|
|
"eval_cost": "1.40",
|
|
"filesort_key": [
|
|
"frame_buffer": {
|
|
"functions": [
|
|
"name": "w",
|
|
"p"
|
|
"prefix_cost": "1.65",
|
|
"read_cost": "0.25",
|
|
"user_id",
|
|
"using_filesort": true,
|
|
"using_temporary_table": true,
|
|
]
|
|
],
|
|
},
|
|
"access_type": "ALL",
|
|
"cost_info": {
|
|
"filtered": "100.00",
|
|
"rows_examined_per_scan": 14,
|
|
"rows_produced_per_join": 14,
|
|
"sort_cost": "14.00"
|
|
"table_name": "t22",
|
|
"used_columns": [
|
|
]
|
|
{
|
|
}
|
|
},
|
|
"cost_info": {
|
|
"sort_cost": "14.00"
|
|
"table": {
|
|
"windows": [
|
|
],
|
|
}
|
|
},
|
|
"cost_info": {
|
|
"query_cost": "29.65"
|
|
"using_filesort": true,
|
|
"windowing": {
|
|
}
|
|
},
|
|
"cost_info": {
|
|
"ordering_operation": {
|
|
"select_id": 1,
|
|
}
|
|
},
|
|
"query_block": {
|
|
}
|
|
Note 1003 /* select#1 */ select `test`.`t22`.`p` AS `p`,`test`.`t22`.`user_id` AS `user_id`,sum(`test`.`t22`.`user_id`) OVER `w` AS `SUM(user_id) OVER w`,avg(`test`.`t22`.`user_id`) OVER `w` AS `AVG(user_id) OVER w` from `test`.`t22` window `w` AS (PARTITION BY `test`.`t22`.`p` ORDER BY `test`.`t22`.`user_id` ) order by `test`.`t22`.`p`
|
|
Warnings:
|
|
{
|
|
}
|
|
Window function use of same field in different windows, both of which
|
|
need buffering. In this case we need subsequent rewrites of arg fields
|
|
Field pointer in tmp files for window 2..n The intervening internal
|
|
window buffering in each step used to mess that up.
|
|
EXPLAIN FORMAT=JSON SELECT user_id, SUM(user_id) OVER w, AVG(user_id) OVER w1 FROM t2
|
|
WINDOW w AS (ORDER BY user_id), w1 AS (ORDER BY user_id);
|
|
EXPLAIN
|
|
{
|
|
"query_block": {
|
|
"select_id": 1,
|
|
"cost_info": {
|
|
"query_cost": "7.95"
|
|
},
|
|
"windowing": {
|
|
"windows": [
|
|
{
|
|
"name": "w",
|
|
"definition_position": 1,
|
|
"using_temporary_table": true,
|
|
"using_filesort": true,
|
|
"filesort_key": [
|
|
"`user_id`"
|
|
],
|
|
"frame_buffer": {
|
|
"using_temporary_table": true,
|
|
"optimized_frame_evaluation": true
|
|
},
|
|
"functions": [
|
|
"sum"
|
|
]
|
|
},
|
|
{
|
|
"name": "w1",
|
|
"definition_position": 2,
|
|
"last_executed_window": true,
|
|
"frame_buffer": {
|
|
"using_temporary_table": true,
|
|
"optimized_frame_evaluation": true
|
|
},
|
|
"functions": [
|
|
"avg"
|
|
]
|
|
}
|
|
],
|
|
"cost_info": {
|
|
"sort_cost": "7.00"
|
|
},
|
|
"table": {
|
|
"table_name": "t2",
|
|
"access_type": "ALL",
|
|
"rows_examined_per_scan": 7,
|
|
"rows_produced_per_join": 7,
|
|
"filtered": "100.00",
|
|
"cost_info": {
|
|
"read_cost": "0.25",
|
|
"eval_cost": "0.70",
|
|
"prefix_cost": "0.95",
|
|
"data_read_per_join": "112"
|
|
},
|
|
"used_columns": [
|
|
"user_id"
|
|
]
|
|
}
|
|
}
|
|
}
|
|
}
|
|
Warnings:
|
|
Note 1003 /* select#1 */ select `test`.`t2`.`user_id` AS `user_id`,sum(`test`.`t2`.`user_id`) OVER `w` AS `SUM(user_id) OVER w`,avg(`test`.`t2`.`user_id`) OVER `w1` AS `AVG(user_id) OVER w1` from `test`.`t2` window `w` AS (ORDER BY `test`.`t2`.`user_id` ) , `w1` AS (ORDER BY `test`.`t2`.`user_id` )
|
|
Check descending order by with RANGE: 2 PRECEDING in this case means larger than
|
|
current row.
|
|
EXPLAIN FORMAT=JSON SELECT NTILE(5) OVER w, ROW_NUMBER() OVER w, id, SUM(id) OVER w FROM t1
|
|
WINDOW w AS (ORDER BY id DESC RANGE 2 PRECEDING);
|
|
EXPLAIN
|
|
{
|
|
"query_block": {
|
|
"select_id": 1,
|
|
"cost_info": {
|
|
"query_cost": "10.15"
|
|
},
|
|
"windowing": {
|
|
"windows": [
|
|
{
|
|
"name": "w",
|
|
"using_filesort": true,
|
|
"filesort_key": [
|
|
"`id` desc"
|
|
],
|
|
"frame_buffer": {
|
|
"using_temporary_table": true,
|
|
"optimized_frame_evaluation": true
|
|
},
|
|
"functions": [
|
|
"ntile",
|
|
"row_number",
|
|
"sum"
|
|
]
|
|
}
|
|
],
|
|
"cost_info": {
|
|
"sort_cost": "9.00"
|
|
},
|
|
"table": {
|
|
"table_name": "t1",
|
|
"access_type": "ALL",
|
|
"rows_examined_per_scan": 9,
|
|
"rows_produced_per_join": 9,
|
|
"filtered": "100.00",
|
|
"cost_info": {
|
|
"read_cost": "0.25",
|
|
"eval_cost": "0.90",
|
|
"prefix_cost": "1.15",
|
|
"data_read_per_join": "144"
|
|
},
|
|
"used_columns": [
|
|
"id"
|
|
]
|
|
}
|
|
}
|
|
}
|
|
}
|
|
Warnings:
|
|
Note 3599 Window function 'ntile' ignores the frame clause of window 'w' and aggregates over the whole partition
|
|
Note 3599 Window function 'row_number' ignores the frame clause of window 'w' and aggregates over the whole partition
|
|
Note 1003 /* select#1 */ select ntile(5) OVER `w` AS `NTILE(5) OVER w`,row_number() OVER `w` AS `ROW_NUMBER() OVER w`,`test`.`t1`.`id` AS `id`,sum(`test`.`t1`.`id`) OVER `w` AS `SUM(id) OVER w` from `test`.`t1` window `w` AS (ORDER BY `test`.`t1`.`id` desc RANGE BETWEEN 2 PRECEDING AND CURRENT ROW)
|
|
EXPLAIN FORMAT=JSON SELECT p, NTILE(5) OVER w, ROW_NUMBER() OVER w, id, SUM(id) OVER w FROM t11
|
|
WINDOW w AS (PARTITION BY p ORDER BY id DESC RANGE 2 PRECEDING);
|
|
EXPLAIN
|
|
{
|
|
"query_block": {
|
|
"select_id": 1,
|
|
"cost_info": {
|
|
"query_cost": "20.05"
|
|
},
|
|
"windowing": {
|
|
"windows": [
|
|
{
|
|
"name": "w",
|
|
"using_filesort": true,
|
|
"filesort_key": [
|
|
"`p`",
|
|
"`id` desc"
|
|
],
|
|
"frame_buffer": {
|
|
"using_temporary_table": true,
|
|
"optimized_frame_evaluation": true
|
|
},
|
|
"functions": [
|
|
"ntile",
|
|
"row_number",
|
|
"sum"
|
|
]
|
|
}
|
|
],
|
|
"cost_info": {
|
|
"sort_cost": "18.00"
|
|
},
|
|
"table": {
|
|
"table_name": "t11",
|
|
"access_type": "ALL",
|
|
"rows_examined_per_scan": 18,
|
|
"rows_produced_per_join": 18,
|
|
"filtered": "100.00",
|
|
"cost_info": {
|
|
"read_cost": "0.25",
|
|
"eval_cost": "1.80",
|
|
"prefix_cost": "2.05",
|
|
"data_read_per_join": "288"
|
|
},
|
|
"used_columns": [
|
|
"id",
|
|
"p"
|
|
]
|
|
}
|
|
}
|
|
}
|
|
}
|
|
Warnings:
|
|
Note 3599 Window function 'ntile' ignores the frame clause of window 'w' and aggregates over the whole partition
|
|
Note 3599 Window function 'row_number' ignores the frame clause of window 'w' and aggregates over the whole partition
|
|
Note 1003 /* select#1 */ select `test`.`t11`.`p` AS `p`,ntile(5) OVER `w` AS `NTILE(5) OVER w`,row_number() OVER `w` AS `ROW_NUMBER() OVER w`,`test`.`t11`.`id` AS `id`,sum(`test`.`t11`.`id`) OVER `w` AS `SUM(id) OVER w` from `test`.`t11` window `w` AS (PARTITION BY `test`.`t11`.`p` ORDER BY `test`.`t11`.`id` desc RANGE BETWEEN 2 PRECEDING AND CURRENT ROW)
|
|
update t2 set date=date + user_id;
|
|
EXPLAIN FORMAT=JSON SELECT user_id, date, COUNT(*) OVER (ORDER BY date RANGE INTERVAL 1 DAY PRECEDING) FROM t2;
|
|
EXPLAIN
|
|
{
|
|
"query_block": {
|
|
"select_id": 1,
|
|
"cost_info": {
|
|
"query_cost": "7.95"
|
|
},
|
|
"windowing": {
|
|
"windows": [
|
|
{
|
|
"name": "<unnamed window>",
|
|
"using_filesort": true,
|
|
"filesort_key": [
|
|
"`date`"
|
|
],
|
|
"frame_buffer": {
|
|
"using_temporary_table": true,
|
|
"optimized_frame_evaluation": true
|
|
},
|
|
"functions": [
|
|
"count"
|
|
]
|
|
}
|
|
],
|
|
"cost_info": {
|
|
"sort_cost": "7.00"
|
|
},
|
|
"table": {
|
|
"table_name": "t2",
|
|
"access_type": "ALL",
|
|
"rows_examined_per_scan": 7,
|
|
"rows_produced_per_join": 7,
|
|
"filtered": "100.00",
|
|
"cost_info": {
|
|
"read_cost": "0.25",
|
|
"eval_cost": "0.70",
|
|
"prefix_cost": "0.95",
|
|
"data_read_per_join": "112"
|
|
},
|
|
"used_columns": [
|
|
"user_id",
|
|
"date"
|
|
]
|
|
}
|
|
}
|
|
}
|
|
}
|
|
Warnings:
|
|
Note 1003 /* select#1 */ select `test`.`t2`.`user_id` AS `user_id`,`test`.`t2`.`date` AS `date`,count(0) OVER (ORDER BY `test`.`t2`.`date` RANGE BETWEEN INTERVAL 1 day PRECEDING AND CURRENT ROW) AS `COUNT(*) OVER (ORDER BY date RANGE INTERVAL 1 DAY PRECEDING)` from `test`.`t2`
|
|
CREATE TABLE t3(d DOUBLE);
|
|
INSERT INTO t3
|
|
VALUES (1.1),(1.9),(4.0),(8.3),(16.0),(24.0),(20.1),(22.0),(23.0);
|
|
ANALYZE TABLE t3;
|
|
Table Op Msg_type Msg_text
|
|
test.t3 analyze status OK
|
|
EXPLAIN FORMAT=JSON SELECT d, SUM(d) OVER w, COUNT(*) OVER w FROM t3 WINDOW w AS (ORDER BY d RANGE BETWEEN 2.1 PRECEDING AND 1.1 FOLLOWING);
|
|
EXPLAIN
|
|
{
|
|
"query_block": {
|
|
"select_id": 1,
|
|
"cost_info": {
|
|
"query_cost": "10.15"
|
|
},
|
|
"windowing": {
|
|
"windows": [
|
|
{
|
|
"name": "w",
|
|
"using_filesort": true,
|
|
"filesort_key": [
|
|
"`d`"
|
|
],
|
|
"frame_buffer": {
|
|
"using_temporary_table": true
|
|
},
|
|
"functions": [
|
|
"sum",
|
|
"count"
|
|
]
|
|
}
|
|
],
|
|
"cost_info": {
|
|
"sort_cost": "9.00"
|
|
},
|
|
"table": {
|
|
"table_name": "t3",
|
|
"access_type": "ALL",
|
|
"rows_examined_per_scan": 9,
|
|
"rows_produced_per_join": 9,
|
|
"filtered": "100.00",
|
|
"cost_info": {
|
|
"read_cost": "0.25",
|
|
"eval_cost": "0.90",
|
|
"prefix_cost": "1.15",
|
|
"data_read_per_join": "144"
|
|
},
|
|
"used_columns": [
|
|
"d"
|
|
]
|
|
}
|
|
}
|
|
}
|
|
}
|
|
Warnings:
|
|
Note 1003 /* select#1 */ select `test`.`t3`.`d` AS `d`,sum(`test`.`t3`.`d`) OVER `w` AS `SUM(d) OVER w`,count(0) OVER `w` AS `COUNT(*) OVER w` from `test`.`t3` window `w` AS (ORDER BY `test`.`t3`.`d` RANGE BETWEEN 2.1 PRECEDING AND 1.1 FOLLOWING)
|
|
----------------------------------------------------------------------
|
|
- wf over JSON
|
|
----------------------------------------------------------------------
|
|
CREATE TABLE tj(j JSON, i INT DEFAULT 7);
|
|
INSERT INTO tj(j) VALUES ('1'), ('2'), ('3'), ('4'), ('5'), (NULL);
|
|
INSERT INTO tj(j) VALUES ('3.14');
|
|
INSERT INTO tj(j) VALUES ('[1,2,3]');
|
|
ANALYZE TABLE tj;
|
|
Table Op Msg_type Msg_text
|
|
test.tj analyze status OK
|
|
EXPLAIN FORMAT=JSON SELECT CAST(SUM(j) OVER () AS JSON) FROM tj;
|
|
EXPLAIN
|
|
{
|
|
"query_block": {
|
|
"select_id": 1,
|
|
"cost_info": {
|
|
"query_cost": "1.05"
|
|
},
|
|
"windowing": {
|
|
"windows": [
|
|
{
|
|
"name": "<unnamed window>",
|
|
"frame_buffer": {
|
|
"using_temporary_table": true,
|
|
"optimized_frame_evaluation": true
|
|
},
|
|
"functions": [
|
|
"sum"
|
|
]
|
|
}
|
|
],
|
|
"table": {
|
|
"table_name": "tj",
|
|
"access_type": "ALL",
|
|
"rows_examined_per_scan": 8,
|
|
"rows_produced_per_join": 8,
|
|
"filtered": "100.00",
|
|
"cost_info": {
|
|
"read_cost": "0.25",
|
|
"eval_cost": "0.80",
|
|
"prefix_cost": "1.05",
|
|
"data_read_per_join": "192"
|
|
},
|
|
"used_columns": [
|
|
"j"
|
|
]
|
|
}
|
|
}
|
|
}
|
|
}
|
|
Warnings:
|
|
Note 1003 /* select#1 */ select cast(sum(`test`.`tj`.`j`) OVER () as json) AS `CAST(SUM(j) OVER () AS JSON)` from `test`.`tj`
|
|
----------------------------------------------------------------------
|
|
- SELECT DISTINCT
|
|
----------------------------------------------------------------------
|
|
One window
|
|
EXPLAIN FORMAT=JSON SELECT DISTINCT i,COUNT(*) OVER () FROM tj;
|
|
EXPLAIN
|
|
{
|
|
"query_block": {
|
|
"select_id": 1,
|
|
"cost_info": {
|
|
"query_cost": "1.05"
|
|
},
|
|
"duplicates_removal": {
|
|
"using_filesort": false,
|
|
"windowing": {
|
|
"windows": [
|
|
{
|
|
"name": "<unnamed window>",
|
|
"using_temporary_table": true,
|
|
"frame_buffer": {
|
|
"using_temporary_table": true,
|
|
"optimized_frame_evaluation": true
|
|
},
|
|
"functions": [
|
|
"count"
|
|
]
|
|
}
|
|
],
|
|
"table": {
|
|
"table_name": "tj",
|
|
"access_type": "ALL",
|
|
"rows_examined_per_scan": 8,
|
|
"rows_produced_per_join": 8,
|
|
"filtered": "100.00",
|
|
"cost_info": {
|
|
"read_cost": "0.25",
|
|
"eval_cost": "0.80",
|
|
"prefix_cost": "1.05",
|
|
"data_read_per_join": "192"
|
|
},
|
|
"used_columns": [
|
|
"i"
|
|
]
|
|
}
|
|
}
|
|
}
|
|
}
|
|
}
|
|
Warnings:
|
|
Note 1003 /* select#1 */ select distinct `test`.`tj`.`i` AS `i`,count(0) OVER () AS `COUNT(*) OVER ()` from `test`.`tj`
|
|
Several windows with final ORDER BY also
|
|
EXPLAIN FORMAT=JSON SELECT DISTINCT i,NTILE(3) OVER (ORDER BY i), SUM(i) OVER (), COUNT(*) OVER () FROM tj ORDER BY NTILE(3) OVER (ORDER BY i);
|
|
EXPLAIN
|
|
{
|
|
"query_block": {
|
|
"select_id": 1,
|
|
"cost_info": {
|
|
"query_cost": "17.05"
|
|
},
|
|
"ordering_operation": {
|
|
"using_filesort": true,
|
|
"duplicates_removal": {
|
|
"using_filesort": false,
|
|
"cost_info": {
|
|
"sort_cost": "8.00"
|
|
},
|
|
"windowing": {
|
|
"windows": [
|
|
{
|
|
"name": "<unnamed window>",
|
|
"definition_position": 1,
|
|
"using_temporary_table": true,
|
|
"using_filesort": true,
|
|
"filesort_key": [
|
|
"`i`"
|
|
],
|
|
"frame_buffer": {
|
|
"using_temporary_table": true,
|
|
"optimized_frame_evaluation": true
|
|
},
|
|
"functions": [
|
|
"ntile"
|
|
]
|
|
},
|
|
{
|
|
"name": "<unnamed window>",
|
|
"definition_position": 4,
|
|
"using_temporary_table": true,
|
|
"frame_buffer": {
|
|
"using_temporary_table": true,
|
|
"optimized_frame_evaluation": true
|
|
},
|
|
"functions": [
|
|
"ntile"
|
|
]
|
|
},
|
|
{
|
|
"name": "<unnamed window>",
|
|
"definition_position": 3,
|
|
"using_temporary_table": true,
|
|
"frame_buffer": {
|
|
"using_temporary_table": true,
|
|
"optimized_frame_evaluation": true
|
|
},
|
|
"functions": [
|
|
"count"
|
|
]
|
|
},
|
|
{
|
|
"name": "<unnamed window>",
|
|
"definition_position": 2,
|
|
"last_executed_window": true,
|
|
"using_temporary_table": true,
|
|
"frame_buffer": {
|
|
"using_temporary_table": true,
|
|
"optimized_frame_evaluation": true
|
|
},
|
|
"functions": [
|
|
"sum"
|
|
]
|
|
}
|
|
],
|
|
"cost_info": {
|
|
"sort_cost": "8.00"
|
|
},
|
|
"table": {
|
|
"table_name": "tj",
|
|
"access_type": "ALL",
|
|
"rows_examined_per_scan": 8,
|
|
"rows_produced_per_join": 8,
|
|
"filtered": "100.00",
|
|
"cost_info": {
|
|
"read_cost": "0.25",
|
|
"eval_cost": "0.80",
|
|
"prefix_cost": "1.05",
|
|
"data_read_per_join": "192"
|
|
},
|
|
"used_columns": [
|
|
"i"
|
|
]
|
|
}
|
|
}
|
|
}
|
|
}
|
|
}
|
|
}
|
|
Warnings:
|
|
Note 1003 /* select#1 */ select distinct `test`.`tj`.`i` AS `i`,ntile(3) OVER (ORDER BY `test`.`tj`.`i` ) AS `NTILE(3) OVER (ORDER BY i)`,sum(`test`.`tj`.`i`) OVER () AS `SUM(i) OVER ()`,count(0) OVER () AS `COUNT(*) OVER ()` from `test`.`tj` order by ntile(3) OVER (ORDER BY `test`.`tj`.`i` )
|
|
UPDATE tj SET i=i+CASE WHEN JSON_TYPE(j) = 'ARRAY' THEN 1 ELSE j END;
|
|
UPDATE tj SET i=7 where i=8 AND JSON_TYPE(j) != 'ARRAY';
|
|
CREATE TABLE tj2 AS SELECT * FROM tj;
|
|
UPDATE tj2 SET i=MOD(i,3);
|
|
EXPLAIN FORMAT=JSON SELECT * FROM tj2;
|
|
EXPLAIN
|
|
{
|
|
"query_block": {
|
|
"select_id": 1,
|
|
"cost_info": {
|
|
"query_cost": "1.05"
|
|
},
|
|
"table": {
|
|
"table_name": "tj2",
|
|
"access_type": "ALL",
|
|
"rows_examined_per_scan": 8,
|
|
"rows_produced_per_join": 8,
|
|
"filtered": "100.00",
|
|
"cost_info": {
|
|
"read_cost": "0.25",
|
|
"eval_cost": "0.80",
|
|
"prefix_cost": "1.05",
|
|
"data_read_per_join": "192"
|
|
},
|
|
"used_columns": [
|
|
"j",
|
|
"i"
|
|
]
|
|
}
|
|
}
|
|
}
|
|
Warnings:
|
|
Note 1003 /* select#1 */ select `test`.`tj2`.`j` AS `j`,`test`.`tj2`.`i` AS `i` from `test`.`tj2`
|
|
With GROUP BY
|
|
EXPLAIN FORMAT=JSON SELECT COUNT(*) OVER (), MOD(SUM(i),2) FROM tj2 GROUP BY i;
|
|
EXPLAIN
|
|
{
|
|
"query_block": {
|
|
"select_id": 1,
|
|
"cost_info": {
|
|
"query_cost": "1.05"
|
|
},
|
|
"windowing": {
|
|
"windows": [
|
|
{
|
|
"name": "<unnamed window>",
|
|
"frame_buffer": {
|
|
"using_temporary_table": true,
|
|
"optimized_frame_evaluation": true
|
|
},
|
|
"functions": [
|
|
"count"
|
|
]
|
|
}
|
|
],
|
|
"grouping_operation": {
|
|
"using_temporary_table": true,
|
|
"using_filesort": false,
|
|
"table": {
|
|
"table_name": "tj2",
|
|
"access_type": "ALL",
|
|
"rows_examined_per_scan": 8,
|
|
"rows_produced_per_join": 8,
|
|
"filtered": "100.00",
|
|
"cost_info": {
|
|
"read_cost": "0.25",
|
|
"eval_cost": "0.80",
|
|
"prefix_cost": "1.05",
|
|
"data_read_per_join": "192"
|
|
},
|
|
"used_columns": [
|
|
"i"
|
|
]
|
|
}
|
|
}
|
|
}
|
|
}
|
|
}
|
|
Warnings:
|
|
Note 1003 /* select#1 */ select count(0) OVER () AS `COUNT(*) OVER ()`,(sum(`test`.`tj2`.`i`) % 2) AS `MOD(SUM(i),2)` from `test`.`tj2` group by `test`.`tj2`.`i`
|
|
EXPLAIN FORMAT=JSON SELECT DISTINCT COUNT(*) OVER (), MOD(SUM(i),2) FROM tj2 GROUP BY i;
|
|
EXPLAIN
|
|
{
|
|
"query_block": {
|
|
"select_id": 1,
|
|
"cost_info": {
|
|
"query_cost": "1.05"
|
|
},
|
|
"duplicates_removal": {
|
|
"using_temporary_table": true,
|
|
"using_filesort": false,
|
|
"windowing": {
|
|
"windows": [
|
|
{
|
|
"name": "<unnamed window>",
|
|
"using_temporary_table": true,
|
|
"frame_buffer": {
|
|
"using_temporary_table": true,
|
|
"optimized_frame_evaluation": true
|
|
},
|
|
"functions": [
|
|
"count"
|
|
]
|
|
}
|
|
],
|
|
"grouping_operation": {
|
|
"using_temporary_table": true,
|
|
"using_filesort": false,
|
|
"table": {
|
|
"table_name": "tj2",
|
|
"access_type": "ALL",
|
|
"rows_examined_per_scan": 8,
|
|
"rows_produced_per_join": 8,
|
|
"filtered": "100.00",
|
|
"cost_info": {
|
|
"read_cost": "0.25",
|
|
"eval_cost": "0.80",
|
|
"prefix_cost": "1.05",
|
|
"data_read_per_join": "192"
|
|
},
|
|
"used_columns": [
|
|
"i"
|
|
]
|
|
}
|
|
}
|
|
}
|
|
}
|
|
}
|
|
}
|
|
Warnings:
|
|
Note 1003 /* select#1 */ select distinct count(0) OVER () AS `COUNT(*) OVER ()`,(sum(`test`.`tj2`.`i`) % 2) AS `MOD(SUM(i),2)` from `test`.`tj2` group by `test`.`tj2`.`i`
|
|
Bug fix GROUP BY with window function referring column used in grouping expression
|
|
EXPLAIN FORMAT=JSON SELECT i, SUM(i) OVER (), MOD(SUM(i),2) FROM tj2 GROUP BY i;
|
|
EXPLAIN
|
|
{
|
|
"query_block": {
|
|
"select_id": 1,
|
|
"cost_info": {
|
|
"query_cost": "1.05"
|
|
},
|
|
"windowing": {
|
|
"windows": [
|
|
{
|
|
"name": "<unnamed window>",
|
|
"frame_buffer": {
|
|
"using_temporary_table": true,
|
|
"optimized_frame_evaluation": true
|
|
},
|
|
"functions": [
|
|
"sum"
|
|
]
|
|
}
|
|
],
|
|
"grouping_operation": {
|
|
"using_temporary_table": true,
|
|
"using_filesort": false,
|
|
"table": {
|
|
"table_name": "tj2",
|
|
"access_type": "ALL",
|
|
"rows_examined_per_scan": 8,
|
|
"rows_produced_per_join": 8,
|
|
"filtered": "100.00",
|
|
"cost_info": {
|
|
"read_cost": "0.25",
|
|
"eval_cost": "0.80",
|
|
"prefix_cost": "1.05",
|
|
"data_read_per_join": "192"
|
|
},
|
|
"used_columns": [
|
|
"i"
|
|
]
|
|
}
|
|
}
|
|
}
|
|
}
|
|
}
|
|
Warnings:
|
|
Note 1003 /* select#1 */ select `test`.`tj2`.`i` AS `i`,sum(`test`.`tj2`.`i`) OVER () AS `SUM(i) OVER ()`,(sum(`test`.`tj2`.`i`) % 2) AS `MOD(SUM(i),2)` from `test`.`tj2` group by `test`.`tj2`.`i`
|
|
EXPLAIN FORMAT=JSON SELECT i, SUM(SUM(i)) OVER (), SUM(i) OVER (ORDER BY i), MOD(SUM(i),2), SUM(i) FROM tj2 GROUP BY i;
|
|
EXPLAIN
|
|
{
|
|
"query_block": {
|
|
"select_id": 1,
|
|
"cost_info": {
|
|
"query_cost": "9.05"
|
|
},
|
|
"windowing": {
|
|
"windows": [
|
|
{
|
|
"name": "<unnamed window>",
|
|
"definition_position": 1,
|
|
"using_temporary_table": true,
|
|
"frame_buffer": {
|
|
"using_temporary_table": true,
|
|
"optimized_frame_evaluation": true
|
|
},
|
|
"functions": [
|
|
"sum"
|
|
]
|
|
},
|
|
{
|
|
"name": "<unnamed window>",
|
|
"definition_position": 2,
|
|
"last_executed_window": true,
|
|
"using_filesort": true,
|
|
"filesort_key": [
|
|
"`i`"
|
|
],
|
|
"frame_buffer": {
|
|
"using_temporary_table": true,
|
|
"optimized_frame_evaluation": true
|
|
},
|
|
"functions": [
|
|
"sum"
|
|
]
|
|
}
|
|
],
|
|
"cost_info": {
|
|
"sort_cost": "8.00"
|
|
},
|
|
"grouping_operation": {
|
|
"using_temporary_table": true,
|
|
"using_filesort": false,
|
|
"table": {
|
|
"table_name": "tj2",
|
|
"access_type": "ALL",
|
|
"rows_examined_per_scan": 8,
|
|
"rows_produced_per_join": 8,
|
|
"filtered": "100.00",
|
|
"cost_info": {
|
|
"read_cost": "0.25",
|
|
"eval_cost": "0.80",
|
|
"prefix_cost": "1.05",
|
|
"data_read_per_join": "192"
|
|
},
|
|
"used_columns": [
|
|
"i"
|
|
]
|
|
}
|
|
}
|
|
}
|
|
}
|
|
}
|
|
Warnings:
|
|
Note 1003 /* select#1 */ select `test`.`tj2`.`i` AS `i`,sum(sum(`test`.`tj2`.`i`)) OVER () AS `SUM(SUM(i)) OVER ()`,sum(`test`.`tj2`.`i`) OVER (ORDER BY `test`.`tj2`.`i` ) AS `SUM(i) OVER (ORDER BY i)`,(sum(`test`.`tj2`.`i`) % 2) AS `MOD(SUM(i),2)`,sum(`test`.`tj2`.`i`) AS `SUM(i)` from `test`.`tj2` group by `test`.`tj2`.`i`
|
|
DROP TABLE tj2;
|
|
----------------------------------------------------------------------
|
|
- Bug fixes
|
|
----------------------------------------------------------------------
|
|
Bug fix for FIRST_VALUE, LAST_VALUE when not buffered processing
|
|
EXPLAIN FORMAT=JSON SELECT LAST_VALUE(j) OVER w, FIRST_VALUE(j) OVER w FROM tj WINDOW w AS (PARTITION BY i ORDER BY j ROWS UNBOUNDED PRECEDING);
|
|
EXPLAIN
|
|
{
|
|
"query_block": {
|
|
"select_id": 1,
|
|
"cost_info": {
|
|
"query_cost": "9.05"
|
|
},
|
|
"windowing": {
|
|
"windows": [
|
|
{
|
|
"name": "w",
|
|
"using_filesort": true,
|
|
"filesort_key": [
|
|
"`i`",
|
|
"`j`"
|
|
],
|
|
"functions": [
|
|
"last_value",
|
|
"first_value"
|
|
]
|
|
}
|
|
],
|
|
"cost_info": {
|
|
"sort_cost": "8.00"
|
|
},
|
|
"table": {
|
|
"table_name": "tj",
|
|
"access_type": "ALL",
|
|
"rows_examined_per_scan": 8,
|
|
"rows_produced_per_join": 8,
|
|
"filtered": "100.00",
|
|
"cost_info": {
|
|
"read_cost": "0.25",
|
|
"eval_cost": "0.80",
|
|
"prefix_cost": "1.05",
|
|
"data_read_per_join": "192"
|
|
},
|
|
"used_columns": [
|
|
"j",
|
|
"i"
|
|
]
|
|
}
|
|
}
|
|
}
|
|
}
|
|
Warnings:
|
|
Note 1003 /* select#1 */ select last_value(`test`.`tj`.`j`) OVER `w` AS `LAST_VALUE(j) OVER w`,first_value(`test`.`tj`.`j`) OVER `w` AS `FIRST_VALUE(j) OVER w` from `test`.`tj` window `w` AS (PARTITION BY `test`.`tj`.`i` ORDER BY `test`.`tj`.`j` ROWS BETWEEN UNBOUNDED PRECEDING AND CURRENT ROW)
|
|
Bug missing hidden column (j) induction to select list: FIRST_VALUE/LAST_VALUE
|
|
EXPLAIN FORMAT=JSON SELECT i, LAST_VALUE((CAST(j AS UNSIGNED))) OVER w, FIRST_VALUE(CAST(j AS UNSIGNED)) OVER w FROM tj
|
|
WINDOW w AS (PARTITION BY i ORDER BY CAST(j AS UNSIGNED) RANGE UNBOUNDED PRECEDING);
|
|
EXPLAIN
|
|
{
|
|
"query_block": {
|
|
"select_id": 1,
|
|
"cost_info": {
|
|
"query_cost": "9.05"
|
|
},
|
|
"windowing": {
|
|
"windows": [
|
|
{
|
|
"name": "w",
|
|
"using_filesort": true,
|
|
"filesort_key": [
|
|
"`i`",
|
|
"cast(`j` as unsigned)"
|
|
],
|
|
"frame_buffer": {
|
|
"using_temporary_table": true,
|
|
"optimized_frame_evaluation": true
|
|
},
|
|
"functions": [
|
|
"last_value",
|
|
"first_value"
|
|
]
|
|
}
|
|
],
|
|
"cost_info": {
|
|
"sort_cost": "8.00"
|
|
},
|
|
"table": {
|
|
"table_name": "tj",
|
|
"access_type": "ALL",
|
|
"rows_examined_per_scan": 8,
|
|
"rows_produced_per_join": 8,
|
|
"filtered": "100.00",
|
|
"cost_info": {
|
|
"read_cost": "0.25",
|
|
"eval_cost": "0.80",
|
|
"prefix_cost": "1.05",
|
|
"data_read_per_join": "192"
|
|
},
|
|
"used_columns": [
|
|
"j",
|
|
"i"
|
|
]
|
|
}
|
|
}
|
|
}
|
|
}
|
|
Warnings:
|
|
Note 1003 /* select#1 */ select `test`.`tj`.`i` AS `i`,last_value(cast(`test`.`tj`.`j` as unsigned)) OVER `w` AS `LAST_VALUE((CAST(j AS UNSIGNED))) OVER w`,first_value(cast(`test`.`tj`.`j` as unsigned)) OVER `w` AS `FIRST_VALUE(CAST(j AS UNSIGNED)) OVER w` from `test`.`tj` window `w` AS (PARTITION BY `test`.`tj`.`i` ORDER BY cast(`test`.`tj`.`j` as unsigned) RANGE BETWEEN UNBOUNDED PRECEDING AND CURRENT ROW)
|
|
Fix for lineno in warnings buffered and unbuffered windows
|
|
EXPLAIN FORMAT=JSON SELECT j,CAST(SUM(j) OVER (PARTITION BY i) AS JSON), CAST(SUM(j) OVER () AS JSON) FROM tj;
|
|
EXPLAIN
|
|
{
|
|
"query_block": {
|
|
"select_id": 1,
|
|
"cost_info": {
|
|
"query_cost": "9.05"
|
|
},
|
|
"windowing": {
|
|
"windows": [
|
|
{
|
|
"name": "<unnamed window>",
|
|
"definition_position": 1,
|
|
"using_temporary_table": true,
|
|
"using_filesort": true,
|
|
"filesort_key": [
|
|
"`i`"
|
|
],
|
|
"frame_buffer": {
|
|
"using_temporary_table": true,
|
|
"optimized_frame_evaluation": true
|
|
},
|
|
"functions": [
|
|
"sum"
|
|
]
|
|
},
|
|
{
|
|
"name": "<unnamed window>",
|
|
"definition_position": 2,
|
|
"last_executed_window": true,
|
|
"frame_buffer": {
|
|
"using_temporary_table": true,
|
|
"optimized_frame_evaluation": true
|
|
},
|
|
"functions": [
|
|
"sum"
|
|
]
|
|
}
|
|
],
|
|
"cost_info": {
|
|
"sort_cost": "8.00"
|
|
},
|
|
"table": {
|
|
"table_name": "tj",
|
|
"access_type": "ALL",
|
|
"rows_examined_per_scan": 8,
|
|
"rows_produced_per_join": 8,
|
|
"filtered": "100.00",
|
|
"cost_info": {
|
|
"read_cost": "0.25",
|
|
"eval_cost": "0.80",
|
|
"prefix_cost": "1.05",
|
|
"data_read_per_join": "192"
|
|
},
|
|
"used_columns": [
|
|
"j",
|
|
"i"
|
|
]
|
|
}
|
|
}
|
|
}
|
|
}
|
|
Warnings:
|
|
Note 1003 /* select#1 */ select `test`.`tj`.`j` AS `j`,cast(sum(`test`.`tj`.`j`) OVER (PARTITION BY `test`.`tj`.`i` ) as json) AS `CAST(SUM(j) OVER (PARTITION BY i) AS JSON)`,cast(sum(`test`.`tj`.`j`) OVER () as json) AS `CAST(SUM(j) OVER () AS JSON)` from `test`.`tj`
|
|
EXPLAIN FORMAT=JSON SELECT j,CAST(SUM(j) OVER (PARTITION BY i ROWS UNBOUNDED PRECEDING) AS JSON), CAST(SUM(j) OVER (PARTITION BY i ROWS UNBOUNDED PRECEDING) AS JSON) FROM tj;
|
|
EXPLAIN
|
|
{
|
|
"query_block": {
|
|
"select_id": 1,
|
|
"cost_info": {
|
|
"query_cost": "9.05"
|
|
},
|
|
"windowing": {
|
|
"windows": [
|
|
{
|
|
"name": "<unnamed window>",
|
|
"definition_position": 1,
|
|
"using_temporary_table": true,
|
|
"using_filesort": true,
|
|
"filesort_key": [
|
|
"`i`"
|
|
],
|
|
"functions": [
|
|
"sum"
|
|
]
|
|
},
|
|
{
|
|
"name": "<unnamed window>",
|
|
"definition_position": 2,
|
|
"last_executed_window": true,
|
|
"functions": [
|
|
"sum"
|
|
]
|
|
}
|
|
],
|
|
"cost_info": {
|
|
"sort_cost": "8.00"
|
|
},
|
|
"table": {
|
|
"table_name": "tj",
|
|
"access_type": "ALL",
|
|
"rows_examined_per_scan": 8,
|
|
"rows_produced_per_join": 8,
|
|
"filtered": "100.00",
|
|
"cost_info": {
|
|
"read_cost": "0.25",
|
|
"eval_cost": "0.80",
|
|
"prefix_cost": "1.05",
|
|
"data_read_per_join": "192"
|
|
},
|
|
"used_columns": [
|
|
"j",
|
|
"i"
|
|
]
|
|
}
|
|
}
|
|
}
|
|
}
|
|
Warnings:
|
|
Note 1003 /* select#1 */ select `test`.`tj`.`j` AS `j`,cast(sum(`test`.`tj`.`j`) OVER (PARTITION BY `test`.`tj`.`i` ROWS BETWEEN UNBOUNDED PRECEDING AND CURRENT ROW) as json) AS `CAST(SUM(j) OVER (PARTITION BY i ROWS UNBOUNDED PRECEDING) AS JSON)`,cast(sum(`test`.`tj`.`j`) OVER (PARTITION BY `test`.`tj`.`i` ROWS BETWEEN UNBOUNDED PRECEDING AND CURRENT ROW) as json) AS `CAST(SUM(j) OVER (PARTITION BY i ROWS UNBOUNDED PRECEDING) AS JSON)` from `test`.`tj`
|
|
Bug fix for UNION
|
|
EXPLAIN FORMAT=JSON SELECT i, ROW_NUMBER() OVER () FROM tj UNION ALL SELECT i, ROW_NUMBER() OVER () FROM tj;
|
|
EXPLAIN
|
|
{
|
|
"query_block": {
|
|
"union_result": {
|
|
"using_temporary_table": false,
|
|
"query_specifications": [
|
|
{
|
|
"dependent": false,
|
|
"cacheable": true,
|
|
"query_block": {
|
|
"select_id": 1,
|
|
"cost_info": {
|
|
"query_cost": "1.05"
|
|
},
|
|
"windowing": {
|
|
"windows": [
|
|
{
|
|
"name": "<unnamed window>",
|
|
"functions": [
|
|
"row_number"
|
|
]
|
|
}
|
|
],
|
|
"table": {
|
|
"table_name": "tj",
|
|
"access_type": "ALL",
|
|
"rows_examined_per_scan": 8,
|
|
"rows_produced_per_join": 8,
|
|
"filtered": "100.00",
|
|
"cost_info": {
|
|
"read_cost": "0.25",
|
|
"eval_cost": "0.80",
|
|
"prefix_cost": "1.05",
|
|
"data_read_per_join": "192"
|
|
},
|
|
"used_columns": [
|
|
"i"
|
|
]
|
|
}
|
|
}
|
|
}
|
|
},
|
|
{
|
|
"dependent": false,
|
|
"cacheable": true,
|
|
"query_block": {
|
|
"select_id": 2,
|
|
"cost_info": {
|
|
"query_cost": "1.05"
|
|
},
|
|
"windowing": {
|
|
"windows": [
|
|
{
|
|
"name": "<unnamed window>",
|
|
"functions": [
|
|
"row_number"
|
|
]
|
|
}
|
|
],
|
|
"table": {
|
|
"table_name": "tj",
|
|
"access_type": "ALL",
|
|
"rows_examined_per_scan": 8,
|
|
"rows_produced_per_join": 8,
|
|
"filtered": "100.00",
|
|
"cost_info": {
|
|
"read_cost": "0.25",
|
|
"eval_cost": "0.80",
|
|
"prefix_cost": "1.05",
|
|
"data_read_per_join": "192"
|
|
},
|
|
"used_columns": [
|
|
"i"
|
|
]
|
|
}
|
|
}
|
|
}
|
|
}
|
|
]
|
|
}
|
|
}
|
|
}
|
|
Warnings:
|
|
Note 1003 /* select#1 */ select `test`.`tj`.`i` AS `i`,row_number() OVER () AS `ROW_NUMBER() OVER ()` from `test`.`tj` union all /* select#2 */ select `test`.`tj`.`i` AS `i`,row_number() OVER () AS `ROW_NUMBER() OVER ()` from `test`.`tj`
|
|
EXPLAIN FORMAT=JSON SELECT * FROM (SELECT i, j, ROW_NUMBER() OVER (ORDER BY j) FROM tj UNION SELECT i, j, ROW_NUMBER() OVER (ORDER BY j) FROM tj) alias;
|
|
EXPLAIN
|
|
{
|
|
"query_block": {
|
|
"select_id": 1,
|
|
"cost_info": {
|
|
"query_cost": "4.30"
|
|
},
|
|
"table": {
|
|
"table_name": "alias",
|
|
"access_type": "ALL",
|
|
"rows_examined_per_scan": 16,
|
|
"rows_produced_per_join": 16,
|
|
"filtered": "100.00",
|
|
"cost_info": {
|
|
"read_cost": "2.70",
|
|
"eval_cost": "1.60",
|
|
"prefix_cost": "4.30",
|
|
"data_read_per_join": "640"
|
|
},
|
|
"used_columns": [
|
|
"<hash_field>",
|
|
"i",
|
|
"j",
|
|
"ROW_NUMBER() OVER (ORDER BY j)"
|
|
],
|
|
"materialized_from_subquery": {
|
|
"using_temporary_table": true,
|
|
"dependent": false,
|
|
"cacheable": true,
|
|
"query_block": {
|
|
"union_result": {
|
|
"using_temporary_table": true,
|
|
"table_name": "<union2,3>",
|
|
"access_type": "ALL",
|
|
"query_specifications": [
|
|
{
|
|
"dependent": false,
|
|
"cacheable": true,
|
|
"query_block": {
|
|
"select_id": 2,
|
|
"cost_info": {
|
|
"query_cost": "9.05"
|
|
},
|
|
"windowing": {
|
|
"windows": [
|
|
{
|
|
"name": "<unnamed window>",
|
|
"using_filesort": true,
|
|
"filesort_key": [
|
|
"`j`"
|
|
],
|
|
"functions": [
|
|
"row_number"
|
|
]
|
|
}
|
|
],
|
|
"cost_info": {
|
|
"sort_cost": "8.00"
|
|
},
|
|
"table": {
|
|
"table_name": "tj",
|
|
"access_type": "ALL",
|
|
"rows_examined_per_scan": 8,
|
|
"rows_produced_per_join": 8,
|
|
"filtered": "100.00",
|
|
"cost_info": {
|
|
"read_cost": "0.25",
|
|
"eval_cost": "0.80",
|
|
"prefix_cost": "1.05",
|
|
"data_read_per_join": "192"
|
|
},
|
|
"used_columns": [
|
|
"j",
|
|
"i"
|
|
]
|
|
}
|
|
}
|
|
}
|
|
},
|
|
{
|
|
"dependent": false,
|
|
"cacheable": true,
|
|
"query_block": {
|
|
"select_id": 3,
|
|
"cost_info": {
|
|
"query_cost": "9.05"
|
|
},
|
|
"windowing": {
|
|
"windows": [
|
|
{
|
|
"name": "<unnamed window>",
|
|
"using_filesort": true,
|
|
"filesort_key": [
|
|
"`j`"
|
|
],
|
|
"functions": [
|
|
"row_number"
|
|
]
|
|
}
|
|
],
|
|
"cost_info": {
|
|
"sort_cost": "8.00"
|
|
},
|
|
"table": {
|
|
"table_name": "tj",
|
|
"access_type": "ALL",
|
|
"rows_examined_per_scan": 8,
|
|
"rows_produced_per_join": 8,
|
|
"filtered": "100.00",
|
|
"cost_info": {
|
|
"read_cost": "0.25",
|
|
"eval_cost": "0.80",
|
|
"prefix_cost": "1.05",
|
|
"data_read_per_join": "192"
|
|
},
|
|
"used_columns": [
|
|
"j",
|
|
"i"
|
|
]
|
|
}
|
|
}
|
|
}
|
|
}
|
|
]
|
|
}
|
|
}
|
|
}
|
|
}
|
|
}
|
|
}
|
|
Warnings:
|
|
Note 1003 /* select#1 */ select `alias`.`i` AS `i`,`alias`.`j` AS `j`,`alias`.`ROW_NUMBER() OVER (ORDER BY j)` AS `ROW_NUMBER() OVER (ORDER BY j)` from (/* select#2 */ select `test`.`tj`.`i` AS `i`,`test`.`tj`.`j` AS `j`,row_number() OVER (ORDER BY `test`.`tj`.`j` ) AS `ROW_NUMBER() OVER (ORDER BY j)` from `test`.`tj` union /* select#3 */ select `test`.`tj`.`i` AS `i`,`test`.`tj`.`j` AS `j`,row_number() OVER (ORDER BY `test`.`tj`.`j` ) AS `ROW_NUMBER() OVER (ORDER BY j)` from `test`.`tj`) `alias`
|
|
DROP TABLE tj;
|
|
----------------------------------------------------------------------
|
|
- More JSON
|
|
----------------------------------------------------------------------
|
|
CREATE TABLE tj(j JSON);
|
|
INSERT INTO tj VALUES ('1'), ('2'), ('3'), ('4'), ('5'), (NULL);
|
|
EXPLAIN FORMAT=JSON SELECT j, JSON_TYPE(j), SUM(j) OVER (ORDER BY j ROWS 3 PRECEDING) FROM tj;
|
|
EXPLAIN
|
|
{
|
|
"query_block": {
|
|
"select_id": 1,
|
|
"cost_info": {
|
|
"query_cost": "6.85"
|
|
},
|
|
"windowing": {
|
|
"windows": [
|
|
{
|
|
"name": "<unnamed window>",
|
|
"using_filesort": true,
|
|
"filesort_key": [
|
|
"`j`"
|
|
],
|
|
"frame_buffer": {
|
|
"using_temporary_table": true
|
|
},
|
|
"functions": [
|
|
"sum"
|
|
]
|
|
}
|
|
],
|
|
"cost_info": {
|
|
"sort_cost": "6.00"
|
|
},
|
|
"table": {
|
|
"table_name": "tj",
|
|
"access_type": "ALL",
|
|
"rows_examined_per_scan": 6,
|
|
"rows_produced_per_join": 6,
|
|
"filtered": "100.00",
|
|
"cost_info": {
|
|
"read_cost": "0.25",
|
|
"eval_cost": "0.60",
|
|
"prefix_cost": "0.85",
|
|
"data_read_per_join": "96"
|
|
},
|
|
"used_columns": [
|
|
"j"
|
|
]
|
|
}
|
|
}
|
|
}
|
|
}
|
|
Warnings:
|
|
Note 1003 /* select#1 */ select `test`.`tj`.`j` AS `j`,json_type(`test`.`tj`.`j`) AS `JSON_TYPE(j)`,sum(`test`.`tj`.`j`) OVER (ORDER BY `test`.`tj`.`j` ROWS BETWEEN 3 PRECEDING AND CURRENT ROW) AS `SUM(j) OVER (ORDER BY j ROWS 3 PRECEDING)` from `test`.`tj`
|
|
INSERT INTO tj VALUES ('3.14');
|
|
EXPLAIN FORMAT=JSON SELECT j, JSON_TYPE(j), SUM(j) OVER (ORDER BY j ROWS 3 PRECEDING) FROM tj;
|
|
EXPLAIN
|
|
{
|
|
"query_block": {
|
|
"select_id": 1,
|
|
"cost_info": {
|
|
"query_cost": "7.95"
|
|
},
|
|
"windowing": {
|
|
"windows": [
|
|
{
|
|
"name": "<unnamed window>",
|
|
"using_filesort": true,
|
|
"filesort_key": [
|
|
"`j`"
|
|
],
|
|
"frame_buffer": {
|
|
"using_temporary_table": true
|
|
},
|
|
"functions": [
|
|
"sum"
|
|
]
|
|
}
|
|
],
|
|
"cost_info": {
|
|
"sort_cost": "7.00"
|
|
},
|
|
"table": {
|
|
"table_name": "tj",
|
|
"access_type": "ALL",
|
|
"rows_examined_per_scan": 7,
|
|
"rows_produced_per_join": 7,
|
|
"filtered": "100.00",
|
|
"cost_info": {
|
|
"read_cost": "0.25",
|
|
"eval_cost": "0.70",
|
|
"prefix_cost": "0.95",
|
|
"data_read_per_join": "112"
|
|
},
|
|
"used_columns": [
|
|
"j"
|
|
]
|
|
}
|
|
}
|
|
}
|
|
}
|
|
Warnings:
|
|
Note 1003 /* select#1 */ select `test`.`tj`.`j` AS `j`,json_type(`test`.`tj`.`j`) AS `JSON_TYPE(j)`,sum(`test`.`tj`.`j`) OVER (ORDER BY `test`.`tj`.`j` ROWS BETWEEN 3 PRECEDING AND CURRENT ROW) AS `SUM(j) OVER (ORDER BY j ROWS 3 PRECEDING)` from `test`.`tj`
|
|
INSERT INTO tj VALUES ('[1,2,3]');
|
|
ANALYZE TABLE tj;
|
|
Table Op Msg_type Msg_text
|
|
test.tj analyze status OK
|
|
EXPLAIN FORMAT=JSON SELECT j,
|
|
JSON_TYPE(j),
|
|
SUM(CASE WHEN JSON_TYPE(j) = 'ARRAY' THEN j->"$[0]" ELSE j END)
|
|
OVER (ORDER BY j ROWS 3 PRECEDING)
|
|
FROM tj;
|
|
EXPLAIN
|
|
{
|
|
"query_block": {
|
|
"select_id": 1,
|
|
"cost_info": {
|
|
"query_cost": "9.05"
|
|
},
|
|
"windowing": {
|
|
"windows": [
|
|
{
|
|
"name": "<unnamed window>",
|
|
"using_filesort": true,
|
|
"filesort_key": [
|
|
"`j`"
|
|
],
|
|
"frame_buffer": {
|
|
"using_temporary_table": true
|
|
},
|
|
"functions": [
|
|
"sum"
|
|
]
|
|
}
|
|
],
|
|
"cost_info": {
|
|
"sort_cost": "8.00"
|
|
},
|
|
"table": {
|
|
"table_name": "tj",
|
|
"access_type": "ALL",
|
|
"rows_examined_per_scan": 8,
|
|
"rows_produced_per_join": 8,
|
|
"filtered": "100.00",
|
|
"cost_info": {
|
|
"read_cost": "0.25",
|
|
"eval_cost": "0.80",
|
|
"prefix_cost": "1.05",
|
|
"data_read_per_join": "128"
|
|
},
|
|
"used_columns": [
|
|
"j"
|
|
]
|
|
}
|
|
}
|
|
}
|
|
}
|
|
Warnings:
|
|
Note 1003 /* select#1 */ select `test`.`tj`.`j` AS `j`,json_type(`test`.`tj`.`j`) AS `JSON_TYPE(j)`,sum((case when (json_type(`test`.`tj`.`j`) = 'ARRAY') then json_extract(`test`.`tj`.`j`,'$[0]') else `test`.`tj`.`j` end)) OVER (ORDER BY `test`.`tj`.`j` ROWS BETWEEN 3 PRECEDING AND CURRENT ROW) AS `SUM(CASE WHEN JSON_TYPE(j) = 'ARRAY' THEN j->"$[0]" ELSE j END)
|
|
OVER (ORDER BY j ROWS 3 PRECEDING)` from `test`.`tj`
|
|
CREATE TABLE t5(b BIGINT UNSIGNED);
|
|
INSERT INTO t5 VALUES (1), (2), (3), (4), (5), (6), (7);
|
|
ANALYZE TABLE t5;
|
|
Table Op Msg_type Msg_text
|
|
test.t5 analyze status OK
|
|
last row should have COUNT(*) == 0 , not 1 (bug fix)
|
|
EXPLAIN FORMAT=JSON SELECT b, COUNT(*) OVER (ORDER BY b RANGE BETWEEN 1 FOLLOWING AND 100 FOLLOWING) bb FROM t5;
|
|
EXPLAIN
|
|
{
|
|
"query_block": {
|
|
"select_id": 1,
|
|
"cost_info": {
|
|
"query_cost": "7.95"
|
|
},
|
|
"windowing": {
|
|
"windows": [
|
|
{
|
|
"name": "<unnamed window>",
|
|
"using_filesort": true,
|
|
"filesort_key": [
|
|
"`b`"
|
|
],
|
|
"frame_buffer": {
|
|
"using_temporary_table": true,
|
|
"optimized_frame_evaluation": true
|
|
},
|
|
"functions": [
|
|
"count"
|
|
]
|
|
}
|
|
],
|
|
"cost_info": {
|
|
"sort_cost": "7.00"
|
|
},
|
|
"table": {
|
|
"table_name": "t5",
|
|
"access_type": "ALL",
|
|
"rows_examined_per_scan": 7,
|
|
"rows_produced_per_join": 7,
|
|
"filtered": "100.00",
|
|
"cost_info": {
|
|
"read_cost": "0.25",
|
|
"eval_cost": "0.70",
|
|
"prefix_cost": "0.95",
|
|
"data_read_per_join": "112"
|
|
},
|
|
"used_columns": [
|
|
"b"
|
|
]
|
|
}
|
|
}
|
|
}
|
|
}
|
|
Warnings:
|
|
Note 1003 /* select#1 */ select `test`.`t5`.`b` AS `b`,count(0) OVER (ORDER BY `test`.`t5`.`b` RANGE BETWEEN 1 FOLLOWING AND 100 FOLLOWING) AS `bb` from `test`.`t5`
|
|
CREATE TABLE t6(t TIME, ts TIMESTAMP);
|
|
INSERT INTO t6 VALUES ('12:30', '2016-07-05 08:30:42');
|
|
INSERT INTO t6 VALUES ('22:30', '2015-07-05 08:30:43');
|
|
INSERT INTO t6 VALUES ('13:30', '2014-07-05 08:30:44');
|
|
INSERT INTO t6 VALUES ('01:30', '2013-07-05 08:30:45');
|
|
INSERT INTO t6 VALUES ('15:30', '2016-08-05 08:31:42');
|
|
INSERT INTO t6 VALUES ('20:30', '2016-09-05 08:32:42');
|
|
INSERT INTO t6 VALUES ('04:30', '2016-10-05 08:33:42');
|
|
INSERT INTO t6 VALUES ('06:30', '2016-11-05 08:34:42');
|
|
INSERT INTO t6 VALUES ('18:30', '2016-07-05 09:30:42');
|
|
INSERT INTO t6 VALUES ('21:30', '2016-07-06 10:30:42');
|
|
INSERT INTO t6 VALUES ('00:30', '2016-07-07 11:30:42');
|
|
INSERT INTO t6 VALUES ('00:31', '2016-07-08 12:30:42');
|
|
ANALYZE TABLE t6;
|
|
Table Op Msg_type Msg_text
|
|
test.t6 analyze status OK
|
|
INTERVAL specified with string as below failed
|
|
EXPLAIN FORMAT=JSON SELECT t, COUNT(*) OVER (ORDER BY t RANGE
|
|
BETWEEN INTERVAL 1 HOUR PRECEDING AND INTERVAL '2:2' MINUTE_SECOND FOLLOWING) AS cnt FROM t6;
|
|
EXPLAIN
|
|
{
|
|
"query_block": {
|
|
"select_id": 1,
|
|
"cost_info": {
|
|
"query_cost": "13.45"
|
|
},
|
|
"windowing": {
|
|
"windows": [
|
|
{
|
|
"name": "<unnamed window>",
|
|
"using_filesort": true,
|
|
"filesort_key": [
|
|
"`t`"
|
|
],
|
|
"frame_buffer": {
|
|
"using_temporary_table": true,
|
|
"optimized_frame_evaluation": true
|
|
},
|
|
"functions": [
|
|
"count"
|
|
]
|
|
}
|
|
],
|
|
"cost_info": {
|
|
"sort_cost": "12.00"
|
|
},
|
|
"table": {
|
|
"table_name": "t6",
|
|
"access_type": "ALL",
|
|
"rows_examined_per_scan": 12,
|
|
"rows_produced_per_join": 12,
|
|
"filtered": "100.00",
|
|
"cost_info": {
|
|
"read_cost": "0.25",
|
|
"eval_cost": "1.20",
|
|
"prefix_cost": "1.45",
|
|
"data_read_per_join": "192"
|
|
},
|
|
"used_columns": [
|
|
"t"
|
|
]
|
|
}
|
|
}
|
|
}
|
|
}
|
|
Warnings:
|
|
Note 1003 /* select#1 */ select `test`.`t6`.`t` AS `t`,count(0) OVER (ORDER BY `test`.`t6`.`t` RANGE BETWEEN INTERVAL 1 hour PRECEDING AND INTERVAL '2:2' minute_second FOLLOWING) AS `cnt` from `test`.`t6`
|
|
----------------------------------------------------------------------
|
|
- Window spec inheritance
|
|
----------------------------------------------------------------------
|
|
EXPLAIN FORMAT=JSON SELECT COUNT(*) OVER w0,
|
|
COUNT(*) OVER w,
|
|
COUNT(*) OVER w1 FROM t6
|
|
WINDOW w0 AS (),
|
|
w AS (w0 ORDER BY t),
|
|
w1 AS (w RANGE BETWEEN INTERVAL 24 HOUR PRECEDING AND INTERVAL '2:2' MINUTE_SECOND FOLLOWING);
|
|
EXPLAIN
|
|
{
|
|
"query_block": {
|
|
"select_id": 1,
|
|
"cost_info": {
|
|
"query_cost": "13.45"
|
|
},
|
|
"windowing": {
|
|
"windows": [
|
|
{
|
|
"name": "w0",
|
|
"definition_position": 1,
|
|
"using_temporary_table": true,
|
|
"frame_buffer": {
|
|
"using_temporary_table": true,
|
|
"optimized_frame_evaluation": true
|
|
},
|
|
"functions": [
|
|
"count"
|
|
]
|
|
},
|
|
{
|
|
"name": "w",
|
|
"definition_position": 2,
|
|
"using_temporary_table": true,
|
|
"using_filesort": true,
|
|
"filesort_key": [
|
|
"`t`"
|
|
],
|
|
"frame_buffer": {
|
|
"using_temporary_table": true,
|
|
"optimized_frame_evaluation": true
|
|
},
|
|
"functions": [
|
|
"count"
|
|
]
|
|
},
|
|
{
|
|
"name": "w1",
|
|
"definition_position": 3,
|
|
"last_executed_window": true,
|
|
"frame_buffer": {
|
|
"using_temporary_table": true,
|
|
"optimized_frame_evaluation": true
|
|
},
|
|
"functions": [
|
|
"count"
|
|
]
|
|
}
|
|
],
|
|
"cost_info": {
|
|
"sort_cost": "12.00"
|
|
},
|
|
"table": {
|
|
"table_name": "t6",
|
|
"access_type": "ALL",
|
|
"rows_examined_per_scan": 12,
|
|
"rows_produced_per_join": 12,
|
|
"filtered": "100.00",
|
|
"cost_info": {
|
|
"read_cost": "0.25",
|
|
"eval_cost": "1.20",
|
|
"prefix_cost": "1.45",
|
|
"data_read_per_join": "192"
|
|
},
|
|
"used_columns": [
|
|
"t"
|
|
]
|
|
}
|
|
}
|
|
}
|
|
}
|
|
Warnings:
|
|
Note 1003 /* select#1 */ select count(0) OVER `w0` AS `COUNT(*) OVER w0`,count(0) OVER `w` AS `COUNT(*) OVER w`,count(0) OVER `w1` AS `COUNT(*) OVER w1` from `test`.`t6` window `w0` AS () , `w` AS (`w0` ORDER BY `test`.`t6`.`t` ) , `w1` AS (`w` RANGE BETWEEN INTERVAL 24 hour PRECEDING AND INTERVAL '2:2' minute_second FOLLOWING)
|
|
CREATE VIEW v AS
|
|
SELECT COUNT(*) OVER w0,
|
|
COUNT(*) OVER w,
|
|
COUNT(*) OVER w1 FROM t6
|
|
WINDOW w0 AS (),
|
|
w AS (w0 ORDER BY t),
|
|
w1 AS (w RANGE BETWEEN INTERVAL 24 HOUR PRECEDING AND INTERVAL '2:2' MINUTE_SECOND FOLLOWING);
|
|
SHOW CREATE VIEW v;
|
|
View Create View character_set_client collation_connection
|
|
v CREATE ALGORITHM=UNDEFINED DEFINER=`root`@`localhost` SQL SECURITY DEFINER VIEW `v` AS select count(0) OVER `w0` AS `COUNT(*) OVER w0`,count(0) OVER `w` AS `COUNT(*) OVER w`,count(0) OVER `w1` AS `COUNT(*) OVER w1` from `t6` window `w0` AS () , `w` AS (`w0` ORDER BY `t6`.`t` ) , `w1` AS (`w` RANGE BETWEEN INTERVAL 24 hour PRECEDING AND INTERVAL '2:2' minute_second FOLLOWING) utf8 utf8_general_ci
|
|
EXPLAIN FORMAT=JSON SELECT * FROM v;
|
|
EXPLAIN
|
|
{
|
|
"query_block": {
|
|
"select_id": 1,
|
|
"cost_info": {
|
|
"query_cost": "3.85"
|
|
},
|
|
"table": {
|
|
"table_name": "v",
|
|
"access_type": "ALL",
|
|
"rows_examined_per_scan": 12,
|
|
"rows_produced_per_join": 12,
|
|
"filtered": "100.00",
|
|
"cost_info": {
|
|
"read_cost": "2.65",
|
|
"eval_cost": "1.20",
|
|
"prefix_cost": "3.85",
|
|
"data_read_per_join": "384"
|
|
},
|
|
"used_columns": [
|
|
"COUNT(*) OVER w0",
|
|
"COUNT(*) OVER w",
|
|
"COUNT(*) OVER w1"
|
|
],
|
|
"materialized_from_subquery": {
|
|
"using_temporary_table": true,
|
|
"dependent": false,
|
|
"cacheable": true,
|
|
"query_block": {
|
|
"select_id": 2,
|
|
"cost_info": {
|
|
"query_cost": "13.45"
|
|
},
|
|
"windowing": {
|
|
"windows": [
|
|
{
|
|
"name": "w0",
|
|
"definition_position": 1,
|
|
"using_temporary_table": true,
|
|
"frame_buffer": {
|
|
"using_temporary_table": true,
|
|
"optimized_frame_evaluation": true
|
|
},
|
|
"functions": [
|
|
"count"
|
|
]
|
|
},
|
|
{
|
|
"name": "w",
|
|
"definition_position": 2,
|
|
"using_temporary_table": true,
|
|
"using_filesort": true,
|
|
"filesort_key": [
|
|
"`t`"
|
|
],
|
|
"frame_buffer": {
|
|
"using_temporary_table": true,
|
|
"optimized_frame_evaluation": true
|
|
},
|
|
"functions": [
|
|
"count"
|
|
]
|
|
},
|
|
{
|
|
"name": "w1",
|
|
"definition_position": 3,
|
|
"last_executed_window": true,
|
|
"frame_buffer": {
|
|
"using_temporary_table": true,
|
|
"optimized_frame_evaluation": true
|
|
},
|
|
"functions": [
|
|
"count"
|
|
]
|
|
}
|
|
],
|
|
"cost_info": {
|
|
"sort_cost": "12.00"
|
|
},
|
|
"table": {
|
|
"table_name": "t6",
|
|
"access_type": "ALL",
|
|
"rows_examined_per_scan": 12,
|
|
"rows_produced_per_join": 12,
|
|
"filtered": "100.00",
|
|
"cost_info": {
|
|
"read_cost": "0.25",
|
|
"eval_cost": "1.20",
|
|
"prefix_cost": "1.45",
|
|
"data_read_per_join": "192"
|
|
},
|
|
"used_columns": [
|
|
"t"
|
|
]
|
|
}
|
|
}
|
|
}
|
|
}
|
|
}
|
|
}
|
|
}
|
|
Warnings:
|
|
Note 1003 /* select#1 */ select `v`.`COUNT(*) OVER w0` AS `COUNT(*) OVER w0`,`v`.`COUNT(*) OVER w` AS `COUNT(*) OVER w`,`v`.`COUNT(*) OVER w1` AS `COUNT(*) OVER w1` from `test`.`v`
|
|
DROP VIEW v;
|
|
----------------------------------------------------------------------
|
|
- Bugs with induction of hidden fields from window function also used
|
|
- in ORDER BY/PARTITION BY
|
|
----------------------------------------------------------------------
|
|
EXPLAIN FORMAT=JSON SELECT id, AVG(id) OVER (PARTITION BY id) summ FROM t1;
|
|
EXPLAIN
|
|
{
|
|
"query_block": {
|
|
"select_id": 1,
|
|
"cost_info": {
|
|
"query_cost": "10.15"
|
|
},
|
|
"windowing": {
|
|
"windows": [
|
|
{
|
|
"name": "<unnamed window>",
|
|
"using_filesort": true,
|
|
"filesort_key": [
|
|
"`id`"
|
|
],
|
|
"frame_buffer": {
|
|
"using_temporary_table": true,
|
|
"optimized_frame_evaluation": true
|
|
},
|
|
"functions": [
|
|
"avg"
|
|
]
|
|
}
|
|
],
|
|
"cost_info": {
|
|
"sort_cost": "9.00"
|
|
},
|
|
"table": {
|
|
"table_name": "t1",
|
|
"access_type": "ALL",
|
|
"rows_examined_per_scan": 9,
|
|
"rows_produced_per_join": 9,
|
|
"filtered": "100.00",
|
|
"cost_info": {
|
|
"read_cost": "0.25",
|
|
"eval_cost": "0.90",
|
|
"prefix_cost": "1.15",
|
|
"data_read_per_join": "144"
|
|
},
|
|
"used_columns": [
|
|
"id"
|
|
]
|
|
}
|
|
}
|
|
}
|
|
}
|
|
Warnings:
|
|
Note 1003 /* select#1 */ select `test`.`t1`.`id` AS `id`,avg(`test`.`t1`.`id`) OVER (PARTITION BY `test`.`t1`.`id` ) AS `summ` from `test`.`t1`
|
|
EXPLAIN FORMAT=JSON SELECT AVG(id) OVER (PARTITION BY id) summ FROM t1;
|
|
EXPLAIN
|
|
{
|
|
"query_block": {
|
|
"select_id": 1,
|
|
"cost_info": {
|
|
"query_cost": "10.15"
|
|
},
|
|
"windowing": {
|
|
"windows": [
|
|
{
|
|
"name": "<unnamed window>",
|
|
"using_filesort": true,
|
|
"filesort_key": [
|
|
"`id`"
|
|
],
|
|
"frame_buffer": {
|
|
"using_temporary_table": true,
|
|
"optimized_frame_evaluation": true
|
|
},
|
|
"functions": [
|
|
"avg"
|
|
]
|
|
}
|
|
],
|
|
"cost_info": {
|
|
"sort_cost": "9.00"
|
|
},
|
|
"table": {
|
|
"table_name": "t1",
|
|
"access_type": "ALL",
|
|
"rows_examined_per_scan": 9,
|
|
"rows_produced_per_join": 9,
|
|
"filtered": "100.00",
|
|
"cost_info": {
|
|
"read_cost": "0.25",
|
|
"eval_cost": "0.90",
|
|
"prefix_cost": "1.15",
|
|
"data_read_per_join": "144"
|
|
},
|
|
"used_columns": [
|
|
"id"
|
|
]
|
|
}
|
|
}
|
|
}
|
|
}
|
|
Warnings:
|
|
Note 1003 /* select#1 */ select avg(`test`.`t1`.`id`) OVER (PARTITION BY `test`.`t1`.`id` ) AS `summ` from `test`.`t1`
|
|
EXPLAIN FORMAT=JSON SELECT id, AVG(id) OVER (PARTITION BY id) summ,
|
|
AVG(id) OVER (PARTITION BY id) summ2 FROM t1;
|
|
EXPLAIN
|
|
{
|
|
"query_block": {
|
|
"select_id": 1,
|
|
"cost_info": {
|
|
"query_cost": "10.15"
|
|
},
|
|
"windowing": {
|
|
"windows": [
|
|
{
|
|
"name": "<unnamed window>",
|
|
"definition_position": 1,
|
|
"using_temporary_table": true,
|
|
"using_filesort": true,
|
|
"filesort_key": [
|
|
"`id`"
|
|
],
|
|
"frame_buffer": {
|
|
"using_temporary_table": true,
|
|
"optimized_frame_evaluation": true
|
|
},
|
|
"functions": [
|
|
"avg"
|
|
]
|
|
},
|
|
{
|
|
"name": "<unnamed window>",
|
|
"definition_position": 2,
|
|
"last_executed_window": true,
|
|
"frame_buffer": {
|
|
"using_temporary_table": true,
|
|
"optimized_frame_evaluation": true
|
|
},
|
|
"functions": [
|
|
"avg"
|
|
]
|
|
}
|
|
],
|
|
"cost_info": {
|
|
"sort_cost": "9.00"
|
|
},
|
|
"table": {
|
|
"table_name": "t1",
|
|
"access_type": "ALL",
|
|
"rows_examined_per_scan": 9,
|
|
"rows_produced_per_join": 9,
|
|
"filtered": "100.00",
|
|
"cost_info": {
|
|
"read_cost": "0.25",
|
|
"eval_cost": "0.90",
|
|
"prefix_cost": "1.15",
|
|
"data_read_per_join": "144"
|
|
},
|
|
"used_columns": [
|
|
"id"
|
|
]
|
|
}
|
|
}
|
|
}
|
|
}
|
|
Warnings:
|
|
Note 1003 /* select#1 */ select `test`.`t1`.`id` AS `id`,avg(`test`.`t1`.`id`) OVER (PARTITION BY `test`.`t1`.`id` ) AS `summ`,avg(`test`.`t1`.`id`) OVER (PARTITION BY `test`.`t1`.`id` ) AS `summ2` from `test`.`t1`
|
|
EXPLAIN FORMAT=JSON SELECT AVG(id) OVER (PARTITION BY id) summ,
|
|
AVG(id) OVER (PARTITION BY id) summ2 FROM t1;
|
|
EXPLAIN
|
|
{
|
|
"query_block": {
|
|
"select_id": 1,
|
|
"cost_info": {
|
|
"query_cost": "10.15"
|
|
},
|
|
"windowing": {
|
|
"windows": [
|
|
{
|
|
"name": "<unnamed window>",
|
|
"definition_position": 1,
|
|
"using_temporary_table": true,
|
|
"using_filesort": true,
|
|
"filesort_key": [
|
|
"`id`"
|
|
],
|
|
"frame_buffer": {
|
|
"using_temporary_table": true,
|
|
"optimized_frame_evaluation": true
|
|
},
|
|
"functions": [
|
|
"avg"
|
|
]
|
|
},
|
|
{
|
|
"name": "<unnamed window>",
|
|
"definition_position": 2,
|
|
"last_executed_window": true,
|
|
"frame_buffer": {
|
|
"using_temporary_table": true,
|
|
"optimized_frame_evaluation": true
|
|
},
|
|
"functions": [
|
|
"avg"
|
|
]
|
|
}
|
|
],
|
|
"cost_info": {
|
|
"sort_cost": "9.00"
|
|
},
|
|
"table": {
|
|
"table_name": "t1",
|
|
"access_type": "ALL",
|
|
"rows_examined_per_scan": 9,
|
|
"rows_produced_per_join": 9,
|
|
"filtered": "100.00",
|
|
"cost_info": {
|
|
"read_cost": "0.25",
|
|
"eval_cost": "0.90",
|
|
"prefix_cost": "1.15",
|
|
"data_read_per_join": "144"
|
|
},
|
|
"used_columns": [
|
|
"id"
|
|
]
|
|
}
|
|
}
|
|
}
|
|
}
|
|
Warnings:
|
|
Note 1003 /* select#1 */ select avg(`test`.`t1`.`id`) OVER (PARTITION BY `test`.`t1`.`id` ) AS `summ`,avg(`test`.`t1`.`id`) OVER (PARTITION BY `test`.`t1`.`id` ) AS `summ2` from `test`.`t1`
|
|
Bug for AVG in presence of several NULLs
|
|
INSERT INTO t1 VALUES (NULL, 'F');
|
|
ANALYZE TABLE t1;
|
|
Table Op Msg_type Msg_text
|
|
test.t1 analyze status OK
|
|
EXPLAIN FORMAT=JSON SELECT COUNT(id) OVER w, id, AVG(id) OVER w, SUM(id) OVER w, FIRST_VALUE(id) OVER w FROM t1
|
|
WINDOW w AS (ORDER BY id RANGE 1 PRECEDING);
|
|
EXPLAIN
|
|
{
|
|
"query_block": {
|
|
"select_id": 1,
|
|
"cost_info": {
|
|
"query_cost": "11.25"
|
|
},
|
|
"windowing": {
|
|
"windows": [
|
|
{
|
|
"name": "w",
|
|
"using_filesort": true,
|
|
"filesort_key": [
|
|
"`id`"
|
|
],
|
|
"frame_buffer": {
|
|
"using_temporary_table": true,
|
|
"optimized_frame_evaluation": true
|
|
},
|
|
"functions": [
|
|
"count",
|
|
"avg",
|
|
"sum",
|
|
"first_value"
|
|
]
|
|
}
|
|
],
|
|
"cost_info": {
|
|
"sort_cost": "10.00"
|
|
},
|
|
"table": {
|
|
"table_name": "t1",
|
|
"access_type": "ALL",
|
|
"rows_examined_per_scan": 10,
|
|
"rows_produced_per_join": 10,
|
|
"filtered": "100.00",
|
|
"cost_info": {
|
|
"read_cost": "0.25",
|
|
"eval_cost": "1.00",
|
|
"prefix_cost": "1.25",
|
|
"data_read_per_join": "160"
|
|
},
|
|
"used_columns": [
|
|
"id"
|
|
]
|
|
}
|
|
}
|
|
}
|
|
}
|
|
Warnings:
|
|
Note 1003 /* select#1 */ select count(`test`.`t1`.`id`) OVER `w` AS `COUNT(id) OVER w`,`test`.`t1`.`id` AS `id`,avg(`test`.`t1`.`id`) OVER `w` AS `AVG(id) OVER w`,sum(`test`.`t1`.`id`) OVER `w` AS `SUM(id) OVER w`,first_value(`test`.`t1`.`id`) OVER `w` AS `FIRST_VALUE(id) OVER w` from `test`.`t1` window `w` AS (ORDER BY `test`.`t1`.`id` RANGE BETWEEN 1 PRECEDING AND CURRENT ROW)
|
|
Check frame size, COUNT(*) vs COUNT(<column>) in frames with NULLs
|
|
EXPLAIN FORMAT=JSON SELECT id, count(id) over w, count(*) over w, FIRST_VALUE(id) OVER w FROM t1
|
|
WINDOW w AS (ORDER BY id ASC RANGE BETWEEN 2 PRECEDING AND 1 PRECEDING);
|
|
EXPLAIN
|
|
{
|
|
"query_block": {
|
|
"select_id": 1,
|
|
"cost_info": {
|
|
"query_cost": "11.25"
|
|
},
|
|
"windowing": {
|
|
"windows": [
|
|
{
|
|
"name": "w",
|
|
"using_filesort": true,
|
|
"filesort_key": [
|
|
"`id`"
|
|
],
|
|
"frame_buffer": {
|
|
"using_temporary_table": true,
|
|
"optimized_frame_evaluation": true
|
|
},
|
|
"functions": [
|
|
"count",
|
|
"count",
|
|
"first_value"
|
|
]
|
|
}
|
|
],
|
|
"cost_info": {
|
|
"sort_cost": "10.00"
|
|
},
|
|
"table": {
|
|
"table_name": "t1",
|
|
"access_type": "ALL",
|
|
"rows_examined_per_scan": 10,
|
|
"rows_produced_per_join": 10,
|
|
"filtered": "100.00",
|
|
"cost_info": {
|
|
"read_cost": "0.25",
|
|
"eval_cost": "1.00",
|
|
"prefix_cost": "1.25",
|
|
"data_read_per_join": "160"
|
|
},
|
|
"used_columns": [
|
|
"id"
|
|
]
|
|
}
|
|
}
|
|
}
|
|
}
|
|
Warnings:
|
|
Note 1003 /* select#1 */ select `test`.`t1`.`id` AS `id`,count(`test`.`t1`.`id`) OVER `w` AS `count(id) over w`,count(0) OVER `w` AS `count(*) over w`,first_value(`test`.`t1`.`id`) OVER `w` AS `FIRST_VALUE(id) OVER w` from `test`.`t1` window `w` AS (ORDER BY `test`.`t1`.`id` RANGE BETWEEN 2 PRECEDING AND 1 PRECEDING)
|
|
EXPLAIN FORMAT=JSON SELECT id, count(id) over w, count(*) over w, FIRST_VALUE(id) OVER w FROM t1
|
|
WINDOW w AS (ORDER BY id DESC RANGE BETWEEN 2 PRECEDING AND 1 PRECEDING);
|
|
EXPLAIN
|
|
{
|
|
"query_block": {
|
|
"select_id": 1,
|
|
"cost_info": {
|
|
"query_cost": "11.25"
|
|
},
|
|
"windowing": {
|
|
"windows": [
|
|
{
|
|
"name": "w",
|
|
"using_filesort": true,
|
|
"filesort_key": [
|
|
"`id` desc"
|
|
],
|
|
"frame_buffer": {
|
|
"using_temporary_table": true,
|
|
"optimized_frame_evaluation": true
|
|
},
|
|
"functions": [
|
|
"count",
|
|
"count",
|
|
"first_value"
|
|
]
|
|
}
|
|
],
|
|
"cost_info": {
|
|
"sort_cost": "10.00"
|
|
},
|
|
"table": {
|
|
"table_name": "t1",
|
|
"access_type": "ALL",
|
|
"rows_examined_per_scan": 10,
|
|
"rows_produced_per_join": 10,
|
|
"filtered": "100.00",
|
|
"cost_info": {
|
|
"read_cost": "0.25",
|
|
"eval_cost": "1.00",
|
|
"prefix_cost": "1.25",
|
|
"data_read_per_join": "160"
|
|
},
|
|
"used_columns": [
|
|
"id"
|
|
]
|
|
}
|
|
}
|
|
}
|
|
}
|
|
Warnings:
|
|
Note 1003 /* select#1 */ select `test`.`t1`.`id` AS `id`,count(`test`.`t1`.`id`) OVER `w` AS `count(id) over w`,count(0) OVER `w` AS `count(*) over w`,first_value(`test`.`t1`.`id`) OVER `w` AS `FIRST_VALUE(id) OVER w` from `test`.`t1` window `w` AS (ORDER BY `test`.`t1`.`id` desc RANGE BETWEEN 2 PRECEDING AND 1 PRECEDING)
|
|
CREATE TABLE ss(c CHAR(1));
|
|
INSERT INTO ss VALUES ('M');
|
|
ANALYZE TABLE ss;
|
|
Table Op Msg_type Msg_text
|
|
test.ss analyze status OK
|
|
EXPLAIN FORMAT=JSON SELECT sex, NTILE(2) OVER w, SUM(ASCII(sex)) OVER w s FROM t1
|
|
HAVING sex=(SELECT c FROM ss LIMIT 1)
|
|
WINDOW w AS (ORDER BY id ROWS UNBOUNDED PRECEDING);
|
|
EXPLAIN
|
|
{
|
|
"query_block": {
|
|
"select_id": 1,
|
|
"cost_info": {
|
|
"query_cost": "11.25"
|
|
},
|
|
"windowing": {
|
|
"windows": [
|
|
{
|
|
"name": "w",
|
|
"using_filesort": true,
|
|
"filesort_key": [
|
|
"`id`"
|
|
],
|
|
"frame_buffer": {
|
|
"using_temporary_table": true,
|
|
"optimized_frame_evaluation": true
|
|
},
|
|
"functions": [
|
|
"ntile",
|
|
"sum"
|
|
]
|
|
}
|
|
],
|
|
"cost_info": {
|
|
"sort_cost": "10.00"
|
|
},
|
|
"table": {
|
|
"table_name": "t1",
|
|
"access_type": "ALL",
|
|
"rows_examined_per_scan": 10,
|
|
"rows_produced_per_join": 10,
|
|
"filtered": "100.00",
|
|
"cost_info": {
|
|
"read_cost": "0.25",
|
|
"eval_cost": "1.00",
|
|
"prefix_cost": "1.25",
|
|
"data_read_per_join": "160"
|
|
},
|
|
"used_columns": [
|
|
"id",
|
|
"sex"
|
|
]
|
|
},
|
|
"having_subqueries": [
|
|
{
|
|
"dependent": false,
|
|
"cacheable": true,
|
|
"query_block": {
|
|
"select_id": 2,
|
|
"cost_info": {
|
|
"query_cost": "0.35"
|
|
},
|
|
"table": {
|
|
"table_name": "ss",
|
|
"access_type": "ALL",
|
|
"rows_examined_per_scan": 1,
|
|
"rows_produced_per_join": 1,
|
|
"filtered": "100.00",
|
|
"cost_info": {
|
|
"read_cost": "0.25",
|
|
"eval_cost": "0.10",
|
|
"prefix_cost": "0.35",
|
|
"data_read_per_join": "8"
|
|
},
|
|
"used_columns": [
|
|
"c"
|
|
]
|
|
}
|
|
}
|
|
}
|
|
]
|
|
}
|
|
}
|
|
}
|
|
Warnings:
|
|
Note 3599 Window function 'ntile' ignores the frame clause of window 'w' and aggregates over the whole partition
|
|
Note 1003 /* select#1 */ select `test`.`t1`.`sex` AS `sex`,ntile(2) OVER `w` AS `NTILE(2) OVER w`,sum(ascii(`test`.`t1`.`sex`)) OVER `w` AS `s` from `test`.`t1` having (`test`.`t1`.`sex` = (/* select#2 */ select `test`.`ss`.`c` from `test`.`ss` limit 1)) window `w` AS (ORDER BY `test`.`t1`.`id` ROWS BETWEEN UNBOUNDED PRECEDING AND CURRENT ROW)
|
|
EXPLAIN FORMAT=JSON SELECT sex, AVG(id), ROW_NUMBER() OVER w FROM t1
|
|
GROUP BY sex HAVING sex='M' OR sex IS NULL
|
|
WINDOW w AS (ORDER BY AVG(id)) ORDER BY sex DESC;
|
|
EXPLAIN
|
|
{
|
|
"query_block": {
|
|
"select_id": 1,
|
|
"cost_info": {
|
|
"query_cost": "21.25"
|
|
},
|
|
"ordering_operation": {
|
|
"using_filesort": true,
|
|
"cost_info": {
|
|
"sort_cost": "10.00"
|
|
},
|
|
"windowing": {
|
|
"windows": [
|
|
{
|
|
"name": "w",
|
|
"using_temporary_table": true,
|
|
"using_filesort": true,
|
|
"filesort_key": [
|
|
"avg(`id`)"
|
|
],
|
|
"functions": [
|
|
"row_number"
|
|
]
|
|
}
|
|
],
|
|
"cost_info": {
|
|
"sort_cost": "10.00"
|
|
},
|
|
"grouping_operation": {
|
|
"using_temporary_table": true,
|
|
"using_filesort": false,
|
|
"table": {
|
|
"table_name": "t1",
|
|
"access_type": "ALL",
|
|
"rows_examined_per_scan": 10,
|
|
"rows_produced_per_join": 10,
|
|
"filtered": "100.00",
|
|
"cost_info": {
|
|
"read_cost": "0.25",
|
|
"eval_cost": "1.00",
|
|
"prefix_cost": "1.25",
|
|
"data_read_per_join": "160"
|
|
},
|
|
"used_columns": [
|
|
"id",
|
|
"sex"
|
|
]
|
|
}
|
|
}
|
|
}
|
|
}
|
|
}
|
|
}
|
|
Warnings:
|
|
Note 1003 /* select#1 */ select `test`.`t1`.`sex` AS `sex`,avg(`test`.`t1`.`id`) AS `AVG(id)`,row_number() OVER `w` AS `ROW_NUMBER() OVER w` from `test`.`t1` group by `test`.`t1`.`sex` desc having ((`test`.`t1`.`sex` = 'M') or (`test`.`t1`.`sex` is null)) window `w` AS (ORDER BY avg(`test`.`t1`.`id`) ) order by `test`.`t1`.`sex` desc
|
|
DROP TABLE t, t1, t11, t2, t22, t3, t5, t6, tj, ss;
|
|
----------------------------------------------------------------------
|
|
- ORDER BY + RANK with more than one ordering expression
|
|
----------------------------------------------------------------------
|
|
CREATE TABLE t(i INT, j INT, k INT);
|
|
INSERT INTO t VALUES (1,1,1),
|
|
(1,1,2),
|
|
(1,1,2),
|
|
(1,2,1),
|
|
(1,2,2),
|
|
(2,1,1),
|
|
(2,1,1),
|
|
(2,1,2),
|
|
(2,2,1),
|
|
(2,2,2);
|
|
ANALYZE TABLE t;
|
|
Table Op Msg_type Msg_text
|
|
test.t analyze status OK
|
|
EXPLAIN FORMAT=JSON SELECT *, RANK() OVER (ORDER BY i,j,k) AS O_IJK,
|
|
RANK() OVER (ORDER BY j) AS O_J,
|
|
RANK() OVER (ORDER BY k,j) AS O_KJ FROM t ORDER BY i,j,k;
|
|
EXPLAIN
|
|
{
|
|
"query_block": {
|
|
"select_id": 1,
|
|
"cost_info": {
|
|
"query_cost": "41.25"
|
|
},
|
|
"ordering_operation": {
|
|
"using_filesort": true,
|
|
"cost_info": {
|
|
"sort_cost": "10.00"
|
|
},
|
|
"windowing": {
|
|
"windows": [
|
|
{
|
|
"name": "<unnamed window>",
|
|
"definition_position": 1,
|
|
"using_temporary_table": true,
|
|
"using_filesort": true,
|
|
"filesort_key": [
|
|
"`i`",
|
|
"`j`",
|
|
"`k`"
|
|
],
|
|
"functions": [
|
|
"rank"
|
|
]
|
|
},
|
|
{
|
|
"name": "<unnamed window>",
|
|
"definition_position": 2,
|
|
"using_temporary_table": true,
|
|
"using_filesort": true,
|
|
"filesort_key": [
|
|
"`j`"
|
|
],
|
|
"functions": [
|
|
"rank"
|
|
]
|
|
},
|
|
{
|
|
"name": "<unnamed window>",
|
|
"definition_position": 3,
|
|
"last_executed_window": true,
|
|
"using_temporary_table": true,
|
|
"using_filesort": true,
|
|
"filesort_key": [
|
|
"`k`",
|
|
"`j`"
|
|
],
|
|
"functions": [
|
|
"rank"
|
|
]
|
|
}
|
|
],
|
|
"cost_info": {
|
|
"sort_cost": "30.00"
|
|
},
|
|
"table": {
|
|
"table_name": "t",
|
|
"access_type": "ALL",
|
|
"rows_examined_per_scan": 10,
|
|
"rows_produced_per_join": 10,
|
|
"filtered": "100.00",
|
|
"cost_info": {
|
|
"read_cost": "0.25",
|
|
"eval_cost": "1.00",
|
|
"prefix_cost": "1.25",
|
|
"data_read_per_join": "160"
|
|
},
|
|
"used_columns": [
|
|
"i",
|
|
"j",
|
|
"k"
|
|
]
|
|
}
|
|
}
|
|
}
|
|
}
|
|
}
|
|
Warnings:
|
|
Note 1003 /* select#1 */ select `test`.`t`.`i` AS `i`,`test`.`t`.`j` AS `j`,`test`.`t`.`k` AS `k`,rank() OVER (ORDER BY `test`.`t`.`i`,`test`.`t`.`j`,`test`.`t`.`k` ) AS `O_IJK`,rank() OVER (ORDER BY `test`.`t`.`j` ) AS `O_J`,rank() OVER (ORDER BY `test`.`t`.`k`,`test`.`t`.`j` ) AS `O_KJ` from `test`.`t` order by `test`.`t`.`i`,`test`.`t`.`j`,`test`.`t`.`k`
|
|
DROP TABLE t;
|
|
----------------------------------------------------------------------
|
|
- Gulutzan's sanity tests in
|
|
- http://ocelot.ca/blog/blog/2016/04/18/mariadb-10-2-window-functions/
|
|
- His comments are quoted.
|
|
----------------------------------------------------------------------
|
|
CREATE TABLE t1 (s1 INT, s2 CHAR(5));
|
|
INSERT INTO t1 VALUES (1, 'a');
|
|
INSERT INTO t1 VALUES (NULL, NULL);
|
|
INSERT INTO t1 VALUES (1, NULL);
|
|
INSERT INTO t1 VALUES (NULL, 'a');
|
|
INSERT INTO t1 VALUES (2, 'b');
|
|
INSERT INTO t1 VALUES (-1, '');
|
|
ANALYZE TABLE t1;
|
|
Table Op Msg_type Msg_text
|
|
test.t1 analyze status OK
|
|
"The following statements all cause the MariaDB server to crash"
|
|
MySQL doesn't crash
|
|
EXPLAIN FORMAT=JSON SELECT ROW_NUMBER() OVER ();
|
|
EXPLAIN
|
|
{
|
|
"query_block": {
|
|
"select_id": 1,
|
|
"message": "No tables used"
|
|
}
|
|
}
|
|
Warnings:
|
|
Note 1003 /* select#1 */ select row_number() OVER () AS `ROW_NUMBER() OVER ()`
|
|
EXPLAIN FORMAT=JSON SELECT *, ABS(ROW_NUMBER() OVER (ORDER BY s1,s2))
|
|
- ROW_NUMBER() OVER (ORDER BY s1,s2) AS X FROM t1;
|
|
EXPLAIN
|
|
{
|
|
"query_block": {
|
|
"select_id": 1,
|
|
"cost_info": {
|
|
"query_cost": "6.85"
|
|
},
|
|
"windowing": {
|
|
"windows": [
|
|
{
|
|
"name": "<unnamed window>",
|
|
"definition_position": 1,
|
|
"using_temporary_table": true,
|
|
"using_filesort": true,
|
|
"filesort_key": [
|
|
"`s1`",
|
|
"`s2`"
|
|
],
|
|
"functions": [
|
|
"row_number"
|
|
]
|
|
},
|
|
{
|
|
"name": "<unnamed window>",
|
|
"definition_position": 2,
|
|
"last_executed_window": true,
|
|
"functions": [
|
|
"row_number"
|
|
]
|
|
}
|
|
],
|
|
"cost_info": {
|
|
"sort_cost": "6.00"
|
|
},
|
|
"table": {
|
|
"table_name": "t1",
|
|
"access_type": "ALL",
|
|
"rows_examined_per_scan": 6,
|
|
"rows_produced_per_join": 6,
|
|
"filtered": "100.00",
|
|
"cost_info": {
|
|
"read_cost": "0.25",
|
|
"eval_cost": "0.60",
|
|
"prefix_cost": "0.85",
|
|
"data_read_per_join": "192"
|
|
},
|
|
"used_columns": [
|
|
"s1",
|
|
"s2"
|
|
]
|
|
}
|
|
}
|
|
}
|
|
}
|
|
Warnings:
|
|
Note 1003 /* select#1 */ select `test`.`t1`.`s1` AS `s1`,`test`.`t1`.`s2` AS `s2`,(abs(row_number() OVER (ORDER BY `test`.`t1`.`s1`,`test`.`t1`.`s2` ) ) - row_number() OVER (ORDER BY `test`.`t1`.`s1`,`test`.`t1`.`s2` ) ) AS `X` from `test`.`t1`
|
|
EXPLAIN FORMAT=JSON SELECT RANK() OVER (ORDER BY AVG(s1)) FROM t1;
|
|
EXPLAIN
|
|
{
|
|
"query_block": {
|
|
"select_id": 1,
|
|
"cost_info": {
|
|
"query_cost": "0.85"
|
|
},
|
|
"table": {
|
|
"table_name": "t1",
|
|
"access_type": "ALL",
|
|
"rows_examined_per_scan": 6,
|
|
"rows_produced_per_join": 6,
|
|
"filtered": "100.00",
|
|
"cost_info": {
|
|
"read_cost": "0.25",
|
|
"eval_cost": "0.60",
|
|
"prefix_cost": "0.85",
|
|
"data_read_per_join": "192"
|
|
},
|
|
"used_columns": [
|
|
"s1"
|
|
]
|
|
}
|
|
}
|
|
}
|
|
Warnings:
|
|
Note 1003 /* select#1 */ select rank() OVER (ORDER BY avg(`test`.`t1`.`s1`) ) AS `RANK() OVER (ORDER BY AVG(s1))` from `test`.`t1`
|
|
"The following statements all give the wrong answers with MariaDB"
|
|
Correct with MySQL.
|
|
EXPLAIN FORMAT=JSON SELECT COUNT(*) OVER (ORDER BY s2) FROM t1 WHERE s2 IS NULL;
|
|
EXPLAIN
|
|
{
|
|
"query_block": {
|
|
"select_id": 1,
|
|
"cost_info": {
|
|
"query_cost": "1.85"
|
|
},
|
|
"windowing": {
|
|
"windows": [
|
|
{
|
|
"name": "<unnamed window>",
|
|
"using_filesort": true,
|
|
"filesort_key": [
|
|
"`s2`"
|
|
],
|
|
"frame_buffer": {
|
|
"using_temporary_table": true,
|
|
"optimized_frame_evaluation": true
|
|
},
|
|
"functions": [
|
|
"count"
|
|
]
|
|
}
|
|
],
|
|
"cost_info": {
|
|
"sort_cost": "1.00"
|
|
},
|
|
"table": {
|
|
"table_name": "t1",
|
|
"access_type": "ALL",
|
|
"rows_examined_per_scan": 6,
|
|
"rows_produced_per_join": 1,
|
|
"filtered": "16.67",
|
|
"cost_info": {
|
|
"read_cost": "0.75",
|
|
"eval_cost": "0.10",
|
|
"prefix_cost": "0.85",
|
|
"data_read_per_join": "32"
|
|
},
|
|
"used_columns": [
|
|
"s2"
|
|
],
|
|
"attached_condition": "(`test`.`t1`.`s2` is null)"
|
|
}
|
|
}
|
|
}
|
|
}
|
|
Warnings:
|
|
Note 1003 /* select#1 */ select count(0) OVER (ORDER BY `test`.`t1`.`s2` ) AS `COUNT(*) OVER (ORDER BY s2)` from `test`.`t1` where (`test`.`t1`.`s2` is null)
|
|
EXPLAIN FORMAT=JSON SELECT * FROM (
|
|
SELECT *,DENSE_RANK() OVER (ORDER BY s2 DESC),
|
|
DENSE_RANK() OVER (ORDER BY s2) FROM t1
|
|
) alias ORDER BY s1,s2;
|
|
EXPLAIN
|
|
{
|
|
"query_block": {
|
|
"select_id": 1,
|
|
"cost_info": {
|
|
"query_cost": "9.17"
|
|
},
|
|
"ordering_operation": {
|
|
"using_filesort": true,
|
|
"cost_info": {
|
|
"sort_cost": "6.00"
|
|
},
|
|
"table": {
|
|
"table_name": "alias",
|
|
"access_type": "ALL",
|
|
"rows_examined_per_scan": 6,
|
|
"rows_produced_per_join": 6,
|
|
"filtered": "100.00",
|
|
"cost_info": {
|
|
"read_cost": "2.58",
|
|
"eval_cost": "0.60",
|
|
"prefix_cost": "3.18",
|
|
"data_read_per_join": "288"
|
|
},
|
|
"used_columns": [
|
|
"s1",
|
|
"s2",
|
|
"DENSE_RANK() OVER (ORDER BY s2 DESC)",
|
|
"DENSE_RANK() OVER (ORDER BY s2)"
|
|
],
|
|
"materialized_from_subquery": {
|
|
"using_temporary_table": true,
|
|
"dependent": false,
|
|
"cacheable": true,
|
|
"query_block": {
|
|
"select_id": 2,
|
|
"cost_info": {
|
|
"query_cost": "12.85"
|
|
},
|
|
"windowing": {
|
|
"windows": [
|
|
{
|
|
"name": "<unnamed window>",
|
|
"definition_position": 1,
|
|
"using_temporary_table": true,
|
|
"using_filesort": true,
|
|
"filesort_key": [
|
|
"`s2` desc"
|
|
],
|
|
"functions": [
|
|
"dense_rank"
|
|
]
|
|
},
|
|
{
|
|
"name": "<unnamed window>",
|
|
"definition_position": 2,
|
|
"last_executed_window": true,
|
|
"using_filesort": true,
|
|
"filesort_key": [
|
|
"`s2`"
|
|
],
|
|
"functions": [
|
|
"dense_rank"
|
|
]
|
|
}
|
|
],
|
|
"cost_info": {
|
|
"sort_cost": "12.00"
|
|
},
|
|
"table": {
|
|
"table_name": "t1",
|
|
"access_type": "ALL",
|
|
"rows_examined_per_scan": 6,
|
|
"rows_produced_per_join": 6,
|
|
"filtered": "100.00",
|
|
"cost_info": {
|
|
"read_cost": "0.25",
|
|
"eval_cost": "0.60",
|
|
"prefix_cost": "0.85",
|
|
"data_read_per_join": "192"
|
|
},
|
|
"used_columns": [
|
|
"s1",
|
|
"s2"
|
|
]
|
|
}
|
|
}
|
|
}
|
|
}
|
|
}
|
|
}
|
|
}
|
|
}
|
|
Warnings:
|
|
Note 1003 /* select#1 */ select `alias`.`s1` AS `s1`,`alias`.`s2` AS `s2`,`alias`.`DENSE_RANK() OVER (ORDER BY s2 DESC)` AS `DENSE_RANK() OVER (ORDER BY s2 DESC)`,`alias`.`DENSE_RANK() OVER (ORDER BY s2)` AS `DENSE_RANK() OVER (ORDER BY s2)` from (/* select#2 */ select `test`.`t1`.`s1` AS `s1`,`test`.`t1`.`s2` AS `s2`,dense_rank() OVER (ORDER BY `test`.`t1`.`s2` desc ) AS `DENSE_RANK() OVER (ORDER BY s2 DESC)`,dense_rank() OVER (ORDER BY `test`.`t1`.`s2` ) AS `DENSE_RANK() OVER (ORDER BY s2)` from `test`.`t1`) `alias` order by `alias`.`s1`,`alias`.`s2`
|
|
EXPLAIN FORMAT=JSON SELECT * FROM (
|
|
SELECT *, SUM(s1) OVER (ORDER BY s1) FROM t1 ORDER BY s1
|
|
) alias ORDER BY s1,s2;
|
|
EXPLAIN
|
|
{
|
|
"query_block": {
|
|
"select_id": 1,
|
|
"cost_info": {
|
|
"query_cost": "9.17"
|
|
},
|
|
"ordering_operation": {
|
|
"using_filesort": true,
|
|
"cost_info": {
|
|
"sort_cost": "6.00"
|
|
},
|
|
"table": {
|
|
"table_name": "alias",
|
|
"access_type": "ALL",
|
|
"rows_examined_per_scan": 6,
|
|
"rows_produced_per_join": 6,
|
|
"filtered": "100.00",
|
|
"cost_info": {
|
|
"read_cost": "2.58",
|
|
"eval_cost": "0.60",
|
|
"prefix_cost": "3.18",
|
|
"data_read_per_join": "288"
|
|
},
|
|
"used_columns": [
|
|
"s1",
|
|
"s2",
|
|
"SUM(s1) OVER (ORDER BY s1)"
|
|
],
|
|
"materialized_from_subquery": {
|
|
"using_temporary_table": true,
|
|
"dependent": false,
|
|
"cacheable": true,
|
|
"query_block": {
|
|
"select_id": 2,
|
|
"cost_info": {
|
|
"query_cost": "12.85"
|
|
},
|
|
"ordering_operation": {
|
|
"using_filesort": true,
|
|
"cost_info": {
|
|
"sort_cost": "6.00"
|
|
},
|
|
"windowing": {
|
|
"windows": [
|
|
{
|
|
"name": "<unnamed window>",
|
|
"using_temporary_table": true,
|
|
"using_filesort": true,
|
|
"filesort_key": [
|
|
"`s1`"
|
|
],
|
|
"frame_buffer": {
|
|
"using_temporary_table": true,
|
|
"optimized_frame_evaluation": true
|
|
},
|
|
"functions": [
|
|
"sum"
|
|
]
|
|
}
|
|
],
|
|
"cost_info": {
|
|
"sort_cost": "6.00"
|
|
},
|
|
"table": {
|
|
"table_name": "t1",
|
|
"access_type": "ALL",
|
|
"rows_examined_per_scan": 6,
|
|
"rows_produced_per_join": 6,
|
|
"filtered": "100.00",
|
|
"cost_info": {
|
|
"read_cost": "0.25",
|
|
"eval_cost": "0.60",
|
|
"prefix_cost": "0.85",
|
|
"data_read_per_join": "192"
|
|
},
|
|
"used_columns": [
|
|
"s1",
|
|
"s2"
|
|
]
|
|
}
|
|
}
|
|
}
|
|
}
|
|
}
|
|
}
|
|
}
|
|
}
|
|
}
|
|
Warnings:
|
|
Note 1003 /* select#1 */ select `alias`.`s1` AS `s1`,`alias`.`s2` AS `s2`,`alias`.`SUM(s1) OVER (ORDER BY s1)` AS `SUM(s1) OVER (ORDER BY s1)` from (/* select#2 */ select `test`.`t1`.`s1` AS `s1`,`test`.`t1`.`s2` AS `s2`,sum(`test`.`t1`.`s1`) OVER (ORDER BY `test`.`t1`.`s1` ) AS `SUM(s1) OVER (ORDER BY s1)` from `test`.`t1` order by `test`.`t1`.`s1`) `alias` order by `alias`.`s1`,`alias`.`s2`
|
|
EXPLAIN FORMAT=JSON SELECT AVG(s1), RANK() OVER (ORDER BY s1) FROM t1;
|
|
ERROR 42000: In aggregated query without GROUP BY, expression #1 of PARTITION BY or ORDER BY clause of window '<unnamed window>' contains nonaggregated column 'test.t1.s1'; this is incompatible with sql_mode=only_full_group_by
|
|
"The following statement causes the client to hang (it loops in
|
|
mysql_store_result, I think this is the first time I've seen this type of
|
|
error)"
|
|
No issue with MySQL
|
|
EXPLAIN FORMAT=JSON SELECT *, AVG(s1) OVER () FROM t1;
|
|
EXPLAIN
|
|
{
|
|
"query_block": {
|
|
"select_id": 1,
|
|
"cost_info": {
|
|
"query_cost": "0.85"
|
|
},
|
|
"windowing": {
|
|
"windows": [
|
|
{
|
|
"name": "<unnamed window>",
|
|
"frame_buffer": {
|
|
"using_temporary_table": true,
|
|
"optimized_frame_evaluation": true
|
|
},
|
|
"functions": [
|
|
"avg"
|
|
]
|
|
}
|
|
],
|
|
"table": {
|
|
"table_name": "t1",
|
|
"access_type": "ALL",
|
|
"rows_examined_per_scan": 6,
|
|
"rows_produced_per_join": 6,
|
|
"filtered": "100.00",
|
|
"cost_info": {
|
|
"read_cost": "0.25",
|
|
"eval_cost": "0.60",
|
|
"prefix_cost": "0.85",
|
|
"data_read_per_join": "192"
|
|
},
|
|
"used_columns": [
|
|
"s1",
|
|
"s2"
|
|
]
|
|
}
|
|
}
|
|
}
|
|
}
|
|
Warnings:
|
|
Note 1003 /* select#1 */ select `test`.`t1`.`s1` AS `s1`,`test`.`t1`.`s2` AS `s2`,avg(`test`.`t1`.`s1`) OVER () AS `AVG(s1) OVER ()` from `test`.`t1`
|
|
EXPLAIN FORMAT=JSON SELECT *, AVG(s1) OVER (ROWS UNBOUNDED PRECEDING) FROM t1;
|
|
EXPLAIN
|
|
{
|
|
"query_block": {
|
|
"select_id": 1,
|
|
"cost_info": {
|
|
"query_cost": "0.85"
|
|
},
|
|
"windowing": {
|
|
"windows": [
|
|
{
|
|
"name": "<unnamed window>",
|
|
"functions": [
|
|
"avg"
|
|
]
|
|
}
|
|
],
|
|
"table": {
|
|
"table_name": "t1",
|
|
"access_type": "ALL",
|
|
"rows_examined_per_scan": 6,
|
|
"rows_produced_per_join": 6,
|
|
"filtered": "100.00",
|
|
"cost_info": {
|
|
"read_cost": "0.25",
|
|
"eval_cost": "0.60",
|
|
"prefix_cost": "0.85",
|
|
"data_read_per_join": "192"
|
|
},
|
|
"used_columns": [
|
|
"s1",
|
|
"s2"
|
|
]
|
|
}
|
|
}
|
|
}
|
|
}
|
|
Warnings:
|
|
Note 1003 /* select#1 */ select `test`.`t1`.`s1` AS `s1`,`test`.`t1`.`s2` AS `s2`,avg(`test`.`t1`.`s1`) OVER (ROWS BETWEEN UNBOUNDED PRECEDING AND CURRENT ROW) AS `AVG(s1) OVER (ROWS UNBOUNDED PRECEDING)` from `test`.`t1`
|
|
DROP TABLE t1;
|
|
Some negative tests (from Srikanth)
|
|
CREATE TABLE t (a INT, b INT, c INT);
|
|
INSERT INTO t VALUES (1,1,1), (1,1,2), (1,1,3),
|
|
(1,2,1), (1,2,2), (1,2,3),
|
|
(1,3,1), (1,3,2), (1,3,3),
|
|
(2,1,1), (2,1,2), (2,1,3),
|
|
(2,2,1), (2,2,2), (2,2,3),
|
|
(2,3,1), (2,3,2), (2,3,3);
|
|
ANALYZE TABLE t;
|
|
Table Op Msg_type Msg_text
|
|
test.t analyze status OK
|
|
Wfs OK in ORDER BY, but not in WHERE or HAVING clauses
|
|
EXPLAIN FORMAT=JSON SELECT * FROM t ORDER BY RANK() OVER (ORDER BY a DESC,b,c);
|
|
EXPLAIN
|
|
{
|
|
"query_block": {
|
|
"select_id": 1,
|
|
"cost_info": {
|
|
"query_cost": "38.05"
|
|
},
|
|
"ordering_operation": {
|
|
"using_filesort": true,
|
|
"cost_info": {
|
|
"sort_cost": "18.00"
|
|
},
|
|
"windowing": {
|
|
"windows": [
|
|
{
|
|
"name": "<unnamed window>",
|
|
"using_temporary_table": true,
|
|
"using_filesort": true,
|
|
"filesort_key": [
|
|
"`a` desc",
|
|
"`b`",
|
|
"`c`"
|
|
],
|
|
"functions": [
|
|
"rank"
|
|
]
|
|
}
|
|
],
|
|
"cost_info": {
|
|
"sort_cost": "18.00"
|
|
},
|
|
"table": {
|
|
"table_name": "t",
|
|
"access_type": "ALL",
|
|
"rows_examined_per_scan": 18,
|
|
"rows_produced_per_join": 18,
|
|
"filtered": "100.00",
|
|
"cost_info": {
|
|
"read_cost": "0.25",
|
|
"eval_cost": "1.80",
|
|
"prefix_cost": "2.05",
|
|
"data_read_per_join": "288"
|
|
},
|
|
"used_columns": [
|
|
"a",
|
|
"b",
|
|
"c"
|
|
]
|
|
}
|
|
}
|
|
}
|
|
}
|
|
}
|
|
Warnings:
|
|
Note 1003 /* select#1 */ select `test`.`t`.`a` AS `a`,`test`.`t`.`b` AS `b`,`test`.`t`.`c` AS `c` from `test`.`t` order by rank() OVER (ORDER BY `test`.`t`.`a` desc,`test`.`t`.`b`,`test`.`t`.`c` )
|
|
EXPLAIN FORMAT=JSON SELECT *, RANK() OVER (ORDER BY a DESC,b,c) AS `rank` FROM t ORDER BY `rank`;
|
|
EXPLAIN
|
|
{
|
|
"query_block": {
|
|
"select_id": 1,
|
|
"cost_info": {
|
|
"query_cost": "38.05"
|
|
},
|
|
"ordering_operation": {
|
|
"using_filesort": true,
|
|
"cost_info": {
|
|
"sort_cost": "18.00"
|
|
},
|
|
"windowing": {
|
|
"windows": [
|
|
{
|
|
"name": "<unnamed window>",
|
|
"using_temporary_table": true,
|
|
"using_filesort": true,
|
|
"filesort_key": [
|
|
"`a` desc",
|
|
"`b`",
|
|
"`c`"
|
|
],
|
|
"functions": [
|
|
"rank"
|
|
]
|
|
}
|
|
],
|
|
"cost_info": {
|
|
"sort_cost": "18.00"
|
|
},
|
|
"table": {
|
|
"table_name": "t",
|
|
"access_type": "ALL",
|
|
"rows_examined_per_scan": 18,
|
|
"rows_produced_per_join": 18,
|
|
"filtered": "100.00",
|
|
"cost_info": {
|
|
"read_cost": "0.25",
|
|
"eval_cost": "1.80",
|
|
"prefix_cost": "2.05",
|
|
"data_read_per_join": "288"
|
|
},
|
|
"used_columns": [
|
|
"a",
|
|
"b",
|
|
"c"
|
|
]
|
|
}
|
|
}
|
|
}
|
|
}
|
|
}
|
|
Warnings:
|
|
Note 1003 /* select#1 */ select `test`.`t`.`a` AS `a`,`test`.`t`.`b` AS `b`,`test`.`t`.`c` AS `c`,rank() OVER (ORDER BY `test`.`t`.`a` desc,`test`.`t`.`b`,`test`.`t`.`c` ) AS `rank` from `test`.`t` order by `rank`
|
|
Windows should only be allowed in order by of a simple table query
|
|
This is legal, though:
|
|
(select a from t) union (select a from t order by (row_number() over ()));
|
|
a
|
|
1
|
|
2
|
|
Non constants as frame bounds
|
|
Non-unique window name
|
|
Illegal legacy position indication in window's ORDER BY clause
|
|
EXPLAIN FORMAT=JSON SELECT * FROM (
|
|
SELECT a,b,c, RANK() OVER (ORDER BY 1*1) FROM t
|
|
) alias ORDER BY a,b,c;
|
|
EXPLAIN
|
|
{
|
|
"query_block": {
|
|
"select_id": 1,
|
|
"cost_info": {
|
|
"query_cost": "22.52"
|
|
},
|
|
"ordering_operation": {
|
|
"using_filesort": true,
|
|
"cost_info": {
|
|
"sort_cost": "18.00"
|
|
},
|
|
"table": {
|
|
"table_name": "alias",
|
|
"access_type": "ALL",
|
|
"rows_examined_per_scan": 18,
|
|
"rows_produced_per_join": 18,
|
|
"filtered": "100.00",
|
|
"cost_info": {
|
|
"read_cost": "2.73",
|
|
"eval_cost": "1.80",
|
|
"prefix_cost": "4.53",
|
|
"data_read_per_join": "576"
|
|
},
|
|
"used_columns": [
|
|
"a",
|
|
"b",
|
|
"c",
|
|
"RANK() OVER (ORDER BY 1*1)"
|
|
],
|
|
"materialized_from_subquery": {
|
|
"using_temporary_table": true,
|
|
"dependent": false,
|
|
"cacheable": true,
|
|
"query_block": {
|
|
"select_id": 2,
|
|
"cost_info": {
|
|
"query_cost": "20.05"
|
|
},
|
|
"windowing": {
|
|
"windows": [
|
|
{
|
|
"name": "<unnamed window>",
|
|
"using_filesort": true,
|
|
"filesort_key": [
|
|
"(1 * 1)"
|
|
],
|
|
"functions": [
|
|
"rank"
|
|
]
|
|
}
|
|
],
|
|
"cost_info": {
|
|
"sort_cost": "18.00"
|
|
},
|
|
"table": {
|
|
"table_name": "t",
|
|
"access_type": "ALL",
|
|
"rows_examined_per_scan": 18,
|
|
"rows_produced_per_join": 18,
|
|
"filtered": "100.00",
|
|
"cost_info": {
|
|
"read_cost": "0.25",
|
|
"eval_cost": "1.80",
|
|
"prefix_cost": "2.05",
|
|
"data_read_per_join": "288"
|
|
},
|
|
"used_columns": [
|
|
"a",
|
|
"b",
|
|
"c"
|
|
]
|
|
}
|
|
}
|
|
}
|
|
}
|
|
}
|
|
}
|
|
}
|
|
}
|
|
Warnings:
|
|
Note 1003 /* select#1 */ select `alias`.`a` AS `a`,`alias`.`b` AS `b`,`alias`.`c` AS `c`,`alias`.`RANK() OVER (ORDER BY 1*1)` AS `RANK() OVER (ORDER BY 1*1)` from (/* select#2 */ select `test`.`t`.`a` AS `a`,`test`.`t`.`b` AS `b`,`test`.`t`.`c` AS `c`,rank() OVER (ORDER BY (1 * 1) ) AS `RANK() OVER (ORDER BY 1*1)` from `test`.`t`) `alias` order by `alias`.`a`,`alias`.`b`,`alias`.`c`
|
|
Crashed: more than one window in subquery
|
|
EXPLAIN FORMAT=JSON SELECT * FROM (SELECT count(*) OVER (), sum(c) OVER () AS sum1, a from t) as alias;
|
|
EXPLAIN
|
|
{
|
|
"query_block": {
|
|
"select_id": 1,
|
|
"cost_info": {
|
|
"query_cost": "4.52"
|
|
},
|
|
"table": {
|
|
"table_name": "alias",
|
|
"access_type": "ALL",
|
|
"rows_examined_per_scan": 18,
|
|
"rows_produced_per_join": 18,
|
|
"filtered": "100.00",
|
|
"cost_info": {
|
|
"read_cost": "2.73",
|
|
"eval_cost": "1.80",
|
|
"prefix_cost": "4.53",
|
|
"data_read_per_join": "720"
|
|
},
|
|
"used_columns": [
|
|
"count(*) OVER ()",
|
|
"sum1",
|
|
"a"
|
|
],
|
|
"materialized_from_subquery": {
|
|
"using_temporary_table": true,
|
|
"dependent": false,
|
|
"cacheable": true,
|
|
"query_block": {
|
|
"select_id": 2,
|
|
"cost_info": {
|
|
"query_cost": "2.05"
|
|
},
|
|
"windowing": {
|
|
"windows": [
|
|
{
|
|
"name": "<unnamed window>",
|
|
"definition_position": 1,
|
|
"using_temporary_table": true,
|
|
"frame_buffer": {
|
|
"using_temporary_table": true,
|
|
"optimized_frame_evaluation": true
|
|
},
|
|
"functions": [
|
|
"count"
|
|
]
|
|
},
|
|
{
|
|
"name": "<unnamed window>",
|
|
"definition_position": 2,
|
|
"last_executed_window": true,
|
|
"frame_buffer": {
|
|
"using_temporary_table": true,
|
|
"optimized_frame_evaluation": true
|
|
},
|
|
"functions": [
|
|
"sum"
|
|
]
|
|
}
|
|
],
|
|
"table": {
|
|
"table_name": "t",
|
|
"access_type": "ALL",
|
|
"rows_examined_per_scan": 18,
|
|
"rows_produced_per_join": 18,
|
|
"filtered": "100.00",
|
|
"cost_info": {
|
|
"read_cost": "0.25",
|
|
"eval_cost": "1.80",
|
|
"prefix_cost": "2.05",
|
|
"data_read_per_join": "288"
|
|
},
|
|
"used_columns": [
|
|
"a",
|
|
"c"
|
|
]
|
|
}
|
|
}
|
|
}
|
|
}
|
|
}
|
|
}
|
|
}
|
|
Warnings:
|
|
Note 1003 /* select#1 */ select `alias`.`count(*) OVER ()` AS `count(*) OVER ()`,`alias`.`sum1` AS `sum1`,`alias`.`a` AS `a` from (/* select#2 */ select count(0) OVER () AS `count(*) OVER ()`,sum(`test`.`t`.`c`) OVER () AS `sum1`,`test`.`t`.`a` AS `a` from `test`.`t`) `alias`
|
|
Crashed: expression containing window function(s) in subquery
|
|
EXPLAIN FORMAT=JSON SELECT * FROM (SELECT count(*) OVER () + sum(c) OVER () AS sum1, a from t) as alias;
|
|
EXPLAIN
|
|
{
|
|
"query_block": {
|
|
"select_id": 1,
|
|
"cost_info": {
|
|
"query_cost": "4.52"
|
|
},
|
|
"table": {
|
|
"table_name": "alias",
|
|
"access_type": "ALL",
|
|
"rows_examined_per_scan": 18,
|
|
"rows_produced_per_join": 18,
|
|
"filtered": "100.00",
|
|
"cost_info": {
|
|
"read_cost": "2.73",
|
|
"eval_cost": "1.80",
|
|
"prefix_cost": "4.53",
|
|
"data_read_per_join": "576"
|
|
},
|
|
"used_columns": [
|
|
"sum1",
|
|
"a"
|
|
],
|
|
"materialized_from_subquery": {
|
|
"using_temporary_table": true,
|
|
"dependent": false,
|
|
"cacheable": true,
|
|
"query_block": {
|
|
"select_id": 2,
|
|
"cost_info": {
|
|
"query_cost": "2.05"
|
|
},
|
|
"windowing": {
|
|
"windows": [
|
|
{
|
|
"name": "<unnamed window>",
|
|
"definition_position": 1,
|
|
"using_temporary_table": true,
|
|
"frame_buffer": {
|
|
"using_temporary_table": true,
|
|
"optimized_frame_evaluation": true
|
|
},
|
|
"functions": [
|
|
"count"
|
|
]
|
|
},
|
|
{
|
|
"name": "<unnamed window>",
|
|
"definition_position": 2,
|
|
"last_executed_window": true,
|
|
"frame_buffer": {
|
|
"using_temporary_table": true,
|
|
"optimized_frame_evaluation": true
|
|
},
|
|
"functions": [
|
|
"sum"
|
|
]
|
|
}
|
|
],
|
|
"table": {
|
|
"table_name": "t",
|
|
"access_type": "ALL",
|
|
"rows_examined_per_scan": 18,
|
|
"rows_produced_per_join": 18,
|
|
"filtered": "100.00",
|
|
"cost_info": {
|
|
"read_cost": "0.25",
|
|
"eval_cost": "1.80",
|
|
"prefix_cost": "2.05",
|
|
"data_read_per_join": "288"
|
|
},
|
|
"used_columns": [
|
|
"a",
|
|
"c"
|
|
]
|
|
}
|
|
}
|
|
}
|
|
}
|
|
}
|
|
}
|
|
}
|
|
Warnings:
|
|
Note 1003 /* select#1 */ select `alias`.`sum1` AS `sum1`,`alias`.`a` AS `a` from (/* select#2 */ select (count(0) OVER () + sum(`test`.`t`.`c`) OVER () ) AS `sum1`,`test`.`t`.`a` AS `a` from `test`.`t`) `alias`
|
|
Wrong result if subquery window function referenced another column in the select list
|
|
This was OK, but:
|
|
EXPLAIN FORMAT=JSON SELECT * FROM (SELECT SUM(b) OVER (), a FROM t) AS alias;
|
|
EXPLAIN
|
|
{
|
|
"query_block": {
|
|
"select_id": 1,
|
|
"cost_info": {
|
|
"query_cost": "4.52"
|
|
},
|
|
"table": {
|
|
"table_name": "alias",
|
|
"access_type": "ALL",
|
|
"rows_examined_per_scan": 18,
|
|
"rows_produced_per_join": 18,
|
|
"filtered": "100.00",
|
|
"cost_info": {
|
|
"read_cost": "2.73",
|
|
"eval_cost": "1.80",
|
|
"prefix_cost": "4.53",
|
|
"data_read_per_join": "576"
|
|
},
|
|
"used_columns": [
|
|
"SUM(b) OVER ()",
|
|
"a"
|
|
],
|
|
"materialized_from_subquery": {
|
|
"using_temporary_table": true,
|
|
"dependent": false,
|
|
"cacheable": true,
|
|
"query_block": {
|
|
"select_id": 2,
|
|
"cost_info": {
|
|
"query_cost": "2.05"
|
|
},
|
|
"windowing": {
|
|
"windows": [
|
|
{
|
|
"name": "<unnamed window>",
|
|
"frame_buffer": {
|
|
"using_temporary_table": true,
|
|
"optimized_frame_evaluation": true
|
|
},
|
|
"functions": [
|
|
"sum"
|
|
]
|
|
}
|
|
],
|
|
"table": {
|
|
"table_name": "t",
|
|
"access_type": "ALL",
|
|
"rows_examined_per_scan": 18,
|
|
"rows_produced_per_join": 18,
|
|
"filtered": "100.00",
|
|
"cost_info": {
|
|
"read_cost": "0.25",
|
|
"eval_cost": "1.80",
|
|
"prefix_cost": "2.05",
|
|
"data_read_per_join": "288"
|
|
},
|
|
"used_columns": [
|
|
"a",
|
|
"b"
|
|
]
|
|
}
|
|
}
|
|
}
|
|
}
|
|
}
|
|
}
|
|
}
|
|
Warnings:
|
|
Note 1003 /* select#1 */ select `alias`.`SUM(b) OVER ()` AS `SUM(b) OVER ()`,`alias`.`a` AS `a` from (/* select#2 */ select sum(`test`.`t`.`b`) OVER () AS `SUM(b) OVER ()`,`test`.`t`.`a` AS `a` from `test`.`t`) `alias`
|
|
this one failed with NULL as sum
|
|
EXPLAIN FORMAT=JSON SELECT * FROM (SELECT SUM(b) OVER (), b FROM t) AS alias;
|
|
EXPLAIN
|
|
{
|
|
"query_block": {
|
|
"select_id": 1,
|
|
"cost_info": {
|
|
"query_cost": "4.52"
|
|
},
|
|
"table": {
|
|
"table_name": "alias",
|
|
"access_type": "ALL",
|
|
"rows_examined_per_scan": 18,
|
|
"rows_produced_per_join": 18,
|
|
"filtered": "100.00",
|
|
"cost_info": {
|
|
"read_cost": "2.73",
|
|
"eval_cost": "1.80",
|
|
"prefix_cost": "4.53",
|
|
"data_read_per_join": "576"
|
|
},
|
|
"used_columns": [
|
|
"SUM(b) OVER ()",
|
|
"b"
|
|
],
|
|
"materialized_from_subquery": {
|
|
"using_temporary_table": true,
|
|
"dependent": false,
|
|
"cacheable": true,
|
|
"query_block": {
|
|
"select_id": 2,
|
|
"cost_info": {
|
|
"query_cost": "2.05"
|
|
},
|
|
"windowing": {
|
|
"windows": [
|
|
{
|
|
"name": "<unnamed window>",
|
|
"frame_buffer": {
|
|
"using_temporary_table": true,
|
|
"optimized_frame_evaluation": true
|
|
},
|
|
"functions": [
|
|
"sum"
|
|
]
|
|
}
|
|
],
|
|
"table": {
|
|
"table_name": "t",
|
|
"access_type": "ALL",
|
|
"rows_examined_per_scan": 18,
|
|
"rows_produced_per_join": 18,
|
|
"filtered": "100.00",
|
|
"cost_info": {
|
|
"read_cost": "0.25",
|
|
"eval_cost": "1.80",
|
|
"prefix_cost": "2.05",
|
|
"data_read_per_join": "288"
|
|
},
|
|
"used_columns": [
|
|
"b"
|
|
]
|
|
}
|
|
}
|
|
}
|
|
}
|
|
}
|
|
}
|
|
}
|
|
Warnings:
|
|
Note 1003 /* select#1 */ select `alias`.`SUM(b) OVER ()` AS `SUM(b) OVER ()`,`alias`.`b` AS `b` from (/* select#2 */ select sum(`test`.`t`.`b`) OVER () AS `SUM(b) OVER ()`,`test`.`t`.`b` AS `b` from `test`.`t`) `alias`
|
|
Window function having subquery in argument:
|
|
CREATE TABLE u(d INT);
|
|
SELECT AVG(a * (SELECT a*d FROM u)) OVER
|
|
(PARTITION BY (SELECT a+d FROM u) ORDER BY (SELECT d FROM u)) FROM t;
|
|
AVG(a * (SELECT a*d FROM u)) OVER
|
|
(PARTITION BY (SELECT a+d FROM u) ORDER BY (SELECT d FROM u))
|
|
NULL
|
|
NULL
|
|
NULL
|
|
NULL
|
|
NULL
|
|
NULL
|
|
NULL
|
|
NULL
|
|
NULL
|
|
NULL
|
|
NULL
|
|
NULL
|
|
NULL
|
|
NULL
|
|
NULL
|
|
NULL
|
|
NULL
|
|
NULL
|
|
EXPLAIN FORMAT=JSON SELECT AVG(a * (SELECT a*d FROM u)) OVER
|
|
(PARTITION BY (SELECT a+d FROM u) ORDER BY (SELECT d FROM u)) FROM t;
|
|
EXPLAIN
|
|
{
|
|
"query_block": {
|
|
"select_id": 1,
|
|
"cost_info": {
|
|
"query_cost": "20.05"
|
|
},
|
|
"windowing": {
|
|
"windows": [
|
|
{
|
|
"name": "<unnamed window>",
|
|
"using_filesort": true,
|
|
"filesort_key": [
|
|
"(select (`a` + `d`) from `u`)",
|
|
"(select `d` from `u`)"
|
|
],
|
|
"frame_buffer": {
|
|
"using_temporary_table": true,
|
|
"optimized_frame_evaluation": true
|
|
},
|
|
"functions": [
|
|
"avg"
|
|
]
|
|
}
|
|
],
|
|
"cost_info": {
|
|
"sort_cost": "18.00"
|
|
},
|
|
"table": {
|
|
"table_name": "t",
|
|
"access_type": "ALL",
|
|
"rows_examined_per_scan": 18,
|
|
"rows_produced_per_join": 18,
|
|
"filtered": "100.00",
|
|
"cost_info": {
|
|
"read_cost": "0.25",
|
|
"eval_cost": "1.80",
|
|
"prefix_cost": "2.05",
|
|
"data_read_per_join": "288"
|
|
},
|
|
"used_columns": [
|
|
"a"
|
|
]
|
|
},
|
|
"select_list_subqueries": [
|
|
{
|
|
"dependent": true,
|
|
"cacheable": false,
|
|
"query_block": {
|
|
"select_id": 4,
|
|
"cost_info": {
|
|
"query_cost": "0.35"
|
|
},
|
|
"table": {
|
|
"table_name": "u",
|
|
"access_type": "ALL",
|
|
"rows_examined_per_scan": 1,
|
|
"rows_produced_per_join": 1,
|
|
"filtered": "100.00",
|
|
"cost_info": {
|
|
"read_cost": "0.25",
|
|
"eval_cost": "0.10",
|
|
"prefix_cost": "0.35",
|
|
"data_read_per_join": "8"
|
|
},
|
|
"used_columns": [
|
|
"d"
|
|
]
|
|
}
|
|
}
|
|
},
|
|
{
|
|
"dependent": false,
|
|
"cacheable": true,
|
|
"query_block": {
|
|
"select_id": 3,
|
|
"cost_info": {
|
|
"query_cost": "0.35"
|
|
},
|
|
"table": {
|
|
"table_name": "u",
|
|
"access_type": "ALL",
|
|
"rows_examined_per_scan": 1,
|
|
"rows_produced_per_join": 1,
|
|
"filtered": "100.00",
|
|
"cost_info": {
|
|
"read_cost": "0.25",
|
|
"eval_cost": "0.10",
|
|
"prefix_cost": "0.35",
|
|
"data_read_per_join": "8"
|
|
},
|
|
"used_columns": [
|
|
"d"
|
|
]
|
|
}
|
|
}
|
|
},
|
|
{
|
|
"dependent": true,
|
|
"cacheable": false,
|
|
"query_block": {
|
|
"select_id": 2,
|
|
"cost_info": {
|
|
"query_cost": "0.35"
|
|
},
|
|
"table": {
|
|
"table_name": "u",
|
|
"access_type": "ALL",
|
|
"rows_examined_per_scan": 1,
|
|
"rows_produced_per_join": 1,
|
|
"filtered": "100.00",
|
|
"cost_info": {
|
|
"read_cost": "0.25",
|
|
"eval_cost": "0.10",
|
|
"prefix_cost": "0.35",
|
|
"data_read_per_join": "8"
|
|
},
|
|
"used_columns": [
|
|
"d"
|
|
]
|
|
}
|
|
}
|
|
}
|
|
]
|
|
}
|
|
}
|
|
}
|
|
Warnings:
|
|
Note 1276 Field or reference 'test.t.a' of SELECT #4 was resolved in SELECT #1
|
|
Note 1276 Field or reference 'test.t.a' of SELECT #2 was resolved in SELECT #1
|
|
Note 1003 /* select#1 */ select avg((`test`.`t`.`a` * (/* select#4 */ select (`test`.`t`.`a` * `test`.`u`.`d`) from `test`.`u`))) OVER (PARTITION BY (/* select#2 */ select (`test`.`t`.`a` + `test`.`u`.`d`) from `test`.`u`) ORDER BY (/* select#3 */ select `test`.`u`.`d` from `test`.`u`) ) AS `AVG(a * (SELECT a*d FROM u)) OVER
|
|
(PARTITION BY (SELECT a+d FROM u) ORDER BY (SELECT d FROM u))` from `test`.`t`
|
|
DROP TABLE u;
|
|
Crash due to unguarded access for window name string for an unnamed
|
|
window while producing the error message
|
|
Check that DISTINCT is not allowed in wfs
|
|
Check that GROUPS bounds unit is not supported yet
|
|
Check that EXCLUDE in frames is not supported yet
|
|
Check Nested wfs
|
|
DROP TABLE t;
|
|
Crash report (Srikanth)
|
|
CREATE TABLE t(a int, b int);
|
|
INSERT INTO t VALUES (1,1),(2,1),(3,2),(4,2),(5,3),(6,3);
|
|
ANALYZE TABLE t;
|
|
Table Op Msg_type Msg_text
|
|
test.t analyze status OK
|
|
EXPLAIN FORMAT=JSON SELECT SUM(a) OVER (ORDER BY b) FROM t;
|
|
EXPLAIN
|
|
{
|
|
"query_block": {
|
|
"select_id": 1,
|
|
"cost_info": {
|
|
"query_cost": "6.85"
|
|
},
|
|
"windowing": {
|
|
"windows": [
|
|
{
|
|
"name": "<unnamed window>",
|
|
"using_filesort": true,
|
|
"filesort_key": [
|
|
"`b`"
|
|
],
|
|
"frame_buffer": {
|
|
"using_temporary_table": true,
|
|
"optimized_frame_evaluation": true
|
|
},
|
|
"functions": [
|
|
"sum"
|
|
]
|
|
}
|
|
],
|
|
"cost_info": {
|
|
"sort_cost": "6.00"
|
|
},
|
|
"table": {
|
|
"table_name": "t",
|
|
"access_type": "ALL",
|
|
"rows_examined_per_scan": 6,
|
|
"rows_produced_per_join": 6,
|
|
"filtered": "100.00",
|
|
"cost_info": {
|
|
"read_cost": "0.25",
|
|
"eval_cost": "0.60",
|
|
"prefix_cost": "0.85",
|
|
"data_read_per_join": "96"
|
|
},
|
|
"used_columns": [
|
|
"a",
|
|
"b"
|
|
]
|
|
}
|
|
}
|
|
}
|
|
}
|
|
Warnings:
|
|
Note 1003 /* select#1 */ select sum(`test`.`t`.`a`) OVER (ORDER BY `test`.`t`.`b` ) AS `SUM(a) OVER (ORDER BY b)` from `test`.`t`
|
|
EXPLAIN FORMAT=JSON SELECT COUNT(*) OVER (ORDER BY b) FROM t;
|
|
EXPLAIN
|
|
{
|
|
"query_block": {
|
|
"select_id": 1,
|
|
"cost_info": {
|
|
"query_cost": "6.85"
|
|
},
|
|
"windowing": {
|
|
"windows": [
|
|
{
|
|
"name": "<unnamed window>",
|
|
"using_filesort": true,
|
|
"filesort_key": [
|
|
"`b`"
|
|
],
|
|
"frame_buffer": {
|
|
"using_temporary_table": true,
|
|
"optimized_frame_evaluation": true
|
|
},
|
|
"functions": [
|
|
"count"
|
|
]
|
|
}
|
|
],
|
|
"cost_info": {
|
|
"sort_cost": "6.00"
|
|
},
|
|
"table": {
|
|
"table_name": "t",
|
|
"access_type": "ALL",
|
|
"rows_examined_per_scan": 6,
|
|
"rows_produced_per_join": 6,
|
|
"filtered": "100.00",
|
|
"cost_info": {
|
|
"read_cost": "0.25",
|
|
"eval_cost": "0.60",
|
|
"prefix_cost": "0.85",
|
|
"data_read_per_join": "96"
|
|
},
|
|
"used_columns": [
|
|
"b"
|
|
]
|
|
}
|
|
}
|
|
}
|
|
}
|
|
Warnings:
|
|
Note 1003 /* select#1 */ select count(0) OVER (ORDER BY `test`.`t`.`b` ) AS `COUNT(*) OVER (ORDER BY b)` from `test`.`t`
|
|
EXPLAIN FORMAT=JSON SELECT AVG(b) OVER (ORDER BY b) FROM t;
|
|
EXPLAIN
|
|
{
|
|
"query_block": {
|
|
"select_id": 1,
|
|
"cost_info": {
|
|
"query_cost": "6.85"
|
|
},
|
|
"windowing": {
|
|
"windows": [
|
|
{
|
|
"name": "<unnamed window>",
|
|
"using_filesort": true,
|
|
"filesort_key": [
|
|
"`b`"
|
|
],
|
|
"frame_buffer": {
|
|
"using_temporary_table": true,
|
|
"optimized_frame_evaluation": true
|
|
},
|
|
"functions": [
|
|
"avg"
|
|
]
|
|
}
|
|
],
|
|
"cost_info": {
|
|
"sort_cost": "6.00"
|
|
},
|
|
"table": {
|
|
"table_name": "t",
|
|
"access_type": "ALL",
|
|
"rows_examined_per_scan": 6,
|
|
"rows_produced_per_join": 6,
|
|
"filtered": "100.00",
|
|
"cost_info": {
|
|
"read_cost": "0.25",
|
|
"eval_cost": "0.60",
|
|
"prefix_cost": "0.85",
|
|
"data_read_per_join": "96"
|
|
},
|
|
"used_columns": [
|
|
"b"
|
|
]
|
|
}
|
|
}
|
|
}
|
|
}
|
|
Warnings:
|
|
Note 1003 /* select#1 */ select avg(`test`.`t`.`b`) OVER (ORDER BY `test`.`t`.`b` ) AS `AVG(b) OVER (ORDER BY b)` from `test`.`t`
|
|
EXPLAIN FORMAT=JSON SELECT a,b,LAST_VALUE(a) OVER (ORDER BY b,a) FROM t;
|
|
EXPLAIN
|
|
{
|
|
"query_block": {
|
|
"select_id": 1,
|
|
"cost_info": {
|
|
"query_cost": "6.85"
|
|
},
|
|
"windowing": {
|
|
"windows": [
|
|
{
|
|
"name": "<unnamed window>",
|
|
"using_filesort": true,
|
|
"filesort_key": [
|
|
"`b`",
|
|
"`a`"
|
|
],
|
|
"frame_buffer": {
|
|
"using_temporary_table": true,
|
|
"optimized_frame_evaluation": true
|
|
},
|
|
"functions": [
|
|
"last_value"
|
|
]
|
|
}
|
|
],
|
|
"cost_info": {
|
|
"sort_cost": "6.00"
|
|
},
|
|
"table": {
|
|
"table_name": "t",
|
|
"access_type": "ALL",
|
|
"rows_examined_per_scan": 6,
|
|
"rows_produced_per_join": 6,
|
|
"filtered": "100.00",
|
|
"cost_info": {
|
|
"read_cost": "0.25",
|
|
"eval_cost": "0.60",
|
|
"prefix_cost": "0.85",
|
|
"data_read_per_join": "96"
|
|
},
|
|
"used_columns": [
|
|
"a",
|
|
"b"
|
|
]
|
|
}
|
|
}
|
|
}
|
|
}
|
|
Warnings:
|
|
Note 1003 /* select#1 */ select `test`.`t`.`a` AS `a`,`test`.`t`.`b` AS `b`,last_value(`test`.`t`.`a`) OVER (ORDER BY `test`.`t`.`b`,`test`.`t`.`a` ) AS `LAST_VALUE(a) OVER (ORDER BY b,a)` from `test`.`t`
|
|
EXPLAIN FORMAT=JSON SELECT NTILE(2) OVER (ORDER BY b) FROM t;
|
|
EXPLAIN
|
|
{
|
|
"query_block": {
|
|
"select_id": 1,
|
|
"cost_info": {
|
|
"query_cost": "6.85"
|
|
},
|
|
"windowing": {
|
|
"windows": [
|
|
{
|
|
"name": "<unnamed window>",
|
|
"using_filesort": true,
|
|
"filesort_key": [
|
|
"`b`"
|
|
],
|
|
"frame_buffer": {
|
|
"using_temporary_table": true,
|
|
"optimized_frame_evaluation": true
|
|
},
|
|
"functions": [
|
|
"ntile"
|
|
]
|
|
}
|
|
],
|
|
"cost_info": {
|
|
"sort_cost": "6.00"
|
|
},
|
|
"table": {
|
|
"table_name": "t",
|
|
"access_type": "ALL",
|
|
"rows_examined_per_scan": 6,
|
|
"rows_produced_per_join": 6,
|
|
"filtered": "100.00",
|
|
"cost_info": {
|
|
"read_cost": "0.25",
|
|
"eval_cost": "0.60",
|
|
"prefix_cost": "0.85",
|
|
"data_read_per_join": "96"
|
|
},
|
|
"used_columns": [
|
|
"b"
|
|
]
|
|
}
|
|
}
|
|
}
|
|
}
|
|
Warnings:
|
|
Note 1003 /* select#1 */ select ntile(2) OVER (ORDER BY `test`.`t`.`b` ) AS `NTILE(2) OVER (ORDER BY b)` from `test`.`t`
|
|
DROP TABLE t;
|
|
Wrong result (Srikanth)
|
|
CREATE TABLE t1(a INT, b INT);
|
|
INSERT INTO t1 VALUES (1,2),
|
|
(1,3);
|
|
ANALYZE TABLE t1;
|
|
Table Op Msg_type Msg_text
|
|
test.t1 analyze status OK
|
|
EXPLAIN FORMAT=JSON SELECT a, b, COUNT(a) OVER w count,
|
|
SUM(a) OVER w sum,
|
|
AVG(a) over w average,
|
|
LAST_VALUE(a) OVER w lastval FROM t1
|
|
WINDOW w as (PARTITION BY a ORDER BY b ROWS BETWEEN 1 PRECEDING AND 1 FOLLOWING);
|
|
EXPLAIN
|
|
{
|
|
"query_block": {
|
|
"select_id": 1,
|
|
"cost_info": {
|
|
"query_cost": "2.45"
|
|
},
|
|
"windowing": {
|
|
"windows": [
|
|
{
|
|
"name": "w",
|
|
"using_filesort": true,
|
|
"filesort_key": [
|
|
"`a`",
|
|
"`b`"
|
|
],
|
|
"frame_buffer": {
|
|
"using_temporary_table": true,
|
|
"optimized_frame_evaluation": true
|
|
},
|
|
"functions": [
|
|
"count",
|
|
"sum",
|
|
"avg",
|
|
"last_value"
|
|
]
|
|
}
|
|
],
|
|
"cost_info": {
|
|
"sort_cost": "2.00"
|
|
},
|
|
"table": {
|
|
"table_name": "t1",
|
|
"access_type": "ALL",
|
|
"rows_examined_per_scan": 2,
|
|
"rows_produced_per_join": 2,
|
|
"filtered": "100.00",
|
|
"cost_info": {
|
|
"read_cost": "0.25",
|
|
"eval_cost": "0.20",
|
|
"prefix_cost": "0.45",
|
|
"data_read_per_join": "32"
|
|
},
|
|
"used_columns": [
|
|
"a",
|
|
"b"
|
|
]
|
|
}
|
|
}
|
|
}
|
|
}
|
|
Warnings:
|
|
Note 1003 /* select#1 */ select `test`.`t1`.`a` AS `a`,`test`.`t1`.`b` AS `b`,count(`test`.`t1`.`a`) OVER `w` AS `count`,sum(`test`.`t1`.`a`) OVER `w` AS `sum`,avg(`test`.`t1`.`a`) OVER `w` AS `average`,last_value(`test`.`t1`.`a`) OVER `w` AS `lastval` from `test`.`t1` window `w` AS (PARTITION BY `test`.`t1`.`a` ORDER BY `test`.`t1`.`b` ROWS BETWEEN 1 PRECEDING AND 1 FOLLOWING)
|
|
INSERT INTO t1 VALUES (1,3);
|
|
ANALYZE TABLE t1;
|
|
Table Op Msg_type Msg_text
|
|
test.t1 analyze status OK
|
|
EXPLAIN FORMAT=JSON SELECT a, b, COUNT(a) OVER w count,
|
|
SUM(a) OVER w sum,
|
|
AVG(a) OVER w average,
|
|
LAST_VALUE(a) OVER w lastval FROM t1
|
|
WINDOW w as (PARTITION BY a ORDER BY b ROWS BETWEEN 1 PRECEDING AND 1 FOLLOWING);
|
|
EXPLAIN
|
|
{
|
|
"query_block": {
|
|
"select_id": 1,
|
|
"cost_info": {
|
|
"query_cost": "3.55"
|
|
},
|
|
"windowing": {
|
|
"windows": [
|
|
{
|
|
"name": "w",
|
|
"using_filesort": true,
|
|
"filesort_key": [
|
|
"`a`",
|
|
"`b`"
|
|
],
|
|
"frame_buffer": {
|
|
"using_temporary_table": true,
|
|
"optimized_frame_evaluation": true
|
|
},
|
|
"functions": [
|
|
"count",
|
|
"sum",
|
|
"avg",
|
|
"last_value"
|
|
]
|
|
}
|
|
],
|
|
"cost_info": {
|
|
"sort_cost": "3.00"
|
|
},
|
|
"table": {
|
|
"table_name": "t1",
|
|
"access_type": "ALL",
|
|
"rows_examined_per_scan": 3,
|
|
"rows_produced_per_join": 3,
|
|
"filtered": "100.00",
|
|
"cost_info": {
|
|
"read_cost": "0.25",
|
|
"eval_cost": "0.30",
|
|
"prefix_cost": "0.55",
|
|
"data_read_per_join": "48"
|
|
},
|
|
"used_columns": [
|
|
"a",
|
|
"b"
|
|
]
|
|
}
|
|
}
|
|
}
|
|
}
|
|
Warnings:
|
|
Note 1003 /* select#1 */ select `test`.`t1`.`a` AS `a`,`test`.`t1`.`b` AS `b`,count(`test`.`t1`.`a`) OVER `w` AS `count`,sum(`test`.`t1`.`a`) OVER `w` AS `sum`,avg(`test`.`t1`.`a`) OVER `w` AS `average`,last_value(`test`.`t1`.`a`) OVER `w` AS `lastval` from `test`.`t1` window `w` AS (PARTITION BY `test`.`t1`.`a` ORDER BY `test`.`t1`.`b` ROWS BETWEEN 1 PRECEDING AND 1 FOLLOWING)
|
|
EXPLAIN FORMAT=JSON SELECT a, b, COUNT(a) OVER w count,
|
|
SUM(a) OVER w sum,
|
|
AVG(a) OVER w average,
|
|
LAST_VALUE(a) OVER w lastval FROM t1
|
|
WINDOW w as (PARTITION BY a ORDER BY b ROWS BETWEEN 1 PRECEDING AND 2 FOLLOWING);
|
|
EXPLAIN
|
|
{
|
|
"query_block": {
|
|
"select_id": 1,
|
|
"cost_info": {
|
|
"query_cost": "3.55"
|
|
},
|
|
"windowing": {
|
|
"windows": [
|
|
{
|
|
"name": "w",
|
|
"using_filesort": true,
|
|
"filesort_key": [
|
|
"`a`",
|
|
"`b`"
|
|
],
|
|
"frame_buffer": {
|
|
"using_temporary_table": true,
|
|
"optimized_frame_evaluation": true
|
|
},
|
|
"functions": [
|
|
"count",
|
|
"sum",
|
|
"avg",
|
|
"last_value"
|
|
]
|
|
}
|
|
],
|
|
"cost_info": {
|
|
"sort_cost": "3.00"
|
|
},
|
|
"table": {
|
|
"table_name": "t1",
|
|
"access_type": "ALL",
|
|
"rows_examined_per_scan": 3,
|
|
"rows_produced_per_join": 3,
|
|
"filtered": "100.00",
|
|
"cost_info": {
|
|
"read_cost": "0.25",
|
|
"eval_cost": "0.30",
|
|
"prefix_cost": "0.55",
|
|
"data_read_per_join": "48"
|
|
},
|
|
"used_columns": [
|
|
"a",
|
|
"b"
|
|
]
|
|
}
|
|
}
|
|
}
|
|
}
|
|
Warnings:
|
|
Note 1003 /* select#1 */ select `test`.`t1`.`a` AS `a`,`test`.`t1`.`b` AS `b`,count(`test`.`t1`.`a`) OVER `w` AS `count`,sum(`test`.`t1`.`a`) OVER `w` AS `sum`,avg(`test`.`t1`.`a`) OVER `w` AS `average`,last_value(`test`.`t1`.`a`) OVER `w` AS `lastval` from `test`.`t1` window `w` AS (PARTITION BY `test`.`t1`.`a` ORDER BY `test`.`t1`.`b` ROWS BETWEEN 1 PRECEDING AND 2 FOLLOWING)
|
|
DROP TABLE t1;
|
|
frame buffer navigation assert
|
|
CREATE TABLE ta (a INT(11) DEFAULT NULL, b INT(11) DEFAULT NULL);
|
|
Warnings:
|
|
Warning 1681 Integer display width is deprecated and will be removed in a future release.
|
|
Warning 1681 Integer display width is deprecated and will be removed in a future release.
|
|
INSERT INTO ta VALUES (1,1), (1,2), (1,3), (2,1), (2,2), (2,3);
|
|
ANALYZE TABLE ta;
|
|
Table Op Msg_type Msg_text
|
|
test.ta analyze status OK
|
|
EXPLAIN FORMAT=JSON SELECT last_value(b) OVER (ROWS BETWEEN CURRENT ROW AND UNBOUNDED FOLLOWING) FROM ta;
|
|
EXPLAIN
|
|
{
|
|
"query_block": {
|
|
"select_id": 1,
|
|
"cost_info": {
|
|
"query_cost": "0.85"
|
|
},
|
|
"windowing": {
|
|
"windows": [
|
|
{
|
|
"name": "<unnamed window>",
|
|
"frame_buffer": {
|
|
"using_temporary_table": true,
|
|
"optimized_frame_evaluation": true
|
|
},
|
|
"functions": [
|
|
"last_value"
|
|
]
|
|
}
|
|
],
|
|
"table": {
|
|
"table_name": "ta",
|
|
"access_type": "ALL",
|
|
"rows_examined_per_scan": 6,
|
|
"rows_produced_per_join": 6,
|
|
"filtered": "100.00",
|
|
"cost_info": {
|
|
"read_cost": "0.25",
|
|
"eval_cost": "0.60",
|
|
"prefix_cost": "0.85",
|
|
"data_read_per_join": "96"
|
|
},
|
|
"used_columns": [
|
|
"b"
|
|
]
|
|
}
|
|
}
|
|
}
|
|
}
|
|
Warnings:
|
|
Note 1003 /* select#1 */ select last_value(`test`.`ta`.`b`) OVER (ROWS BETWEEN CURRENT ROW AND UNBOUNDED FOLLOWING) AS `last_value(b) OVER (ROWS BETWEEN CURRENT ROW AND UNBOUNDED FOLLOWING)` from `test`.`ta`
|
|
DROP TABLE ta;
|
|
Nullability fix bug for COUNT OVER in non optimized eval strategy
|
|
CREATE TABLE t(d DOUBLE);
|
|
INSERT INTO t VALUES (1.0), (2.0), (3.0);
|
|
ANALYZE TABLE t;
|
|
Table Op Msg_type Msg_text
|
|
test.t analyze status OK
|
|
EXPLAIN FORMAT=JSON SELECT SUM(d) OVER w, COUNT(*) OVER w FROM t WINDOW W AS (ROWS BETWEEN 1 FOLLOWING AND 2 FOLLOWING);
|
|
EXPLAIN
|
|
{
|
|
"query_block": {
|
|
"select_id": 1,
|
|
"cost_info": {
|
|
"query_cost": "0.55"
|
|
},
|
|
"windowing": {
|
|
"windows": [
|
|
{
|
|
"name": "W",
|
|
"frame_buffer": {
|
|
"using_temporary_table": true
|
|
},
|
|
"functions": [
|
|
"sum",
|
|
"count"
|
|
]
|
|
}
|
|
],
|
|
"table": {
|
|
"table_name": "t",
|
|
"access_type": "ALL",
|
|
"rows_examined_per_scan": 3,
|
|
"rows_produced_per_join": 3,
|
|
"filtered": "100.00",
|
|
"cost_info": {
|
|
"read_cost": "0.25",
|
|
"eval_cost": "0.30",
|
|
"prefix_cost": "0.55",
|
|
"data_read_per_join": "48"
|
|
},
|
|
"used_columns": [
|
|
"d"
|
|
]
|
|
}
|
|
}
|
|
}
|
|
}
|
|
Warnings:
|
|
Note 1003 /* select#1 */ select sum(`test`.`t`.`d`) OVER `W` AS `SUM(d) OVER w`,count(0) OVER `W` AS `COUNT(*) OVER w` from `test`.`t` window `W` AS (ROWS BETWEEN 1 FOLLOWING AND 2 FOLLOWING)
|
|
DROP TABLE t;
|
|
Bug in inverse logic with initial NULL and RANGE BETWEEN N FOLLOWING AND M FOLLOWING
|
|
CREATE TABLE t1 (d DOUBLE, id INT, sex CHAR(1), n INT NOT NULL AUTO_INCREMENT, PRIMARY KEY(n));
|
|
INSERT INTO t1(d, id, sex) VALUES (1.0, 1, 'M'),
|
|
(2.0, 2, 'F'),
|
|
(3.0, 3, 'F'),
|
|
(4.0, 4, 'F'),
|
|
(5.0, 5, 'M'),
|
|
(NULL, NULL, 'M'),
|
|
(10.0, 10, NULL),
|
|
(10.0, 10, NULL),
|
|
(11.0, 11, NULL);
|
|
ANALYZE TABLE t1;
|
|
Table Op Msg_type Msg_text
|
|
test.t1 analyze status OK
|
|
EXPLAIN FORMAT=JSON SELECT id, AVG(id) over w `avg`, SUM(id) OVER w `sum`, COUNT(*) OVER w cnt FROM t1 WINDOW w as (ORDER BY id RANGE BETWEEN 1 FOLLOWING AND 2 FOLLOWING);
|
|
EXPLAIN
|
|
{
|
|
"query_block": {
|
|
"select_id": 1,
|
|
"cost_info": {
|
|
"query_cost": "10.15"
|
|
},
|
|
"windowing": {
|
|
"windows": [
|
|
{
|
|
"name": "w",
|
|
"using_filesort": true,
|
|
"filesort_key": [
|
|
"`id`"
|
|
],
|
|
"frame_buffer": {
|
|
"using_temporary_table": true,
|
|
"optimized_frame_evaluation": true
|
|
},
|
|
"functions": [
|
|
"avg",
|
|
"sum",
|
|
"count"
|
|
]
|
|
}
|
|
],
|
|
"cost_info": {
|
|
"sort_cost": "9.00"
|
|
},
|
|
"table": {
|
|
"table_name": "t1",
|
|
"access_type": "ALL",
|
|
"rows_examined_per_scan": 9,
|
|
"rows_produced_per_join": 9,
|
|
"filtered": "100.00",
|
|
"cost_info": {
|
|
"read_cost": "0.25",
|
|
"eval_cost": "0.90",
|
|
"prefix_cost": "1.15",
|
|
"data_read_per_join": "216"
|
|
},
|
|
"used_columns": [
|
|
"id",
|
|
"n"
|
|
]
|
|
}
|
|
}
|
|
}
|
|
}
|
|
Warnings:
|
|
Note 1003 /* select#1 */ select `test`.`t1`.`id` AS `id`,avg(`test`.`t1`.`id`) OVER `w` AS `avg`,sum(`test`.`t1`.`id`) OVER `w` AS `sum`,count(0) OVER `w` AS `cnt` from `test`.`t1` window `w` AS (ORDER BY `test`.`t1`.`id` RANGE BETWEEN 1 FOLLOWING AND 2 FOLLOWING)
|
|
SET windowing_use_high_precision= OFF;
|
|
EXPLAIN FORMAT=JSON SELECT d, AVG(d) over w `avg`, SUM(d) OVER w `sum`, COUNT(*) OVER w cnt FROM t1 WINDOW w as (ORDER BY d RANGE BETWEEN 1 FOLLOWING AND 2 FOLLOWING);
|
|
EXPLAIN
|
|
{
|
|
"query_block": {
|
|
"select_id": 1,
|
|
"cost_info": {
|
|
"query_cost": "10.15"
|
|
},
|
|
"windowing": {
|
|
"windows": [
|
|
{
|
|
"name": "w",
|
|
"using_filesort": true,
|
|
"filesort_key": [
|
|
"`d`"
|
|
],
|
|
"frame_buffer": {
|
|
"using_temporary_table": true,
|
|
"optimized_frame_evaluation": true
|
|
},
|
|
"functions": [
|
|
"avg",
|
|
"sum",
|
|
"count"
|
|
]
|
|
}
|
|
],
|
|
"cost_info": {
|
|
"sort_cost": "9.00"
|
|
},
|
|
"table": {
|
|
"table_name": "t1",
|
|
"access_type": "ALL",
|
|
"rows_examined_per_scan": 9,
|
|
"rows_produced_per_join": 9,
|
|
"filtered": "100.00",
|
|
"cost_info": {
|
|
"read_cost": "0.25",
|
|
"eval_cost": "0.90",
|
|
"prefix_cost": "1.15",
|
|
"data_read_per_join": "216"
|
|
},
|
|
"used_columns": [
|
|
"d",
|
|
"n"
|
|
]
|
|
}
|
|
}
|
|
}
|
|
}
|
|
Warnings:
|
|
Note 1003 /* select#1 */ select `test`.`t1`.`d` AS `d`,avg(`test`.`t1`.`d`) OVER `w` AS `avg`,sum(`test`.`t1`.`d`) OVER `w` AS `sum`,count(0) OVER `w` AS `cnt` from `test`.`t1` window `w` AS (ORDER BY `test`.`t1`.`d` RANGE BETWEEN 1 FOLLOWING AND 2 FOLLOWING)
|
|
SET windowing_use_high_precision= ON;
|
|
DROP TABLE t1;
|
|
Bug in inverse logic with e.g. ROWS BETWEEN UNBOUNDED PRECEDING AND 1
|
|
FOLLOWING: at end of partition, when no rows are removed or added we
|
|
lacked initialization of aggregates in optimized mode.
|
|
CREATE TABLE t (i char(10), j int);
|
|
INSERT INTO t VALUES('A', 1);
|
|
INSERT INTO t VALUES('A', 3);
|
|
INSERT INTO t VALUES('A', 5);
|
|
INSERT INTO t VALUES('B', 1);
|
|
INSERT INTO t VALUES('B', 7);
|
|
ANALYZE TABLE t;
|
|
Table Op Msg_type Msg_text
|
|
test.t analyze status OK
|
|
EXPLAIN FORMAT=JSON SELECT i, j, SUM(j) OVER w FROM t
|
|
WINDOW w AS (PARTITION BY i ORDER BY j
|
|
ROWS BETWEEN UNBOUNDED PRECEDING AND 1 FOLLOWING);
|
|
EXPLAIN
|
|
{
|
|
"query_block": {
|
|
"select_id": 1,
|
|
"cost_info": {
|
|
"query_cost": "5.75"
|
|
},
|
|
"windowing": {
|
|
"windows": [
|
|
{
|
|
"name": "w",
|
|
"using_filesort": true,
|
|
"filesort_key": [
|
|
"`i`",
|
|
"`j`"
|
|
],
|
|
"frame_buffer": {
|
|
"using_temporary_table": true,
|
|
"optimized_frame_evaluation": true
|
|
},
|
|
"functions": [
|
|
"sum"
|
|
]
|
|
}
|
|
],
|
|
"cost_info": {
|
|
"sort_cost": "5.00"
|
|
},
|
|
"table": {
|
|
"table_name": "t",
|
|
"access_type": "ALL",
|
|
"rows_examined_per_scan": 5,
|
|
"rows_produced_per_join": 5,
|
|
"filtered": "100.00",
|
|
"cost_info": {
|
|
"read_cost": "0.25",
|
|
"eval_cost": "0.50",
|
|
"prefix_cost": "0.75",
|
|
"data_read_per_join": "240"
|
|
},
|
|
"used_columns": [
|
|
"i",
|
|
"j"
|
|
]
|
|
}
|
|
}
|
|
}
|
|
}
|
|
Warnings:
|
|
Note 1003 /* select#1 */ select `test`.`t`.`i` AS `i`,`test`.`t`.`j` AS `j`,sum(`test`.`t`.`j`) OVER `w` AS `SUM(j) OVER w` from `test`.`t` window `w` AS (PARTITION BY `test`.`t`.`i` ORDER BY `test`.`t`.`j` ROWS BETWEEN UNBOUNDED PRECEDING AND 1 FOLLOWING)
|
|
Test definition_position: references don't count, only definitions,
|
|
thus we have an unnamed, then another unnamed (based on w but not
|
|
exactly w) then w then two unnamed.
|
|
EXPLAIN FORMAT=JSON SELECT SUM(j) OVER w, COUNT(j) OVER (),
|
|
AVG(j) OVER (w ORDER BY j), FIRST_VALUE(j) OVER w
|
|
FROM t WINDOW w AS (PARTITION BY i)
|
|
ORDER BY LAST_VALUE(j) OVER w, NTH_VALUE(j,1) OVER (),
|
|
ROW_NUMBER() OVER (PARTITION BY j);
|
|
EXPLAIN
|
|
{
|
|
"query_block": {
|
|
"select_id": 1,
|
|
"cost_info": {
|
|
"query_cost": "20.75"
|
|
},
|
|
"ordering_operation": {
|
|
"using_filesort": true,
|
|
"cost_info": {
|
|
"sort_cost": "5.00"
|
|
},
|
|
"windowing": {
|
|
"windows": [
|
|
{
|
|
"name": "w",
|
|
"definition_position": 3,
|
|
"using_temporary_table": true,
|
|
"using_filesort": true,
|
|
"filesort_key": [
|
|
"`i`"
|
|
],
|
|
"frame_buffer": {
|
|
"using_temporary_table": true,
|
|
"optimized_frame_evaluation": true
|
|
},
|
|
"functions": [
|
|
"sum",
|
|
"first_value",
|
|
"last_value"
|
|
]
|
|
},
|
|
{
|
|
"name": "<unnamed window>",
|
|
"definition_position": 1,
|
|
"using_temporary_table": true,
|
|
"frame_buffer": {
|
|
"using_temporary_table": true,
|
|
"optimized_frame_evaluation": true
|
|
},
|
|
"functions": [
|
|
"count"
|
|
]
|
|
},
|
|
{
|
|
"name": "<unnamed window>",
|
|
"definition_position": 2,
|
|
"using_temporary_table": true,
|
|
"using_filesort": true,
|
|
"filesort_key": [
|
|
"`i`",
|
|
"`j`"
|
|
],
|
|
"frame_buffer": {
|
|
"using_temporary_table": true,
|
|
"optimized_frame_evaluation": true
|
|
},
|
|
"functions": [
|
|
"avg"
|
|
]
|
|
},
|
|
{
|
|
"name": "<unnamed window>",
|
|
"definition_position": 4,
|
|
"using_temporary_table": true,
|
|
"frame_buffer": {
|
|
"using_temporary_table": true,
|
|
"optimized_frame_evaluation": true
|
|
},
|
|
"functions": [
|
|
"nth_value"
|
|
]
|
|
},
|
|
{
|
|
"name": "<unnamed window>",
|
|
"definition_position": 5,
|
|
"last_executed_window": true,
|
|
"using_temporary_table": true,
|
|
"using_filesort": true,
|
|
"filesort_key": [
|
|
"`j`"
|
|
],
|
|
"functions": [
|
|
"row_number"
|
|
]
|
|
}
|
|
],
|
|
"cost_info": {
|
|
"sort_cost": "15.00"
|
|
},
|
|
"table": {
|
|
"table_name": "t",
|
|
"access_type": "ALL",
|
|
"rows_examined_per_scan": 5,
|
|
"rows_produced_per_join": 5,
|
|
"filtered": "100.00",
|
|
"cost_info": {
|
|
"read_cost": "0.25",
|
|
"eval_cost": "0.50",
|
|
"prefix_cost": "0.75",
|
|
"data_read_per_join": "240"
|
|
},
|
|
"used_columns": [
|
|
"i",
|
|
"j"
|
|
]
|
|
}
|
|
}
|
|
}
|
|
}
|
|
}
|
|
Warnings:
|
|
Note 1003 /* select#1 */ select sum(`test`.`t`.`j`) OVER `w` AS `SUM(j) OVER w`,count(`test`.`t`.`j`) OVER () AS `COUNT(j) OVER ()`,avg(`test`.`t`.`j`) OVER (`w` ORDER BY `test`.`t`.`j` ) AS `AVG(j) OVER (w ORDER BY j)`,first_value(`test`.`t`.`j`) OVER `w` AS `FIRST_VALUE(j) OVER w` from `test`.`t` window `w` AS (PARTITION BY `test`.`t`.`i` ) order by last_value(`test`.`t`.`j`) OVER `w`,nth_value(`test`.`t`.`j`,1) OVER () ,row_number() OVER (PARTITION BY `test`.`t`.`j` )
|
|
DROP TABLE t;
|
|
#
|
|
# Bug#26114396 WL#9603: SIG11 AT OPT_EXPLAIN_JSON_NAMESPACE::WINDOW_CTX::FORMAT_BODY
|
|
#
|
|
CREATE TABLE t1(a int,b int);
|
|
CREATE TABLE t2(a int,b int);
|
|
INSERT INTO t1 VALUES (0,1);
|
|
ANALYZE TABLE t1;
|
|
Table Op Msg_type Msg_text
|
|
test.t1 analyze status OK
|
|
INSERT INTO t2 VALUES
|
|
(2,8),(81,0),(6,7),(8,1),(4,0),(0,2),(6,5),(5,4),(0,6),(9,3),
|
|
(5,0),(6,254),(6,0),(2,7),(8,73),(9,7),(3,5),(0,5),(7,75),(2,1);
|
|
ANALYZE TABLE t2;
|
|
Table Op Msg_type Msg_text
|
|
test.t2 analyze status OK
|
|
EXPLAIN FORMAT=JSON
|
|
SELECT ROW_NUMBER() OVER () AS rn
|
|
FROM ( t1 LEFT JOIN t2 ON (t2.a <= t1 . a ) )
|
|
WHERE t1.a = 3
|
|
GROUP BY t1.a;
|
|
EXPLAIN
|
|
{
|
|
"query_block": {
|
|
"select_id": 1,
|
|
"cost_info": {
|
|
"query_cost": "2.60"
|
|
},
|
|
"grouping_operation": {
|
|
"using_filesort": false,
|
|
"nested_loop": [
|
|
{
|
|
"table": {
|
|
"table_name": "t1",
|
|
"access_type": "ALL",
|
|
"rows_examined_per_scan": 1,
|
|
"rows_produced_per_join": 1,
|
|
"filtered": "100.00",
|
|
"cost_info": {
|
|
"read_cost": "0.25",
|
|
"eval_cost": "0.10",
|
|
"prefix_cost": "0.35",
|
|
"data_read_per_join": "16"
|
|
},
|
|
"used_columns": [
|
|
"a"
|
|
],
|
|
"attached_condition": "(`test`.`t1`.`a` = 3)"
|
|
}
|
|
},
|
|
{
|
|
"table": {
|
|
"table_name": "t2",
|
|
"access_type": "ALL",
|
|
"rows_examined_per_scan": 20,
|
|
"rows_produced_per_join": 20,
|
|
"filtered": "100.00",
|
|
"using_join_buffer": "Block Nested Loop",
|
|
"cost_info": {
|
|
"read_cost": "0.25",
|
|
"eval_cost": "2.00",
|
|
"prefix_cost": "2.60",
|
|
"data_read_per_join": "320"
|
|
},
|
|
"used_columns": [
|
|
"a"
|
|
],
|
|
"attached_condition": "<if>(is_not_null_compl(t2), (`test`.`t2`.`a` <= 3), true)"
|
|
}
|
|
}
|
|
]
|
|
}
|
|
}
|
|
}
|
|
Warnings:
|
|
Note 1003 /* select#1 */ select row_number() OVER () AS `rn` from `test`.`t1` left join `test`.`t2` on((`test`.`t2`.`a` <= 3)) where (`test`.`t1`.`a` = 3) group by `test`.`t1`.`a`
|
|
DROP TABLE t1,t2;
|
|
#
|
|
# Printing the true number of "using temporary table"
|
|
#
|
|
CREATE TABLE t1(a INT, b INT);
|
|
INSERT INTO t1 VALUES(1, 1);
|
|
FLUSH STATUS;
|
|
SELECT t1.a, SUM(t2.b) OVER(ORDER BY t1.a) FROM t1, t1 AS t2 ORDER BY t2.a;
|
|
a SUM(t2.b) OVER(ORDER BY t1.a)
|
|
1 1
|
|
SHOW STATUS LIKE 'Created_tmp_tables';
|
|
Variable_name Value
|
|
Created_tmp_tables 2
|
|
EXPLAIN FORMAT=JSON SELECT t1.a, SUM(t2.b) OVER(ORDER BY t1.a) FROM t1, t1 AS t2 ORDER BY t2.a;
|
|
EXPLAIN
|
|
{
|
|
"query_block": {
|
|
"select_id": 1,
|
|
"cost_info": {
|
|
"query_cost": "2.70"
|
|
},
|
|
"ordering_operation": {
|
|
"using_filesort": true,
|
|
"cost_info": {
|
|
"sort_cost": "1.00"
|
|
},
|
|
"windowing": {
|
|
"windows": [
|
|
{
|
|
"name": "<unnamed window>",
|
|
"using_temporary_table": true,
|
|
"using_filesort": true,
|
|
"filesort_key": [
|
|
"`a`"
|
|
],
|
|
"frame_buffer": {
|
|
"using_temporary_table": true,
|
|
"optimized_frame_evaluation": true
|
|
},
|
|
"functions": [
|
|
"sum"
|
|
]
|
|
}
|
|
],
|
|
"cost_info": {
|
|
"sort_cost": "1.00"
|
|
},
|
|
"buffer_result": {
|
|
"using_temporary_table": true,
|
|
"nested_loop": [
|
|
{
|
|
"table": {
|
|
"table_name": "t1",
|
|
"access_type": "ALL",
|
|
"rows_examined_per_scan": 1,
|
|
"rows_produced_per_join": 1,
|
|
"filtered": "100.00",
|
|
"cost_info": {
|
|
"read_cost": "0.25",
|
|
"eval_cost": "0.10",
|
|
"prefix_cost": "0.35",
|
|
"data_read_per_join": "16"
|
|
},
|
|
"used_columns": [
|
|
"a"
|
|
]
|
|
}
|
|
},
|
|
{
|
|
"table": {
|
|
"table_name": "t2",
|
|
"access_type": "ALL",
|
|
"rows_examined_per_scan": 1,
|
|
"rows_produced_per_join": 1,
|
|
"filtered": "100.00",
|
|
"using_join_buffer": "Block Nested Loop",
|
|
"cost_info": {
|
|
"read_cost": "0.25",
|
|
"eval_cost": "0.10",
|
|
"prefix_cost": "0.70",
|
|
"data_read_per_join": "16"
|
|
},
|
|
"used_columns": [
|
|
"a",
|
|
"b"
|
|
]
|
|
}
|
|
}
|
|
]
|
|
}
|
|
}
|
|
}
|
|
}
|
|
}
|
|
Warnings:
|
|
Note 1003 /* select#1 */ select `test`.`t1`.`a` AS `a`,sum(`test`.`t2`.`b`) OVER (ORDER BY `test`.`t1`.`a` ) AS `SUM(t2.b) OVER(ORDER BY t1.a)` from `test`.`t1` join `test`.`t1` `t2` order by `test`.`t2`.`a`
|
|
DROP TABLE t1;
|
|
#
|
|
# Bug#26612356 WINDOW FUNCTIONS: FIX COST ESTIMATES
|
|
#
|
|
CREATE TABLE t(i INT);
|
|
INSERT INTO t VALUES
|
|
(2), (3), (1), (5), (8), (4), (6), (2), (10), (16), (4), (6), (2),
|
|
(10), (16), (8), (12), (4), (20), (32), (19), (29), (9), (49), (79),
|
|
(39), (59), (19), (99), (159), (39), (59), (19), (99), (159), (79),
|
|
(119), (39), (199), (319);
|
|
ANALYZE TABLE t;
|
|
Table Op Msg_type Msg_text
|
|
test.t analyze status OK
|
|
EXPLAIN FORMAT=JSON SELECT * FROM t;
|
|
EXPLAIN
|
|
{
|
|
"query_block": {
|
|
"select_id": 1,
|
|
"cost_info": {
|
|
"query_cost": "4.25"
|
|
},
|
|
"table": {
|
|
"table_name": "t",
|
|
"access_type": "ALL",
|
|
"rows_examined_per_scan": 40,
|
|
"rows_produced_per_join": 40,
|
|
"filtered": "100.00",
|
|
"cost_info": {
|
|
"read_cost": "0.25",
|
|
"eval_cost": "4.00",
|
|
"prefix_cost": "4.25",
|
|
"data_read_per_join": "320"
|
|
},
|
|
"used_columns": [
|
|
"i"
|
|
]
|
|
}
|
|
}
|
|
}
|
|
Warnings:
|
|
Note 1003 /* select#1 */ select `test`.`t`.`i` AS `i` from `test`.`t`
|
|
EXPLAIN FORMAT=JSON SELECT * FROM t ORDER BY i;
|
|
EXPLAIN
|
|
{
|
|
"query_block": {
|
|
"select_id": 1,
|
|
"cost_info": {
|
|
"query_cost": "44.25"
|
|
},
|
|
"ordering_operation": {
|
|
"using_filesort": true,
|
|
"cost_info": {
|
|
"sort_cost": "40.00"
|
|
},
|
|
"table": {
|
|
"table_name": "t",
|
|
"access_type": "ALL",
|
|
"rows_examined_per_scan": 40,
|
|
"rows_produced_per_join": 40,
|
|
"filtered": "100.00",
|
|
"cost_info": {
|
|
"read_cost": "0.25",
|
|
"eval_cost": "4.00",
|
|
"prefix_cost": "4.25",
|
|
"data_read_per_join": "320"
|
|
},
|
|
"used_columns": [
|
|
"i"
|
|
]
|
|
}
|
|
}
|
|
}
|
|
}
|
|
Warnings:
|
|
Note 1003 /* select#1 */ select `test`.`t`.`i` AS `i` from `test`.`t` order by `test`.`t`.`i`
|
|
EXPLAIN FORMAT=JSON SELECT * FROM t GROUP BY i;
|
|
EXPLAIN
|
|
{
|
|
"query_block": {
|
|
"select_id": 1,
|
|
"cost_info": {
|
|
"query_cost": "4.25"
|
|
},
|
|
"grouping_operation": {
|
|
"using_temporary_table": true,
|
|
"using_filesort": false,
|
|
"table": {
|
|
"table_name": "t",
|
|
"access_type": "ALL",
|
|
"rows_examined_per_scan": 40,
|
|
"rows_produced_per_join": 40,
|
|
"filtered": "100.00",
|
|
"cost_info": {
|
|
"read_cost": "0.25",
|
|
"eval_cost": "4.00",
|
|
"prefix_cost": "4.25",
|
|
"data_read_per_join": "320"
|
|
},
|
|
"used_columns": [
|
|
"i"
|
|
]
|
|
}
|
|
}
|
|
}
|
|
}
|
|
Warnings:
|
|
Note 1003 /* select#1 */ select `test`.`t`.`i` AS `i` from `test`.`t` group by `test`.`t`.`i`
|
|
EXPLAIN FORMAT=JSON SELECT * FROM t GROUP BY i ORDER BY i DESC;
|
|
EXPLAIN
|
|
{
|
|
"query_block": {
|
|
"select_id": 1,
|
|
"cost_info": {
|
|
"query_cost": "44.25"
|
|
},
|
|
"ordering_operation": {
|
|
"using_filesort": false,
|
|
"grouping_operation": {
|
|
"using_temporary_table": true,
|
|
"using_filesort": true,
|
|
"cost_info": {
|
|
"sort_cost": "40.00"
|
|
},
|
|
"table": {
|
|
"table_name": "t",
|
|
"access_type": "ALL",
|
|
"rows_examined_per_scan": 40,
|
|
"rows_produced_per_join": 40,
|
|
"filtered": "100.00",
|
|
"cost_info": {
|
|
"read_cost": "0.25",
|
|
"eval_cost": "4.00",
|
|
"prefix_cost": "4.25",
|
|
"data_read_per_join": "320"
|
|
},
|
|
"used_columns": [
|
|
"i"
|
|
]
|
|
}
|
|
}
|
|
}
|
|
}
|
|
}
|
|
Warnings:
|
|
Note 1003 /* select#1 */ select `test`.`t`.`i` AS `i` from `test`.`t` group by `test`.`t`.`i` desc order by `test`.`t`.`i` desc
|
|
EXPLAIN FORMAT=JSON SELECT ROW_NUMBER() OVER () FROM t;
|
|
EXPLAIN
|
|
{
|
|
"query_block": {
|
|
"select_id": 1,
|
|
"cost_info": {
|
|
"query_cost": "4.25"
|
|
},
|
|
"windowing": {
|
|
"windows": [
|
|
{
|
|
"name": "<unnamed window>",
|
|
"functions": [
|
|
"row_number"
|
|
]
|
|
}
|
|
],
|
|
"table": {
|
|
"table_name": "t",
|
|
"access_type": "ALL",
|
|
"rows_examined_per_scan": 40,
|
|
"rows_produced_per_join": 40,
|
|
"filtered": "100.00",
|
|
"cost_info": {
|
|
"read_cost": "0.25",
|
|
"eval_cost": "4.00",
|
|
"prefix_cost": "4.25",
|
|
"data_read_per_join": "320"
|
|
}
|
|
}
|
|
}
|
|
}
|
|
}
|
|
Warnings:
|
|
Note 1003 /* select#1 */ select row_number() OVER () AS `ROW_NUMBER() OVER ()` from `test`.`t`
|
|
EXPLAIN FORMAT=JSON SELECT DISTINCT i FROM t;
|
|
EXPLAIN
|
|
{
|
|
"query_block": {
|
|
"select_id": 1,
|
|
"cost_info": {
|
|
"query_cost": "4.25"
|
|
},
|
|
"duplicates_removal": {
|
|
"using_temporary_table": true,
|
|
"using_filesort": false,
|
|
"table": {
|
|
"table_name": "t",
|
|
"access_type": "ALL",
|
|
"rows_examined_per_scan": 40,
|
|
"rows_produced_per_join": 40,
|
|
"filtered": "100.00",
|
|
"cost_info": {
|
|
"read_cost": "0.25",
|
|
"eval_cost": "4.00",
|
|
"prefix_cost": "4.25",
|
|
"data_read_per_join": "320"
|
|
},
|
|
"used_columns": [
|
|
"i"
|
|
]
|
|
}
|
|
}
|
|
}
|
|
}
|
|
Warnings:
|
|
Note 1003 /* select#1 */ select distinct `test`.`t`.`i` AS `i` from `test`.`t`
|
|
EXPLAIN FORMAT=JSON SELECT DISTINCT ROW_NUMBER() OVER () FROM t;
|
|
EXPLAIN
|
|
{
|
|
"query_block": {
|
|
"select_id": 1,
|
|
"cost_info": {
|
|
"query_cost": "4.25"
|
|
},
|
|
"duplicates_removal": {
|
|
"using_filesort": false,
|
|
"windowing": {
|
|
"windows": [
|
|
{
|
|
"name": "<unnamed window>",
|
|
"using_temporary_table": true,
|
|
"functions": [
|
|
"row_number"
|
|
]
|
|
}
|
|
],
|
|
"table": {
|
|
"table_name": "t",
|
|
"access_type": "ALL",
|
|
"rows_examined_per_scan": 40,
|
|
"rows_produced_per_join": 40,
|
|
"filtered": "100.00",
|
|
"cost_info": {
|
|
"read_cost": "0.25",
|
|
"eval_cost": "4.00",
|
|
"prefix_cost": "4.25",
|
|
"data_read_per_join": "320"
|
|
}
|
|
}
|
|
}
|
|
}
|
|
}
|
|
}
|
|
Warnings:
|
|
Note 1003 /* select#1 */ select distinct row_number() OVER () AS `ROW_NUMBER() OVER ()` from `test`.`t`
|
|
EXPLAIN FORMAT=JSON SELECT ROW_NUMBER() OVER () FROM t ORDER BY i;
|
|
EXPLAIN
|
|
{
|
|
"query_block": {
|
|
"select_id": 1,
|
|
"cost_info": {
|
|
"query_cost": "44.25"
|
|
},
|
|
"ordering_operation": {
|
|
"using_filesort": true,
|
|
"cost_info": {
|
|
"sort_cost": "40.00"
|
|
},
|
|
"windowing": {
|
|
"windows": [
|
|
{
|
|
"name": "<unnamed window>",
|
|
"functions": [
|
|
"row_number"
|
|
]
|
|
}
|
|
],
|
|
"table": {
|
|
"table_name": "t",
|
|
"access_type": "ALL",
|
|
"rows_examined_per_scan": 40,
|
|
"rows_produced_per_join": 40,
|
|
"filtered": "100.00",
|
|
"cost_info": {
|
|
"read_cost": "0.25",
|
|
"eval_cost": "4.00",
|
|
"prefix_cost": "4.25",
|
|
"data_read_per_join": "320"
|
|
},
|
|
"used_columns": [
|
|
"i"
|
|
]
|
|
}
|
|
}
|
|
}
|
|
}
|
|
}
|
|
Warnings:
|
|
Note 1003 /* select#1 */ select row_number() OVER () AS `ROW_NUMBER() OVER ()` from `test`.`t` order by `test`.`t`.`i`
|
|
EXPLAIN FORMAT=JSON SELECT ROW_NUMBER() OVER () FROM t GROUP BY i;
|
|
EXPLAIN
|
|
{
|
|
"query_block": {
|
|
"select_id": 1,
|
|
"cost_info": {
|
|
"query_cost": "4.25"
|
|
},
|
|
"windowing": {
|
|
"windows": [
|
|
{
|
|
"name": "<unnamed window>",
|
|
"functions": [
|
|
"row_number"
|
|
]
|
|
}
|
|
],
|
|
"grouping_operation": {
|
|
"using_temporary_table": true,
|
|
"using_filesort": false,
|
|
"table": {
|
|
"table_name": "t",
|
|
"access_type": "ALL",
|
|
"rows_examined_per_scan": 40,
|
|
"rows_produced_per_join": 40,
|
|
"filtered": "100.00",
|
|
"cost_info": {
|
|
"read_cost": "0.25",
|
|
"eval_cost": "4.00",
|
|
"prefix_cost": "4.25",
|
|
"data_read_per_join": "320"
|
|
},
|
|
"used_columns": [
|
|
"i"
|
|
]
|
|
}
|
|
}
|
|
}
|
|
}
|
|
}
|
|
Warnings:
|
|
Note 1003 /* select#1 */ select row_number() OVER () AS `ROW_NUMBER() OVER ()` from `test`.`t` group by `test`.`t`.`i`
|
|
EXPLAIN FORMAT=JSON SELECT ROW_NUMBER() OVER (PARTITION BY i) FROM t;
|
|
EXPLAIN
|
|
{
|
|
"query_block": {
|
|
"select_id": 1,
|
|
"cost_info": {
|
|
"query_cost": "44.25"
|
|
},
|
|
"windowing": {
|
|
"windows": [
|
|
{
|
|
"name": "<unnamed window>",
|
|
"using_filesort": true,
|
|
"filesort_key": [
|
|
"`i`"
|
|
],
|
|
"functions": [
|
|
"row_number"
|
|
]
|
|
}
|
|
],
|
|
"cost_info": {
|
|
"sort_cost": "40.00"
|
|
},
|
|
"table": {
|
|
"table_name": "t",
|
|
"access_type": "ALL",
|
|
"rows_examined_per_scan": 40,
|
|
"rows_produced_per_join": 40,
|
|
"filtered": "100.00",
|
|
"cost_info": {
|
|
"read_cost": "0.25",
|
|
"eval_cost": "4.00",
|
|
"prefix_cost": "4.25",
|
|
"data_read_per_join": "320"
|
|
},
|
|
"used_columns": [
|
|
"i"
|
|
]
|
|
}
|
|
}
|
|
}
|
|
}
|
|
Warnings:
|
|
Note 1003 /* select#1 */ select row_number() OVER (PARTITION BY `test`.`t`.`i` ) AS `ROW_NUMBER() OVER (PARTITION BY i)` from `test`.`t`
|
|
EXPLAIN FORMAT=JSON SELECT DISTINCT ROW_NUMBER() OVER (PARTITION BY i) FROM t;
|
|
EXPLAIN
|
|
{
|
|
"query_block": {
|
|
"select_id": 1,
|
|
"cost_info": {
|
|
"query_cost": "44.25"
|
|
},
|
|
"duplicates_removal": {
|
|
"using_filesort": false,
|
|
"windowing": {
|
|
"windows": [
|
|
{
|
|
"name": "<unnamed window>",
|
|
"using_temporary_table": true,
|
|
"using_filesort": true,
|
|
"filesort_key": [
|
|
"`i`"
|
|
],
|
|
"functions": [
|
|
"row_number"
|
|
]
|
|
}
|
|
],
|
|
"cost_info": {
|
|
"sort_cost": "40.00"
|
|
},
|
|
"table": {
|
|
"table_name": "t",
|
|
"access_type": "ALL",
|
|
"rows_examined_per_scan": 40,
|
|
"rows_produced_per_join": 40,
|
|
"filtered": "100.00",
|
|
"cost_info": {
|
|
"read_cost": "0.25",
|
|
"eval_cost": "4.00",
|
|
"prefix_cost": "4.25",
|
|
"data_read_per_join": "320"
|
|
},
|
|
"used_columns": [
|
|
"i"
|
|
]
|
|
}
|
|
}
|
|
}
|
|
}
|
|
}
|
|
Warnings:
|
|
Note 1003 /* select#1 */ select distinct row_number() OVER (PARTITION BY `test`.`t`.`i` ) AS `ROW_NUMBER() OVER (PARTITION BY i)` from `test`.`t`
|
|
Final ORDER BY i could be eliminated
|
|
EXPLAIN FORMAT=JSON SELECT ROW_NUMBER() OVER (PARTITION BY i) FROM t ORDER BY i;
|
|
EXPLAIN
|
|
{
|
|
"query_block": {
|
|
"select_id": 1,
|
|
"cost_info": {
|
|
"query_cost": "84.25"
|
|
},
|
|
"ordering_operation": {
|
|
"using_filesort": true,
|
|
"cost_info": {
|
|
"sort_cost": "40.00"
|
|
},
|
|
"windowing": {
|
|
"windows": [
|
|
{
|
|
"name": "<unnamed window>",
|
|
"using_temporary_table": true,
|
|
"using_filesort": true,
|
|
"filesort_key": [
|
|
"`i`"
|
|
],
|
|
"functions": [
|
|
"row_number"
|
|
]
|
|
}
|
|
],
|
|
"cost_info": {
|
|
"sort_cost": "40.00"
|
|
},
|
|
"table": {
|
|
"table_name": "t",
|
|
"access_type": "ALL",
|
|
"rows_examined_per_scan": 40,
|
|
"rows_produced_per_join": 40,
|
|
"filtered": "100.00",
|
|
"cost_info": {
|
|
"read_cost": "0.25",
|
|
"eval_cost": "4.00",
|
|
"prefix_cost": "4.25",
|
|
"data_read_per_join": "320"
|
|
},
|
|
"used_columns": [
|
|
"i"
|
|
]
|
|
}
|
|
}
|
|
}
|
|
}
|
|
}
|
|
Warnings:
|
|
Note 1003 /* select#1 */ select row_number() OVER (PARTITION BY `test`.`t`.`i` ) AS `ROW_NUMBER() OVER (PARTITION BY i)` from `test`.`t` order by `test`.`t`.`i`
|
|
EXPLAIN FORMAT=JSON SELECT ROW_NUMBER() OVER (PARTITION BY i) FROM t ORDER BY i DESC;
|
|
EXPLAIN
|
|
{
|
|
"query_block": {
|
|
"select_id": 1,
|
|
"cost_info": {
|
|
"query_cost": "84.25"
|
|
},
|
|
"ordering_operation": {
|
|
"using_filesort": true,
|
|
"cost_info": {
|
|
"sort_cost": "40.00"
|
|
},
|
|
"windowing": {
|
|
"windows": [
|
|
{
|
|
"name": "<unnamed window>",
|
|
"using_temporary_table": true,
|
|
"using_filesort": true,
|
|
"filesort_key": [
|
|
"`i`"
|
|
],
|
|
"functions": [
|
|
"row_number"
|
|
]
|
|
}
|
|
],
|
|
"cost_info": {
|
|
"sort_cost": "40.00"
|
|
},
|
|
"table": {
|
|
"table_name": "t",
|
|
"access_type": "ALL",
|
|
"rows_examined_per_scan": 40,
|
|
"rows_produced_per_join": 40,
|
|
"filtered": "100.00",
|
|
"cost_info": {
|
|
"read_cost": "0.25",
|
|
"eval_cost": "4.00",
|
|
"prefix_cost": "4.25",
|
|
"data_read_per_join": "320"
|
|
},
|
|
"used_columns": [
|
|
"i"
|
|
]
|
|
}
|
|
}
|
|
}
|
|
}
|
|
}
|
|
Warnings:
|
|
Note 1003 /* select#1 */ select row_number() OVER (PARTITION BY `test`.`t`.`i` ) AS `ROW_NUMBER() OVER (PARTITION BY i)` from `test`.`t` order by `test`.`t`.`i` desc
|
|
EXPLAIN FORMAT=JSON SELECT ROW_NUMBER() OVER (PARTITION BY i), SUM(i) OVER () FROM t;
|
|
EXPLAIN
|
|
{
|
|
"query_block": {
|
|
"select_id": 1,
|
|
"cost_info": {
|
|
"query_cost": "44.25"
|
|
},
|
|
"windowing": {
|
|
"windows": [
|
|
{
|
|
"name": "<unnamed window>",
|
|
"definition_position": 1,
|
|
"using_temporary_table": true,
|
|
"using_filesort": true,
|
|
"filesort_key": [
|
|
"`i`"
|
|
],
|
|
"functions": [
|
|
"row_number"
|
|
]
|
|
},
|
|
{
|
|
"name": "<unnamed window>",
|
|
"definition_position": 2,
|
|
"last_executed_window": true,
|
|
"frame_buffer": {
|
|
"using_temporary_table": true,
|
|
"optimized_frame_evaluation": true
|
|
},
|
|
"functions": [
|
|
"sum"
|
|
]
|
|
}
|
|
],
|
|
"cost_info": {
|
|
"sort_cost": "40.00"
|
|
},
|
|
"table": {
|
|
"table_name": "t",
|
|
"access_type": "ALL",
|
|
"rows_examined_per_scan": 40,
|
|
"rows_produced_per_join": 40,
|
|
"filtered": "100.00",
|
|
"cost_info": {
|
|
"read_cost": "0.25",
|
|
"eval_cost": "4.00",
|
|
"prefix_cost": "4.25",
|
|
"data_read_per_join": "320"
|
|
},
|
|
"used_columns": [
|
|
"i"
|
|
]
|
|
}
|
|
}
|
|
}
|
|
}
|
|
Warnings:
|
|
Note 1003 /* select#1 */ select row_number() OVER (PARTITION BY `test`.`t`.`i` ) AS `ROW_NUMBER() OVER (PARTITION BY i)`,sum(`test`.`t`.`i`) OVER () AS `SUM(i) OVER ()` from `test`.`t`
|
|
Sorting for 2nd window redundant and skipped
|
|
EXPLAIN FORMAT=JSON SELECT ROW_NUMBER() OVER (PARTITION BY i), SUM(i) OVER (ORDER BY i) FROM t;
|
|
EXPLAIN
|
|
{
|
|
"query_block": {
|
|
"select_id": 1,
|
|
"cost_info": {
|
|
"query_cost": "44.25"
|
|
},
|
|
"windowing": {
|
|
"windows": [
|
|
{
|
|
"name": "<unnamed window>",
|
|
"definition_position": 1,
|
|
"using_temporary_table": true,
|
|
"using_filesort": true,
|
|
"filesort_key": [
|
|
"`i`"
|
|
],
|
|
"functions": [
|
|
"row_number"
|
|
]
|
|
},
|
|
{
|
|
"name": "<unnamed window>",
|
|
"definition_position": 2,
|
|
"last_executed_window": true,
|
|
"frame_buffer": {
|
|
"using_temporary_table": true,
|
|
"optimized_frame_evaluation": true
|
|
},
|
|
"functions": [
|
|
"sum"
|
|
]
|
|
}
|
|
],
|
|
"cost_info": {
|
|
"sort_cost": "40.00"
|
|
},
|
|
"table": {
|
|
"table_name": "t",
|
|
"access_type": "ALL",
|
|
"rows_examined_per_scan": 40,
|
|
"rows_produced_per_join": 40,
|
|
"filtered": "100.00",
|
|
"cost_info": {
|
|
"read_cost": "0.25",
|
|
"eval_cost": "4.00",
|
|
"prefix_cost": "4.25",
|
|
"data_read_per_join": "320"
|
|
},
|
|
"used_columns": [
|
|
"i"
|
|
]
|
|
}
|
|
}
|
|
}
|
|
}
|
|
Warnings:
|
|
Note 1003 /* select#1 */ select row_number() OVER (PARTITION BY `test`.`t`.`i` ) AS `ROW_NUMBER() OVER (PARTITION BY i)`,sum(`test`.`t`.`i`) OVER (ORDER BY `test`.`t`.`i` ) AS `SUM(i) OVER (ORDER BY i)` from `test`.`t`
|
|
EXPLAIN FORMAT=JSON SELECT ROW_NUMBER() OVER (PARTITION BY i), SUM(i) OVER (ORDER BY i DESC) FROM t;
|
|
EXPLAIN
|
|
{
|
|
"query_block": {
|
|
"select_id": 1,
|
|
"cost_info": {
|
|
"query_cost": "84.25"
|
|
},
|
|
"windowing": {
|
|
"windows": [
|
|
{
|
|
"name": "<unnamed window>",
|
|
"definition_position": 1,
|
|
"using_temporary_table": true,
|
|
"using_filesort": true,
|
|
"filesort_key": [
|
|
"`i`"
|
|
],
|
|
"functions": [
|
|
"row_number"
|
|
]
|
|
},
|
|
{
|
|
"name": "<unnamed window>",
|
|
"definition_position": 2,
|
|
"last_executed_window": true,
|
|
"using_filesort": true,
|
|
"filesort_key": [
|
|
"`i` desc"
|
|
],
|
|
"frame_buffer": {
|
|
"using_temporary_table": true,
|
|
"optimized_frame_evaluation": true
|
|
},
|
|
"functions": [
|
|
"sum"
|
|
]
|
|
}
|
|
],
|
|
"cost_info": {
|
|
"sort_cost": "80.00"
|
|
},
|
|
"table": {
|
|
"table_name": "t",
|
|
"access_type": "ALL",
|
|
"rows_examined_per_scan": 40,
|
|
"rows_produced_per_join": 40,
|
|
"filtered": "100.00",
|
|
"cost_info": {
|
|
"read_cost": "0.25",
|
|
"eval_cost": "4.00",
|
|
"prefix_cost": "4.25",
|
|
"data_read_per_join": "320"
|
|
},
|
|
"used_columns": [
|
|
"i"
|
|
]
|
|
}
|
|
}
|
|
}
|
|
}
|
|
Warnings:
|
|
Note 1003 /* select#1 */ select row_number() OVER (PARTITION BY `test`.`t`.`i` ) AS `ROW_NUMBER() OVER (PARTITION BY i)`,sum(`test`.`t`.`i`) OVER (ORDER BY `test`.`t`.`i` desc ) AS `SUM(i) OVER (ORDER BY i DESC)` from `test`.`t`
|
|
EXPLAIN FORMAT=JSON SELECT ROW_NUMBER() OVER (PARTITION BY i), SUM(i) OVER (ORDER BY i DESC) FROM t GROUP BY i;
|
|
EXPLAIN
|
|
{
|
|
"query_block": {
|
|
"select_id": 1,
|
|
"cost_info": {
|
|
"query_cost": "84.25"
|
|
},
|
|
"windowing": {
|
|
"windows": [
|
|
{
|
|
"name": "<unnamed window>",
|
|
"definition_position": 1,
|
|
"using_temporary_table": true,
|
|
"using_filesort": true,
|
|
"filesort_key": [
|
|
"`i`"
|
|
],
|
|
"functions": [
|
|
"row_number"
|
|
]
|
|
},
|
|
{
|
|
"name": "<unnamed window>",
|
|
"definition_position": 2,
|
|
"last_executed_window": true,
|
|
"using_filesort": true,
|
|
"filesort_key": [
|
|
"`i` desc"
|
|
],
|
|
"frame_buffer": {
|
|
"using_temporary_table": true,
|
|
"optimized_frame_evaluation": true
|
|
},
|
|
"functions": [
|
|
"sum"
|
|
]
|
|
}
|
|
],
|
|
"cost_info": {
|
|
"sort_cost": "80.00"
|
|
},
|
|
"grouping_operation": {
|
|
"using_temporary_table": true,
|
|
"using_filesort": false,
|
|
"table": {
|
|
"table_name": "t",
|
|
"access_type": "ALL",
|
|
"rows_examined_per_scan": 40,
|
|
"rows_produced_per_join": 40,
|
|
"filtered": "100.00",
|
|
"cost_info": {
|
|
"read_cost": "0.25",
|
|
"eval_cost": "4.00",
|
|
"prefix_cost": "4.25",
|
|
"data_read_per_join": "320"
|
|
},
|
|
"used_columns": [
|
|
"i"
|
|
]
|
|
}
|
|
}
|
|
}
|
|
}
|
|
}
|
|
Warnings:
|
|
Note 1003 /* select#1 */ select row_number() OVER (PARTITION BY `test`.`t`.`i` ) AS `ROW_NUMBER() OVER (PARTITION BY i)`,sum(`test`.`t`.`i`) OVER (ORDER BY `test`.`t`.`i` desc ) AS `SUM(i) OVER (ORDER BY i DESC)` from `test`.`t` group by `test`.`t`.`i`
|
|
EXPLAIN FORMAT=JSON SELECT ROW_NUMBER() OVER (PARTITION BY i), SUM(i) OVER (ORDER BY i DESC) FROM t GROUP BY i;
|
|
EXPLAIN
|
|
{
|
|
"query_block": {
|
|
"select_id": 1,
|
|
"cost_info": {
|
|
"query_cost": "84.25"
|
|
},
|
|
"windowing": {
|
|
"windows": [
|
|
{
|
|
"name": "<unnamed window>",
|
|
"definition_position": 1,
|
|
"using_temporary_table": true,
|
|
"using_filesort": true,
|
|
"filesort_key": [
|
|
"`i`"
|
|
],
|
|
"functions": [
|
|
"row_number"
|
|
]
|
|
},
|
|
{
|
|
"name": "<unnamed window>",
|
|
"definition_position": 2,
|
|
"last_executed_window": true,
|
|
"using_filesort": true,
|
|
"filesort_key": [
|
|
"`i` desc"
|
|
],
|
|
"frame_buffer": {
|
|
"using_temporary_table": true,
|
|
"optimized_frame_evaluation": true
|
|
},
|
|
"functions": [
|
|
"sum"
|
|
]
|
|
}
|
|
],
|
|
"cost_info": {
|
|
"sort_cost": "80.00"
|
|
},
|
|
"grouping_operation": {
|
|
"using_temporary_table": true,
|
|
"using_filesort": false,
|
|
"table": {
|
|
"table_name": "t",
|
|
"access_type": "ALL",
|
|
"rows_examined_per_scan": 40,
|
|
"rows_produced_per_join": 40,
|
|
"filtered": "100.00",
|
|
"cost_info": {
|
|
"read_cost": "0.25",
|
|
"eval_cost": "4.00",
|
|
"prefix_cost": "4.25",
|
|
"data_read_per_join": "320"
|
|
},
|
|
"used_columns": [
|
|
"i"
|
|
]
|
|
}
|
|
}
|
|
}
|
|
}
|
|
}
|
|
Warnings:
|
|
Note 1003 /* select#1 */ select row_number() OVER (PARTITION BY `test`.`t`.`i` ) AS `ROW_NUMBER() OVER (PARTITION BY i)`,sum(`test`.`t`.`i`) OVER (ORDER BY `test`.`t`.`i` desc ) AS `SUM(i) OVER (ORDER BY i DESC)` from `test`.`t` group by `test`.`t`.`i`
|
|
Could be optimized further to drop final ordering
|
|
EXPLAIN FORMAT=JSON SELECT ROW_NUMBER() OVER (PARTITION BY i), SUM(i) OVER (ORDER BY i DESC) FROM t GROUP BY i ORDER BY i DESC;
|
|
EXPLAIN
|
|
{
|
|
"query_block": {
|
|
"select_id": 1,
|
|
"cost_info": {
|
|
"query_cost": "124.25"
|
|
},
|
|
"ordering_operation": {
|
|
"using_filesort": true,
|
|
"cost_info": {
|
|
"sort_cost": "40.00"
|
|
},
|
|
"windowing": {
|
|
"windows": [
|
|
{
|
|
"name": "<unnamed window>",
|
|
"definition_position": 1,
|
|
"using_temporary_table": true,
|
|
"using_filesort": true,
|
|
"filesort_key": [
|
|
"`i`"
|
|
],
|
|
"functions": [
|
|
"row_number"
|
|
]
|
|
},
|
|
{
|
|
"name": "<unnamed window>",
|
|
"definition_position": 2,
|
|
"last_executed_window": true,
|
|
"using_temporary_table": true,
|
|
"using_filesort": true,
|
|
"filesort_key": [
|
|
"`i` desc"
|
|
],
|
|
"frame_buffer": {
|
|
"using_temporary_table": true,
|
|
"optimized_frame_evaluation": true
|
|
},
|
|
"functions": [
|
|
"sum"
|
|
]
|
|
}
|
|
],
|
|
"cost_info": {
|
|
"sort_cost": "80.00"
|
|
},
|
|
"grouping_operation": {
|
|
"using_temporary_table": true,
|
|
"using_filesort": false,
|
|
"table": {
|
|
"table_name": "t",
|
|
"access_type": "ALL",
|
|
"rows_examined_per_scan": 40,
|
|
"rows_produced_per_join": 40,
|
|
"filtered": "100.00",
|
|
"cost_info": {
|
|
"read_cost": "0.25",
|
|
"eval_cost": "4.00",
|
|
"prefix_cost": "4.25",
|
|
"data_read_per_join": "320"
|
|
},
|
|
"used_columns": [
|
|
"i"
|
|
]
|
|
}
|
|
}
|
|
}
|
|
}
|
|
}
|
|
}
|
|
Warnings:
|
|
Note 1003 /* select#1 */ select row_number() OVER (PARTITION BY `test`.`t`.`i` ) AS `ROW_NUMBER() OVER (PARTITION BY i)`,sum(`test`.`t`.`i`) OVER (ORDER BY `test`.`t`.`i` desc ) AS `SUM(i) OVER (ORDER BY i DESC)` from `test`.`t` group by `test`.`t`.`i` desc order by `test`.`t`.`i` desc
|
|
Reordering of windows could have made it possible to eliminate final ORDER BY
|
|
EXPLAIN FORMAT=JSON SELECT ROW_NUMBER() OVER (PARTITION BY i), SUM(i) OVER (ORDER BY i DESC) FROM t GROUP BY i ORDER BY i;
|
|
EXPLAIN
|
|
{
|
|
"query_block": {
|
|
"select_id": 1,
|
|
"cost_info": {
|
|
"query_cost": "124.25"
|
|
},
|
|
"ordering_operation": {
|
|
"using_filesort": true,
|
|
"cost_info": {
|
|
"sort_cost": "40.00"
|
|
},
|
|
"windowing": {
|
|
"windows": [
|
|
{
|
|
"name": "<unnamed window>",
|
|
"definition_position": 1,
|
|
"using_temporary_table": true,
|
|
"using_filesort": true,
|
|
"filesort_key": [
|
|
"`i`"
|
|
],
|
|
"functions": [
|
|
"row_number"
|
|
]
|
|
},
|
|
{
|
|
"name": "<unnamed window>",
|
|
"definition_position": 2,
|
|
"last_executed_window": true,
|
|
"using_temporary_table": true,
|
|
"using_filesort": true,
|
|
"filesort_key": [
|
|
"`i` desc"
|
|
],
|
|
"frame_buffer": {
|
|
"using_temporary_table": true,
|
|
"optimized_frame_evaluation": true
|
|
},
|
|
"functions": [
|
|
"sum"
|
|
]
|
|
}
|
|
],
|
|
"cost_info": {
|
|
"sort_cost": "80.00"
|
|
},
|
|
"grouping_operation": {
|
|
"using_temporary_table": true,
|
|
"using_filesort": false,
|
|
"table": {
|
|
"table_name": "t",
|
|
"access_type": "ALL",
|
|
"rows_examined_per_scan": 40,
|
|
"rows_produced_per_join": 40,
|
|
"filtered": "100.00",
|
|
"cost_info": {
|
|
"read_cost": "0.25",
|
|
"eval_cost": "4.00",
|
|
"prefix_cost": "4.25",
|
|
"data_read_per_join": "320"
|
|
},
|
|
"used_columns": [
|
|
"i"
|
|
]
|
|
}
|
|
}
|
|
}
|
|
}
|
|
}
|
|
}
|
|
Warnings:
|
|
Note 1003 /* select#1 */ select row_number() OVER (PARTITION BY `test`.`t`.`i` ) AS `ROW_NUMBER() OVER (PARTITION BY i)`,sum(`test`.`t`.`i`) OVER (ORDER BY `test`.`t`.`i` desc ) AS `SUM(i) OVER (ORDER BY i DESC)` from `test`.`t` group by `test`.`t`.`i` order by `test`.`t`.`i`
|
|
Implicit grouping should eliminate windowing ordering costs: only one row
|
|
EXPLAIN FORMAT=JSON SELECT ROW_NUMBER() OVER (ORDER BY AVG(i)) AS rn FROM t;
|
|
EXPLAIN
|
|
{
|
|
"query_block": {
|
|
"select_id": 1,
|
|
"cost_info": {
|
|
"query_cost": "4.25"
|
|
},
|
|
"table": {
|
|
"table_name": "t",
|
|
"access_type": "ALL",
|
|
"rows_examined_per_scan": 40,
|
|
"rows_produced_per_join": 40,
|
|
"filtered": "100.00",
|
|
"cost_info": {
|
|
"read_cost": "0.25",
|
|
"eval_cost": "4.00",
|
|
"prefix_cost": "4.25",
|
|
"data_read_per_join": "320"
|
|
},
|
|
"used_columns": [
|
|
"i"
|
|
]
|
|
}
|
|
}
|
|
}
|
|
Warnings:
|
|
Note 1003 /* select#1 */ select row_number() OVER (ORDER BY avg(`test`.`t`.`i`) ) AS `rn` from `test`.`t`
|
|
Used to miss printing the sorting key
|
|
EXPLAIN FORMAT=JSON SELECT ROW_NUMBER() OVER (PARTITION BY i) FROM t;
|
|
EXPLAIN
|
|
{
|
|
"query_block": {
|
|
"select_id": 1,
|
|
"cost_info": {
|
|
"query_cost": "44.25"
|
|
},
|
|
"windowing": {
|
|
"windows": [
|
|
{
|
|
"name": "<unnamed window>",
|
|
"using_filesort": true,
|
|
"filesort_key": [
|
|
"`i`"
|
|
],
|
|
"functions": [
|
|
"row_number"
|
|
]
|
|
}
|
|
],
|
|
"cost_info": {
|
|
"sort_cost": "40.00"
|
|
},
|
|
"table": {
|
|
"table_name": "t",
|
|
"access_type": "ALL",
|
|
"rows_examined_per_scan": 40,
|
|
"rows_produced_per_join": 40,
|
|
"filtered": "100.00",
|
|
"cost_info": {
|
|
"read_cost": "0.25",
|
|
"eval_cost": "4.00",
|
|
"prefix_cost": "4.25",
|
|
"data_read_per_join": "320"
|
|
},
|
|
"used_columns": [
|
|
"i"
|
|
]
|
|
}
|
|
}
|
|
}
|
|
}
|
|
Warnings:
|
|
Note 1003 /* select#1 */ select row_number() OVER (PARTITION BY `test`.`t`.`i` ) AS `ROW_NUMBER() OVER (PARTITION BY i)` from `test`.`t`
|
|
Test optimizer trace with window costs
|
|
SET optimizer_trace="enabled=on";
|
|
SELECT ROW_NUMBER() OVER (PARTITION BY i), SUM(i) OVER (ORDER BY i DESC) FROM t GROUP BY i ORDER BY i;
|
|
ROW_NUMBER() OVER (PARTITION BY i) SUM(i) OVER (ORDER BY i DESC)
|
|
1 1297
|
|
1 1296
|
|
1 1294
|
|
1 1291
|
|
1 1287
|
|
1 1282
|
|
1 1276
|
|
1 1268
|
|
1 1259
|
|
1 1249
|
|
1 1237
|
|
1 1221
|
|
1 1202
|
|
1 1182
|
|
1 1153
|
|
1 1121
|
|
1 1082
|
|
1 1033
|
|
1 974
|
|
1 895
|
|
1 796
|
|
1 677
|
|
1 518
|
|
1 319
|
|
SELECT * FROM INFORMATION_SCHEMA.OPTIMIZER_TRACE;
|
|
QUERY TRACE MISSING_BYTES_BEYOND_MAX_MEM_SIZE INSUFFICIENT_PRIVILEGES
|
|
SELECT ROW_NUMBER() OVER (PARTITION BY i), SUM(i) OVER (ORDER BY i DESC) FROM t GROUP BY i ORDER BY i {
|
|
"steps": [
|
|
{
|
|
"join_preparation": {
|
|
"select#": 1,
|
|
"steps": [
|
|
{
|
|
"expanded_query": "/* select#1 */ select row_number() OVER (PARTITION BY `t`.`i` ) AS `ROW_NUMBER() OVER (PARTITION BY i)`,sum(`t`.`i`) OVER (ORDER BY `t`.`i` desc ) AS `SUM(i) OVER (ORDER BY i DESC)` from `t` group by `t`.`i` order by `t`.`i`"
|
|
}
|
|
]
|
|
}
|
|
},
|
|
{
|
|
"join_optimization": {
|
|
"select#": 1,
|
|
"steps": [
|
|
{
|
|
"substitute_generated_columns": {
|
|
}
|
|
},
|
|
{
|
|
"table_dependencies": [
|
|
{
|
|
"table": "`t`",
|
|
"row_may_be_null": false,
|
|
"map_bit": 0,
|
|
"depends_on_map_bits": [
|
|
]
|
|
}
|
|
]
|
|
},
|
|
{
|
|
"rows_estimation": [
|
|
{
|
|
"table": "`t`",
|
|
"table_scan": {
|
|
"rows": 40,
|
|
"cost": 0.25
|
|
}
|
|
}
|
|
]
|
|
},
|
|
{
|
|
"considered_execution_plans": [
|
|
{
|
|
"plan_prefix": [
|
|
],
|
|
"table": "`t`",
|
|
"best_access_path": {
|
|
"considered_access_paths": [
|
|
{
|
|
"rows_to_scan": 40,
|
|
"access_type": "scan",
|
|
"resulting_rows": 40,
|
|
"cost": 4.25,
|
|
"chosen": true,
|
|
"use_tmp_table": true
|
|
}
|
|
]
|
|
},
|
|
"condition_filtering_pct": 100,
|
|
"rows_for_plan": 40,
|
|
"cost_for_plan": 4.25,
|
|
"sort_cost": 40,
|
|
"new_cost_for_plan": 44.25,
|
|
"chosen": true,
|
|
"windowing_sort_cost": 80,
|
|
"new_cost_for_plan": 124.25
|
|
}
|
|
]
|
|
},
|
|
{
|
|
"attaching_conditions_to_tables": {
|
|
"original_condition": null,
|
|
"attached_conditions_computation": [
|
|
],
|
|
"attached_conditions_summary": [
|
|
{
|
|
"table": "`t`",
|
|
"attached": null
|
|
}
|
|
]
|
|
}
|
|
},
|
|
{
|
|
"optimizing_distinct_group_by_order_by": {
|
|
"simplifying_order_by": {
|
|
"original_clause": "`t`.`i`",
|
|
"items": [
|
|
{
|
|
"item": "`t`.`i`"
|
|
}
|
|
],
|
|
"resulting_clause_is_simple": true,
|
|
"resulting_clause": "`t`.`i`"
|
|
},
|
|
"simplifying_group_by": {
|
|
"original_clause": "`t`.`i`",
|
|
"items": [
|
|
{
|
|
"item": "`t`.`i`"
|
|
}
|
|
],
|
|
"resulting_clause_is_simple": false,
|
|
"resulting_clause": "`t`.`i`"
|
|
}
|
|
}
|
|
},
|
|
{
|
|
"finalizing_table_conditions": [
|
|
]
|
|
},
|
|
{
|
|
"refine_plan": [
|
|
{
|
|
"table": "`t`"
|
|
}
|
|
]
|
|
},
|
|
{
|
|
"considering_tmp_tables": [
|
|
{
|
|
"adding_tmp_table_in_plan_at_position": 1,
|
|
"write_method": "write_all_rows"
|
|
},
|
|
{
|
|
"adding_tmp_table_in_plan_at_position": 2,
|
|
"cause": "output_for_window_functions",
|
|
"with_buffer": false,
|
|
"write_method": "write_all_rows",
|
|
"adding_sort_to_previous_table": {
|
|
"filesort": {
|
|
"adding_sort_to_table_in_plan_at_position": 1
|
|
}
|
|
}
|
|
},
|
|
{
|
|
"creating_tmp_table": {
|
|
"tmp_table_info": {
|
|
"table": "intermediate_tmp_table",
|
|
"columns": 6,
|
|
"row_length": 29,
|
|
"key_length": 0,
|
|
"unique_constraint": false,
|
|
"makes_grouped_rows": false,
|
|
"cannot_insert_duplicates": false,
|
|
"location": "TempTable"
|
|
}
|
|
}
|
|
},
|
|
{
|
|
"adding_tmp_table_in_plan_at_position": 3,
|
|
"cause": "output_for_window_functions",
|
|
"with_buffer": true,
|
|
"write_method": "write_all_rows",
|
|
"adding_sort_to_previous_table": {
|
|
"filesort": {
|
|
"adding_sort_to_table_in_plan_at_position": 2
|
|
}
|
|
},
|
|
"filesort": {
|
|
"adding_sort_to_table_in_plan_at_position": 3
|
|
}
|
|
}
|
|
]
|
|
}
|
|
]
|
|
}
|
|
},
|
|
{
|
|
"join_execution": {
|
|
"select#": 1,
|
|
"steps": [
|
|
{
|
|
"creating_tmp_table": {
|
|
"tmp_table_info": {
|
|
"in_plan_at_position": 3,
|
|
"columns": 7,
|
|
"row_length": 45,
|
|
"key_length": 0,
|
|
"unique_constraint": false,
|
|
"makes_grouped_rows": false,
|
|
"cannot_insert_duplicates": false,
|
|
"location": "TempTable"
|
|
}
|
|
}
|
|
},
|
|
{
|
|
"materialize": {
|
|
"select#": 1,
|
|
"steps": [
|
|
{
|
|
"creating_tmp_table": {
|
|
"tmp_table_info": {
|
|
"in_plan_at_position": 2,
|
|
"columns": 6,
|
|
"row_length": 29,
|
|
"key_length": 0,
|
|
"unique_constraint": false,
|
|
"makes_grouped_rows": false,
|
|
"cannot_insert_duplicates": false,
|
|
"location": "TempTable"
|
|
}
|
|
}
|
|
},
|
|
{
|
|
"materialize": {
|
|
"select#": 1,
|
|
"steps": [
|
|
{
|
|
"creating_tmp_table": {
|
|
"tmp_table_info": {
|
|
"in_plan_at_position": 1,
|
|
"columns": 5,
|
|
"row_length": 22,
|
|
"key_length": 5,
|
|
"unique_constraint": false,
|
|
"makes_grouped_rows": true,
|
|
"cannot_insert_duplicates": false,
|
|
"location": "TempTable"
|
|
}
|
|
}
|
|
},
|
|
{
|
|
"materialize": {
|
|
"select#": 1,
|
|
"steps": [
|
|
]
|
|
}
|
|
},
|
|
{
|
|
"sorting_table_in_plan_at_position": 1,
|
|
"filesort_information": [
|
|
{
|
|
"direction": "asc",
|
|
"field": "i"
|
|
}
|
|
],
|
|
"filesort_priority_queue_optimization": {
|
|
"usable": false,
|
|
"cause": "not applicable (no LIMIT)"
|
|
},
|
|
"filesort_execution": [
|
|
],
|
|
"filesort_summary": {
|
|
"memory_available": 262144,
|
|
"key_size": "XXX",
|
|
"row_size": "XXX",
|
|
"max_rows_per_buffer": 34,
|
|
"num_rows_estimate": 34,
|
|
"num_rows_found": 24,
|
|
"num_initial_chunks_spilled_to_disk": 0,
|
|
"peak_memory_used": "NNN",
|
|
"sort_algorithm": "std::stable_sort",
|
|
"sort_mode": "<fixed_sort_key, packed_additional_fields>"
|
|
}
|
|
}
|
|
]
|
|
}
|
|
},
|
|
{
|
|
"sorting_table_in_plan_at_position": 2,
|
|
"filesort_information": [
|
|
{
|
|
"direction": "desc",
|
|
"field": "i"
|
|
}
|
|
],
|
|
"filesort_priority_queue_optimization": {
|
|
"usable": false,
|
|
"cause": "not applicable (no LIMIT)"
|
|
},
|
|
"filesort_execution": [
|
|
],
|
|
"filesort_summary": {
|
|
"memory_available": 262144,
|
|
"key_size": "XXX",
|
|
"row_size": "XXX",
|
|
"max_rows_per_buffer": 34,
|
|
"num_rows_estimate": 34,
|
|
"num_rows_found": 24,
|
|
"num_initial_chunks_spilled_to_disk": 0,
|
|
"peak_memory_used": "NNN",
|
|
"sort_algorithm": "std::stable_sort",
|
|
"sort_mode": "<fixed_sort_key, packed_additional_fields>"
|
|
}
|
|
}
|
|
]
|
|
}
|
|
},
|
|
{
|
|
"sorting_table_in_plan_at_position": 3,
|
|
"filesort_information": [
|
|
{
|
|
"direction": "asc",
|
|
"field": "i"
|
|
}
|
|
],
|
|
"filesort_priority_queue_optimization": {
|
|
"usable": false,
|
|
"cause": "not applicable (no LIMIT)"
|
|
},
|
|
"filesort_execution": [
|
|
],
|
|
"filesort_summary": {
|
|
"memory_available": 262144,
|
|
"key_size": "XXX",
|
|
"row_size": "XXX",
|
|
"max_rows_per_buffer": 34,
|
|
"num_rows_estimate": 34,
|
|
"num_rows_found": 24,
|
|
"num_initial_chunks_spilled_to_disk": 0,
|
|
"peak_memory_used": "NNN",
|
|
"sort_algorithm": "std::sort",
|
|
"sort_mode": "<fixed_sort_key, packed_additional_fields>"
|
|
}
|
|
}
|
|
]
|
|
}
|
|
}
|
|
]
|
|
} 0 0
|
|
SET optimizer_trace="enabled=off";
|
|
DROP TABLE t;
|