Commit 0269d82d authored by Sergei Petrunia's avatar Sergei Petrunia

ANALYZE FORMAT=JSON: Backport block-nl-join.r_unpack_time_ms from 11.0 +fix MDEV-30830.

Also fix it to work with hashed join (MDEV-30830).

Reviewed by: Monty <monty@mariadb.org>
parent 18342cd5
# The time on ANALYSE FORMAT=JSON is rather variable # The time on ANALYSE FORMAT=JSON is rather variable
--replace_regex /("(r_total_time_ms|r_table_time_ms|r_other_time_ms|r_buffer_size|r_filling_time_ms)": )[^, \n]*/\1"REPLACED"/ --replace_regex /("(r_[a-z_]*_time_ms|r_buffer_size)": )[^, \n]*/\1"REPLACED"/
...@@ -153,6 +153,7 @@ ANALYZE ...@@ -153,6 +153,7 @@ ANALYZE
"join_type": "BNL", "join_type": "BNL",
"r_loops": 20, "r_loops": 20,
"r_filtered": 100, "r_filtered": 100,
"r_unpack_time_ms": "REPLACED",
"r_effective_rows": 60 "r_effective_rows": 60
} }
} }
...@@ -196,6 +197,7 @@ ANALYZE ...@@ -196,6 +197,7 @@ ANALYZE
"attached_condition": "tbl1.c > tbl2.c", "attached_condition": "tbl1.c > tbl2.c",
"r_loops": 20, "r_loops": 20,
"r_filtered": 15.83333333, "r_filtered": 15.83333333,
"r_unpack_time_ms": "REPLACED",
"r_effective_rows": 60 "r_effective_rows": 60
} }
} }
...@@ -658,6 +660,7 @@ ANALYZE ...@@ -658,6 +660,7 @@ ANALYZE
"attached_condition": "<in_optimizer>(t2.b,t2.b in (subquery#2))", "attached_condition": "<in_optimizer>(t2.b,t2.b in (subquery#2))",
"r_loops": 2, "r_loops": 2,
"r_filtered": null, "r_filtered": null,
"r_unpack_time_ms": "REPLACED",
"r_effective_rows": 0 "r_effective_rows": 0
}, },
"subqueries": [ "subqueries": [
...@@ -750,6 +753,7 @@ ANALYZE ...@@ -750,6 +753,7 @@ ANALYZE
"join_type": "BNL", "join_type": "BNL",
"r_loops": 2, "r_loops": 2,
"r_filtered": null, "r_filtered": null,
"r_unpack_time_ms": "REPLACED",
"r_effective_rows": 0 "r_effective_rows": 0
}, },
"subqueries": [ "subqueries": [
...@@ -784,6 +788,7 @@ ANALYZE ...@@ -784,6 +788,7 @@ ANALYZE
"attached_condition": "t2.f2 = t3.f3", "attached_condition": "t2.f2 = t3.f3",
"r_loops": 0, "r_loops": 0,
"r_filtered": null, "r_filtered": null,
"r_unpack_time_ms": "REPLACED",
"r_effective_rows": null "r_effective_rows": null
} }
} }
...@@ -921,6 +926,7 @@ ANALYZE ...@@ -921,6 +926,7 @@ ANALYZE
"attached_condition": "t10.b = t11.b", "attached_condition": "t10.b = t11.b",
"r_loops": 100, "r_loops": 100,
"r_filtered": 0.424285714, "r_filtered": 0.424285714,
"r_unpack_time_ms": "REPLACED",
"r_effective_rows": 700 "r_effective_rows": 700
} }
} }
...@@ -973,6 +979,7 @@ ANALYZE ...@@ -973,6 +979,7 @@ ANALYZE
"attached_condition": "t10.b = t11.b", "attached_condition": "t10.b = t11.b",
"r_loops": 100, "r_loops": 100,
"r_filtered": 100, "r_filtered": 100,
"r_unpack_time_ms": "REPLACED",
"r_effective_rows": 2.97 "r_effective_rows": 2.97
} }
} }
......
#
# MDEV-30830: ANALYZE FORMAT=JSON: r_unpack_time_ms is empty for the hashed joins
#
#
# First, check a regular BNL-join
#
create table t1 (
a int,
b int
);
insert into t1 select seq, seq/3 from seq_0_to_99;
create table t2 (
a int,
b int
);
insert into t2 select seq, seq/5 from seq_0_to_99;
set @js='$out';
set @out=(select json_extract(@js,'$**.block-nl-join.r_unpack_time_ms'));
select cast(json_extract(@out,'$[0]') as DOUBLE) > 0;
cast(json_extract(@out,'$[0]') as DOUBLE) > 0
1
drop table t1,t2;
#
# Now, check the hashed, BNL-H join
#
create table t1 (
a int,
b int
);
insert into t1 select seq, seq/3 from seq_0_to_499;
create table t2 (
a int,
b int
);
insert into t2 select seq, seq/5 from seq_0_to_499;
set @tmp=@@join_cache_level, join_cache_level=6;
select '$out' as X;
X
{
"query_block": {
"select_id": 1,
"r_loops": 1,
"r_total_time_ms": "REPLACED",
"table": {
"table_name": "t1",
"access_type": "ALL",
"r_loops": 1,
"rows": 500,
"r_rows": 500,
"r_table_time_ms": "REPLACED",
"r_other_time_ms": "REPLACED",
"filtered": 100,
"r_filtered": 100,
"attached_condition": "t1.a < 700 and t1.b is not null"
},
"block-nl-join": {
"table": {
"table_name": "t2",
"access_type": "hash_ALL",
"key": "#hash#$hj",
"key_length": "5",
"used_key_parts": ["b"],
"ref": ["test.t1.b"],
"r_loops": 1,
"rows": 500,
"r_rows": 500,
"r_table_time_ms": "REPLACED",
"r_other_time_ms": "REPLACED",
"filtered": 100,
"r_filtered": 20,
"attached_condition": "t2.a < 100"
},
"buffer_type": "flat",
"buffer_size": "18Kb",
"join_type": "BNLH",
"attached_condition": "t2.b = t1.b",
"r_loops": 500,
"r_filtered": 100,
"r_unpack_time_ms": "REPLACED",
"r_effective_rows": 0.594
}
}
}
set @out=(select json_extract(@js,'$**.block-nl-join.r_unpack_time_ms'));
select cast(json_extract(@out,'$[0]') as DOUBLE) > 0;
cast(json_extract(@out,'$[0]') as DOUBLE) > 0
1
set join_cache_level=@tmp;
drop table t1, t2;
#
# Tests to check that r_something_time_ms is non-zero in
# ANALYZE FORMAT=JSON <statement>
#
--source include/default_optimizer_switch.inc
--source include/have_sequence.inc
# The tests here are large so that we get non-zero timings
--source include/big_test.inc
--echo #
--echo # MDEV-30830: ANALYZE FORMAT=JSON: r_unpack_time_ms is empty for the hashed joins
--echo #
--echo #
--echo # First, check a regular BNL-join
--echo #
create table t1 (
a int,
b int
);
insert into t1 select seq, seq/3 from seq_0_to_99;
create table t2 (
a int,
b int
);
insert into t2 select seq, seq/5 from seq_0_to_99;
let $out=`
analyze format=json
select * from t1, t2
where
t1.a < 700 and
t2.a < 100
and t1.b=t2.b
`;
evalp set @js='$out';
set @out=(select json_extract(@js,'$**.block-nl-join.r_unpack_time_ms'));
select cast(json_extract(@out,'$[0]') as DOUBLE) > 0;
drop table t1,t2;
--echo #
--echo # Now, check the hashed, BNL-H join
--echo #
create table t1 (
a int,
b int
);
insert into t1 select seq, seq/3 from seq_0_to_499;
create table t2 (
a int,
b int
);
insert into t2 select seq, seq/5 from seq_0_to_499;
set @tmp=@@join_cache_level, join_cache_level=6;
let $out=`
analyze format=json
select * from t1, t2
where
t1.a < 700 and
t2.a < 100
and t1.b=t2.b
`;
--source include/analyze-format.inc
evalp select '$out' as X;
set @out=(select json_extract(@js,'$**.block-nl-join.r_unpack_time_ms'));
select cast(json_extract(@out,'$[0]') as DOUBLE) > 0;
set join_cache_level=@tmp;
drop table t1, t2;
...@@ -443,6 +443,7 @@ ANALYZE ...@@ -443,6 +443,7 @@ ANALYZE
"attached_condition": "t3.a = t0.a", "attached_condition": "t3.a = t0.a",
"r_loops": 10, "r_loops": 10,
"r_filtered": 10, "r_filtered": 10,
"r_unpack_time_ms": "REPLACED",
"r_effective_rows": 10 "r_effective_rows": 10
} }
} }
...@@ -520,6 +521,7 @@ ANALYZE ...@@ -520,6 +521,7 @@ ANALYZE
"attached_condition": "t5.a = t6.a", "attached_condition": "t5.a = t6.a",
"r_loops": 4, "r_loops": 4,
"r_filtered": 21.42857143, "r_filtered": 21.42857143,
"r_unpack_time_ms": "REPLACED",
"r_effective_rows": 7 "r_effective_rows": 7
} }
} }
......
...@@ -336,6 +336,7 @@ ANALYZE ...@@ -336,6 +336,7 @@ ANALYZE
"join_type": "BNL", "join_type": "BNL",
"r_loops": 2, "r_loops": 2,
"r_filtered": 100, "r_filtered": 100,
"r_unpack_time_ms": "REPLACED",
"r_effective_rows": 2 "r_effective_rows": 2
} }
} }
...@@ -374,6 +375,7 @@ ANALYZE ...@@ -374,6 +375,7 @@ ANALYZE
"join_type": "BNL", "join_type": "BNL",
"r_loops": 2, "r_loops": 2,
"r_filtered": 100, "r_filtered": 100,
"r_unpack_time_ms": "REPLACED",
"r_effective_rows": 2 "r_effective_rows": 2
} }
} }
...@@ -441,6 +443,7 @@ ANALYZE ...@@ -441,6 +443,7 @@ ANALYZE
"join_type": "BNL", "join_type": "BNL",
"r_loops": 2, "r_loops": 2,
"r_filtered": 100, "r_filtered": 100,
"r_unpack_time_ms": "REPLACED",
"r_effective_rows": 2 "r_effective_rows": 2
} }
} }
...@@ -479,6 +482,7 @@ ANALYZE ...@@ -479,6 +482,7 @@ ANALYZE
"join_type": "BNL", "join_type": "BNL",
"r_loops": 2, "r_loops": 2,
"r_filtered": 100, "r_filtered": 100,
"r_unpack_time_ms": "REPLACED",
"r_effective_rows": 2 "r_effective_rows": 2
} }
} }
......
...@@ -455,6 +455,7 @@ ANALYZE ...@@ -455,6 +455,7 @@ ANALYZE
"join_type": "BNL", "join_type": "BNL",
"r_loops": 3, "r_loops": 3,
"r_filtered": 100, "r_filtered": 100,
"r_unpack_time_ms": "REPLACED",
"r_effective_rows": 3 "r_effective_rows": 3
} }
} }
...@@ -493,6 +494,7 @@ ANALYZE ...@@ -493,6 +494,7 @@ ANALYZE
"join_type": "BNL", "join_type": "BNL",
"r_loops": 2, "r_loops": 2,
"r_filtered": 100, "r_filtered": 100,
"r_unpack_time_ms": "REPLACED",
"r_effective_rows": 3 "r_effective_rows": 3
} }
} }
...@@ -559,6 +561,7 @@ ANALYZE ...@@ -559,6 +561,7 @@ ANALYZE
"join_type": "BNL", "join_type": "BNL",
"r_loops": 3, "r_loops": 3,
"r_filtered": 100, "r_filtered": 100,
"r_unpack_time_ms": "REPLACED",
"r_effective_rows": 3 "r_effective_rows": 3
} }
} }
...@@ -597,6 +600,7 @@ ANALYZE ...@@ -597,6 +600,7 @@ ANALYZE
"join_type": "BNL", "join_type": "BNL",
"r_loops": 2, "r_loops": 2,
"r_filtered": 100, "r_filtered": 100,
"r_unpack_time_ms": "REPLACED",
"r_effective_rows": 3 "r_effective_rows": 3
} }
} }
......
...@@ -1546,6 +1546,7 @@ ANALYZE ...@@ -1546,6 +1546,7 @@ ANALYZE
"mrr_type": "Rowid-ordered scan", "mrr_type": "Rowid-ordered scan",
"r_loops": 10, "r_loops": 10,
"r_filtered": 100, "r_filtered": 100,
"r_unpack_time_ms": "REPLACED",
"r_effective_rows": 1 "r_effective_rows": 1
} }
} }
......
...@@ -397,6 +397,7 @@ ANALYZE ...@@ -397,6 +397,7 @@ ANALYZE
"join_type": "BNL", "join_type": "BNL",
"r_loops": 3, "r_loops": 3,
"r_filtered": 100, "r_filtered": 100,
"r_unpack_time_ms": "REPLACED",
"r_effective_rows": 3 "r_effective_rows": 3
} }
} }
...@@ -482,6 +483,7 @@ ANALYZE ...@@ -482,6 +483,7 @@ ANALYZE
"join_type": "BNL", "join_type": "BNL",
"r_loops": 3, "r_loops": 3,
"r_filtered": 100, "r_filtered": 100,
"r_unpack_time_ms": "REPLACED",
"r_effective_rows": 3 "r_effective_rows": 3
} }
} }
......
...@@ -428,6 +428,7 @@ ANALYZE ...@@ -428,6 +428,7 @@ ANALYZE
"join_type": "BNL", "join_type": "BNL",
"r_loops": 5, "r_loops": 5,
"r_filtered": 100, "r_filtered": 100,
"r_unpack_time_ms": "REPLACED",
"r_effective_rows": 7 "r_effective_rows": 7
} }
} }
...@@ -513,6 +514,7 @@ ANALYZE ...@@ -513,6 +514,7 @@ ANALYZE
"join_type": "BNL", "join_type": "BNL",
"r_loops": 5, "r_loops": 5,
"r_filtered": 100, "r_filtered": 100,
"r_unpack_time_ms": "REPLACED",
"r_effective_rows": 7 "r_effective_rows": 7
} }
} }
......
...@@ -3687,6 +3687,7 @@ ANALYZE ...@@ -3687,6 +3687,7 @@ ANALYZE
"attached_condition": "a.atp = 1", "attached_condition": "a.atp = 1",
"r_loops": 3, "r_loops": 3,
"r_filtered": 100, "r_filtered": 100,
"r_unpack_time_ms": "REPLACED",
"r_effective_rows": 1 "r_effective_rows": 1
}, },
"block-nl-join": { "block-nl-join": {
...@@ -3713,6 +3714,7 @@ ANALYZE ...@@ -3713,6 +3714,7 @@ ANALYZE
"attached_condition": "fi.fh in (6311439873746261694,-397087483897438286,8518228073041491534,-5420422472375069774)", "attached_condition": "fi.fh in (6311439873746261694,-397087483897438286,8518228073041491534,-5420422472375069774)",
"r_loops": 3, "r_loops": 3,
"r_filtered": 40, "r_filtered": 40,
"r_unpack_time_ms": "REPLACED",
"r_effective_rows": 26.66666667 "r_effective_rows": 26.66666667
} }
} }
......
...@@ -1898,6 +1898,9 @@ void Explain_table_access::print_explain_json(Explain_query *query, ...@@ -1898,6 +1898,9 @@ void Explain_table_access::print_explain_json(Explain_query *query,
writer->add_double(jbuf_tracker.get_filtered_after_where()*100.0); writer->add_double(jbuf_tracker.get_filtered_after_where()*100.0);
else else
writer->add_null(); writer->add_null();
writer->add_member("r_unpack_time_ms");
writer->add_double(jbuf_unpack_tracker.get_time_ms());
/* /*
effective_rows is average number of matches we got for an incoming effective_rows is average number of matches we got for an incoming
row. The row is stored in the join buffer and then is read row. The row is stored in the join buffer and then is read
......
...@@ -722,7 +722,7 @@ class Explain_range_checked_fer : public Sql_alloc ...@@ -722,7 +722,7 @@ class Explain_range_checked_fer : public Sql_alloc
class Explain_table_access : public Sql_alloc class Explain_table_access : public Sql_alloc
{ {
public: public:
Explain_table_access(MEM_ROOT *root) : Explain_table_access(MEM_ROOT *root, bool timed) :
derived_select_number(0), derived_select_number(0),
non_merged_sjm_number(0), non_merged_sjm_number(0),
extra_tags(root), extra_tags(root),
...@@ -735,6 +735,7 @@ class Explain_table_access : public Sql_alloc ...@@ -735,6 +735,7 @@ class Explain_table_access : public Sql_alloc
pushed_index_cond(NULL), pushed_index_cond(NULL),
sjm_nest(NULL), sjm_nest(NULL),
pre_join_sort(NULL), pre_join_sort(NULL),
jbuf_unpack_tracker(timed),
rowid_filter(NULL) rowid_filter(NULL)
{} {}
~Explain_table_access() { delete sjm_nest; } ~Explain_table_access() { delete sjm_nest; }
...@@ -844,7 +845,12 @@ class Explain_table_access : public Sql_alloc ...@@ -844,7 +845,12 @@ class Explain_table_access : public Sql_alloc
/* When using join buffer: Track the reads from join buffer */ /* When using join buffer: Track the reads from join buffer */
Table_access_tracker jbuf_tracker; Table_access_tracker jbuf_tracker;
/*
Track the time to unpack rows from the join buffer.
*/
Time_and_counter_tracker jbuf_unpack_tracker;
/* When using join buffer: Track the number of incoming record combinations */ /* When using join buffer: Track the number of incoming record combinations */
Counter_tracker jbuf_loops_tracker; Counter_tracker jbuf_loops_tracker;
......
...@@ -1614,7 +1614,7 @@ bool JOIN_CACHE::get_record() ...@@ -1614,7 +1614,7 @@ bool JOIN_CACHE::get_record()
pos+= referenced_fields*size_of_fld_ofs; pos+= referenced_fields*size_of_fld_ofs;
if (prev_cache) if (prev_cache)
prev_cache->get_record_by_pos(prev_rec_ptr); prev_cache->get_record_by_pos(prev_rec_ptr);
} }
return res; return res;
} }
...@@ -2389,7 +2389,9 @@ enum_nested_loop_state JOIN_CACHE::join_matching_records(bool skip_last) ...@@ -2389,7 +2389,9 @@ enum_nested_loop_state JOIN_CACHE::join_matching_records(bool skip_last)
(join_tab->first_inner && !not_exists_opt_is_applicable) || (join_tab->first_inner && !not_exists_opt_is_applicable) ||
!skip_next_candidate_for_match(rec_ptr)) !skip_next_candidate_for_match(rec_ptr))
{ {
read_next_candidate_for_match(rec_ptr); ANALYZE_START_TRACKING(join->thd, join_tab->jbuf_unpack_tracker);
read_next_candidate_for_match(rec_ptr);
ANALYZE_STOP_TRACKING(join->thd, join_tab->jbuf_unpack_tracker);
rc= generate_full_extensions(rec_ptr); rc= generate_full_extensions(rec_ptr);
if (rc != NESTED_LOOP_OK && rc != NESTED_LOOP_NO_MORE_ROWS) if (rc != NESTED_LOOP_OK && rc != NESTED_LOOP_NO_MORE_ROWS)
goto finish; goto finish;
......
...@@ -27396,6 +27396,7 @@ bool JOIN_TAB::save_explain_data(Explain_table_access *eta, ...@@ -27396,6 +27396,7 @@ bool JOIN_TAB::save_explain_data(Explain_table_access *eta,
tracker= &eta->tracker; tracker= &eta->tracker;
jbuf_tracker= &eta->jbuf_tracker; jbuf_tracker= &eta->jbuf_tracker;
jbuf_loops_tracker= &eta->jbuf_loops_tracker; jbuf_loops_tracker= &eta->jbuf_loops_tracker;
jbuf_unpack_tracker= &eta->jbuf_unpack_tracker;
/* Enable the table access time tracker only for "ANALYZE stmt" */ /* Enable the table access time tracker only for "ANALYZE stmt" */
if (thd->lex->analyze_stmt) if (thd->lex->analyze_stmt)
...@@ -28029,7 +28030,8 @@ int JOIN::save_explain_data_intern(Explain_query *output, ...@@ -28029,7 +28030,8 @@ int JOIN::save_explain_data_intern(Explain_query *output,
Explain_table_access *eta= (new (output->mem_root) Explain_table_access *eta= (new (output->mem_root)
Explain_table_access(output->mem_root)); Explain_table_access(output->mem_root,
thd->lex->analyze_stmt));
if (!eta) if (!eta)
DBUG_RETURN(1); DBUG_RETURN(1);
......
...@@ -309,6 +309,7 @@ typedef struct st_join_table { ...@@ -309,6 +309,7 @@ typedef struct st_join_table {
Table_access_tracker *tracker; Table_access_tracker *tracker;
Table_access_tracker *jbuf_tracker; Table_access_tracker *jbuf_tracker;
Time_and_counter_tracker *jbuf_unpack_tracker;
Counter_tracker *jbuf_loops_tracker; Counter_tracker *jbuf_loops_tracker;
/* /*
Bitmap of TAB_INFO_* bits that encodes special line for EXPLAIN 'Extra' Bitmap of TAB_INFO_* bits that encodes special line for EXPLAIN 'Extra'
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment