mirror of
https://github.com/MariaDB/server.git
synced 2025-07-29 05:21:33 +03:00
MDEV-7836: ANALYZE FORMAT=JSON should provide info about GROUP/ORDER BY
Fix EXPLAIN FORMAT=JSON to produce output that's not worse than the tabular form.
This commit is contained in:
@ -169,6 +169,7 @@ EXPLAIN
|
|||||||
{
|
{
|
||||||
"query_block": {
|
"query_block": {
|
||||||
"select_id": 1,
|
"select_id": 1,
|
||||||
|
"filesort": {
|
||||||
"temporary_table": {
|
"temporary_table": {
|
||||||
"function": "buffer",
|
"function": "buffer",
|
||||||
"table": {
|
"table": {
|
||||||
@ -192,6 +193,7 @@ EXPLAIN
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
}
|
||||||
analyze format=json
|
analyze format=json
|
||||||
select * from t0,t2 where t2.a=t0.a order by t2.b limit 4;
|
select * from t0,t2 where t2.a=t0.a order by t2.b limit 4;
|
||||||
ANALYZE
|
ANALYZE
|
||||||
@ -240,6 +242,36 @@ select * from t0,t2 where t2.a=t0.a order by t0.a limit 4;
|
|||||||
id select_type table type possible_keys key key_len ref rows Extra
|
id select_type table type possible_keys key key_len ref rows Extra
|
||||||
1 SIMPLE t0 ALL NULL NULL NULL NULL 10 Using where; Using filesort
|
1 SIMPLE t0 ALL NULL NULL NULL NULL 10 Using where; Using filesort
|
||||||
1 SIMPLE t2 ref a a 5 test.t0.a 1
|
1 SIMPLE t2 ref a a 5 test.t0.a 1
|
||||||
|
explain format=json
|
||||||
|
select * from t0,t2 where t2.a=t0.a order by t0.a limit 4;
|
||||||
|
EXPLAIN
|
||||||
|
{
|
||||||
|
"query_block": {
|
||||||
|
"select_id": 1,
|
||||||
|
"read_sorted_file": {
|
||||||
|
"filesort": {
|
||||||
|
"table": {
|
||||||
|
"table_name": "t0",
|
||||||
|
"access_type": "ALL",
|
||||||
|
"rows": 10,
|
||||||
|
"filtered": 100,
|
||||||
|
"attached_condition": "(t0.a is not null)"
|
||||||
|
}
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"table": {
|
||||||
|
"table_name": "t2",
|
||||||
|
"access_type": "ref",
|
||||||
|
"possible_keys": ["a"],
|
||||||
|
"key": "a",
|
||||||
|
"key_length": "5",
|
||||||
|
"used_key_parts": ["a"],
|
||||||
|
"ref": ["test.t0.a"],
|
||||||
|
"rows": 1,
|
||||||
|
"filtered": 100
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
analyze format=json
|
analyze format=json
|
||||||
select * from t0,t2 where t2.a=t0.a order by t0.a limit 4;
|
select * from t0,t2 where t2.a=t0.a order by t0.a limit 4;
|
||||||
ANALYZE
|
ANALYZE
|
||||||
|
@ -479,6 +479,7 @@ EXPLAIN
|
|||||||
"materialized": {
|
"materialized": {
|
||||||
"query_block": {
|
"query_block": {
|
||||||
"select_id": 2,
|
"select_id": 2,
|
||||||
|
"filesort": {
|
||||||
"temporary_table": {
|
"temporary_table": {
|
||||||
"function": "buffer",
|
"function": "buffer",
|
||||||
"table": {
|
"table": {
|
||||||
@ -493,6 +494,7 @@ EXPLAIN
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
}
|
||||||
explain format=json
|
explain format=json
|
||||||
select * from (select a, count(*) as cnt from t1 group by a) as tbl1, t1 as
|
select * from (select a, count(*) as cnt from t1 group by a) as tbl1, t1 as
|
||||||
tbl2 where cnt=tbl2.a;
|
tbl2 where cnt=tbl2.a;
|
||||||
@ -521,6 +523,7 @@ EXPLAIN
|
|||||||
"materialized": {
|
"materialized": {
|
||||||
"query_block": {
|
"query_block": {
|
||||||
"select_id": 2,
|
"select_id": 2,
|
||||||
|
"filesort": {
|
||||||
"temporary_table": {
|
"temporary_table": {
|
||||||
"function": "buffer",
|
"function": "buffer",
|
||||||
"table": {
|
"table": {
|
||||||
@ -535,6 +538,7 @@ EXPLAIN
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
}
|
||||||
#
|
#
|
||||||
# Non-merged semi-join (aka JTBM)
|
# Non-merged semi-join (aka JTBM)
|
||||||
#
|
#
|
||||||
|
@ -48,25 +48,28 @@ ANALYZE
|
|||||||
{
|
{
|
||||||
"query_block": {
|
"query_block": {
|
||||||
"select_id": 1,
|
"select_id": 1,
|
||||||
|
"r_total_time_ms": "REPLACED",
|
||||||
|
"buffer": {
|
||||||
"table": {
|
"table": {
|
||||||
"update": 1,
|
"update": 1,
|
||||||
"table_name": "t1",
|
"table_name": "t1",
|
||||||
"partitions": ["p0"],
|
"partitions": ["p0"],
|
||||||
"access_type": "ALL",
|
"access_type": "ALL",
|
||||||
"rows": 10,
|
"rows": 10,
|
||||||
"r_rows": 3,
|
"r_rows": 10,
|
||||||
"r_filtered": 100,
|
"r_filtered": 30,
|
||||||
"using_io_buffer": 1,
|
|
||||||
"r_total_time_ms": "REPLACED",
|
"r_total_time_ms": "REPLACED",
|
||||||
"attached_condition": "(t1.a in (2,3,4))"
|
"attached_condition": "(t1.a in (2,3,4))"
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
}
|
||||||
analyze format=json delete from t1 where a in (20,30,40);
|
analyze format=json delete from t1 where a in (20,30,40);
|
||||||
ANALYZE
|
ANALYZE
|
||||||
{
|
{
|
||||||
"query_block": {
|
"query_block": {
|
||||||
"select_id": 1,
|
"select_id": 1,
|
||||||
|
"r_total_time_ms": "REPLACED",
|
||||||
"table": {
|
"table": {
|
||||||
"delete": 1,
|
"delete": 1,
|
||||||
"table_name": "t1",
|
"table_name": "t1",
|
||||||
|
@ -63,8 +63,8 @@ select * from t0,t2 where t2.a=t0.a order by t2.b limit 4;
|
|||||||
--echo #
|
--echo #
|
||||||
explain
|
explain
|
||||||
select * from t0,t2 where t2.a=t0.a order by t0.a limit 4;
|
select * from t0,t2 where t2.a=t0.a order by t0.a limit 4;
|
||||||
## explain format=json
|
explain format=json
|
||||||
## select * from t0,t2 where t2.a=t0.a order by t0.a limit 4;
|
select * from t0,t2 where t2.a=t0.a order by t0.a limit 4;
|
||||||
--replace_regex /"r_total_time_ms": [0-9]*[.]?[0-9]*/"r_total_time_ms": "REPLACED"/
|
--replace_regex /"r_total_time_ms": [0-9]*[.]?[0-9]*/"r_total_time_ms": "REPLACED"/
|
||||||
analyze format=json
|
analyze format=json
|
||||||
select * from t0,t2 where t2.a=t0.a order by t0.a limit 4;
|
select * from t0,t2 where t2.a=t0.a order by t0.a limit 4;
|
||||||
|
@ -818,9 +818,19 @@ void Explain_select::print_explain_json(Explain_query *query,
|
|||||||
if (using_temporary)
|
if (using_temporary)
|
||||||
{
|
{
|
||||||
started_objects= 1;
|
started_objects= 1;
|
||||||
|
if (using_filesort)
|
||||||
|
{
|
||||||
|
started_objects++;
|
||||||
|
writer->add_member("filesort").start_object();
|
||||||
|
}
|
||||||
writer->add_member("temporary_table").start_object();
|
writer->add_member("temporary_table").start_object();
|
||||||
writer->add_member("function").add_str("buffer");
|
writer->add_member("function").add_str("buffer");
|
||||||
}
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
if (using_filesort)
|
||||||
|
first_table_sort= &ops_tracker.filesort_tracker[0];
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
Explain_basic_join::print_explain_json_interns(query, writer, is_analyze,
|
Explain_basic_join::print_explain_json_interns(query, writer, is_analyze,
|
||||||
@ -1293,7 +1303,12 @@ void add_json_keyset(Json_writer *writer, const char *elem_name,
|
|||||||
|
|
||||||
/*
|
/*
|
||||||
@param fs_tracker Normally NULL. When not NULL, it means that the join tab
|
@param fs_tracker Normally NULL. When not NULL, it means that the join tab
|
||||||
used filesort.
|
used filesort to pre-sort the data. Then, sorted data
|
||||||
|
was read and the rest of the join was executed.
|
||||||
|
|
||||||
|
@note
|
||||||
|
EXPLAIN command will check whether fs_tracker is present, but it can't use
|
||||||
|
any value from fs_tracker (these are only valid for ANALYZE).
|
||||||
*/
|
*/
|
||||||
|
|
||||||
void Explain_table_access::print_explain_json(Explain_query *query,
|
void Explain_table_access::print_explain_json(Explain_query *query,
|
||||||
@ -1330,6 +1345,7 @@ void Explain_table_access::print_explain_json(Explain_query *query,
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
writer->add_member("filesort").start_object();
|
writer->add_member("filesort").start_object();
|
||||||
|
if (is_analyze)
|
||||||
fs_tracker->print_json(writer);
|
fs_tracker->print_json(writer);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
Reference in New Issue
Block a user