Commit b2a11873 authored by Oleksandr Byelkin's avatar Oleksandr Byelkin

MDEV-7812: ANALYZE FORMAT=JSON UPDATE/DELETE doesnt print the r_total_time_ms

Tracking total time added in UPDATE/DELETE
Fixed selectivity calculation in UPDATE/DELETE
Macro definitions of time tracting fixed.
parent 9b8f86f8
...@@ -264,3 +264,80 @@ ANALYZE ...@@ -264,3 +264,80 @@ ANALYZE
} }
} }
drop table t1; drop table t1;
#
# MDEV-7812: ANALYZE FORMAT=JSON UPDATE/DELETE doesnt print
# the r_total_time_ms
#
create table t2(a int);
insert into t2 values (0),(1),(2),(3),(4),(5),(6),(7),(8),(9);
create table t3(a int);
insert into t3 select A.a + B.a* 10 + C.a * 100 from t2 A, t2 B, t2 C;
create table t1 (pk int primary key);
insert into t1 select a from t3;
alter table t1 add b int;
analyze format=json
update t1 set b=pk;
ANALYZE
{
"query_block": {
"select_id": 1,
"table": {
"update": 1,
"table_name": "t1",
"access_type": "ALL",
"rows": 1000,
"r_rows": 1000,
"r_filtered": 100,
"r_total_time_ms": "REPLACED"
}
}
}
analyze format=json
select * from t1 where pk < 10 and b > 4;
ANALYZE
{
"query_block": {
"select_id": 1,
"r_loops": 1,
"r_total_time_ms": "REPLACED",
"table": {
"table_name": "t1",
"access_type": "range",
"possible_keys": ["PRIMARY"],
"key": "PRIMARY",
"key_length": "4",
"used_key_parts": ["pk"],
"r_loops": 1,
"rows": 11,
"r_rows": 10,
"r_total_time_ms": "REPLACED",
"filtered": 100,
"r_filtered": 50,
"index_condition": "(t1.pk < 10)",
"attached_condition": "(t1.b > 4)"
}
}
}
analyze format=json
delete from t1 where pk < 10 and b > 4;
ANALYZE
{
"query_block": {
"select_id": 1,
"table": {
"delete": 1,
"table_name": "t1",
"access_type": "range",
"possible_keys": ["PRIMARY"],
"key": "PRIMARY",
"key_length": "4",
"used_key_parts": ["pk"],
"rows": 11,
"r_rows": 10,
"r_filtered": 50,
"r_total_time_ms": "REPLACED",
"attached_condition": "((t1.pk < 10) and (t1.b > 4))"
}
}
}
drop table t1, t3, t2;
...@@ -75,3 +75,32 @@ disconnect con1; ...@@ -75,3 +75,32 @@ disconnect con1;
connection default; connection default;
drop table t1; drop table t1;
--echo #
--echo # MDEV-7812: ANALYZE FORMAT=JSON UPDATE/DELETE doesnt print
--echo # the r_total_time_ms
--echo #
create table t2(a int);
insert into t2 values (0),(1),(2),(3),(4),(5),(6),(7),(8),(9);
create table t3(a int);
insert into t3 select A.a + B.a* 10 + C.a * 100 from t2 A, t2 B, t2 C;
create table t1 (pk int primary key);
insert into t1 select a from t3;
alter table t1 add b int;
--replace_regex /"r_total_time_ms": [0-9]*[.]?[0-9]*/"r_total_time_ms": "REPLACED"/
analyze format=json
update t1 set b=pk;
--replace_regex /"r_total_time_ms": [0-9]*[.]?[0-9]*/"r_total_time_ms": "REPLACED"/
analyze format=json
select * from t1 where pk < 10 and b > 4;
--replace_regex /"r_total_time_ms": [0-9]*[.]?[0-9]*/"r_total_time_ms": "REPLACED"/
analyze format=json
delete from t1 where pk < 10 and b > 4;
drop table t1, t3, t2;
...@@ -542,6 +542,7 @@ bool mysql_delete(THD *thd, TABLE_LIST *table_list, COND *conds, ...@@ -542,6 +542,7 @@ bool mysql_delete(THD *thd, TABLE_LIST *table_list, COND *conds,
explain= (Explain_delete*)thd->lex->explain->get_upd_del_plan(); explain= (Explain_delete*)thd->lex->explain->get_upd_del_plan();
explain->tracker.on_scan_init(); explain->tracker.on_scan_init();
ANALYZE_START_TRACKING(&explain->time_tracker);
while (!(error=info.read_record(&info)) && !thd->killed && while (!(error=info.read_record(&info)) && !thd->killed &&
! thd->is_error()) ! thd->is_error())
...@@ -619,6 +620,7 @@ bool mysql_delete(THD *thd, TABLE_LIST *table_list, COND *conds, ...@@ -619,6 +620,7 @@ bool mysql_delete(THD *thd, TABLE_LIST *table_list, COND *conds,
end_read_record(&info); end_read_record(&info);
if (options & OPTION_QUICK) if (options & OPTION_QUICK)
(void) table->file->extra(HA_EXTRA_NORMAL); (void) table->file->extra(HA_EXTRA_NORMAL);
ANALYZE_STOP_TRACKING(&explain->time_tracker);
cleanup: cleanup:
/* /*
......
...@@ -1892,7 +1892,7 @@ void Explain_update::print_explain_json(Explain_query *query, ...@@ -1892,7 +1892,7 @@ void Explain_update::print_explain_json(Explain_query *query,
/* `r_filtered` */ /* `r_filtered` */
if (is_analyze) if (is_analyze)
{ {
double r_filtered= tracker.get_filtered_after_where(); double r_filtered= tracker.get_filtered_after_where() * 100.0;
writer->add_member("r_filtered").add_double(r_filtered); writer->add_member("r_filtered").add_double(r_filtered);
} }
...@@ -1905,6 +1905,10 @@ void Explain_update::print_explain_json(Explain_query *query, ...@@ -1905,6 +1905,10 @@ void Explain_update::print_explain_json(Explain_query *query,
if (using_io_buffer) if (using_io_buffer)
writer->add_member("using_io_buffer").add_ll(1); writer->add_member("using_io_buffer").add_ll(1);
if (is_analyze && time_tracker.get_loops())
writer->
add_member("r_total_time_ms").add_double(time_tracker.get_time_ms());
if (where_cond) if (where_cond)
{ {
writer->add_member("attached_condition"); writer->add_member("attached_condition");
......
...@@ -131,11 +131,11 @@ public: ...@@ -131,11 +131,11 @@ public:
#define ANALYZE_START_TRACKING(tracker) \ #define ANALYZE_START_TRACKING(tracker) \
if (tracker) \ if (tracker) \
{ tracker->start_tracking(); } { (tracker)->start_tracking(); }
#define ANALYZE_STOP_TRACKING(tracker) \ #define ANALYZE_STOP_TRACKING(tracker) \
if (tracker) \ if (tracker) \
{ tracker->stop_tracking(); } { (tracker)->stop_tracking(); }
/************************************************************************************** /**************************************************************************************
...@@ -809,6 +809,7 @@ public: ...@@ -809,6 +809,7 @@ public:
/* ANALYZE members and methods */ /* ANALYZE members and methods */
Table_access_tracker tracker; Table_access_tracker tracker;
Exec_time_tracker time_tracker;
//psergey-todo: io-tracker here. //psergey-todo: io-tracker here.
virtual int print_explain(Explain_query *query, select_result_sink *output, virtual int print_explain(Explain_query *query, select_result_sink *output,
......
...@@ -731,6 +731,7 @@ int mysql_update(THD *thd, ...@@ -731,6 +731,7 @@ int mysql_update(THD *thd,
*/ */
can_compare_record= records_are_comparable(table); can_compare_record= records_are_comparable(table);
explain->tracker.on_scan_init(); explain->tracker.on_scan_init();
ANALYZE_START_TRACKING(&explain->time_tracker);
while (!(error=info.read_record(&info)) && !thd->killed) while (!(error=info.read_record(&info)) && !thd->killed)
{ {
...@@ -907,6 +908,7 @@ int mysql_update(THD *thd, ...@@ -907,6 +908,7 @@ int mysql_update(THD *thd,
break; break;
} }
} }
ANALYZE_STOP_TRACKING(&explain->time_tracker);
table->auto_increment_field_not_null= FALSE; table->auto_increment_field_not_null= FALSE;
dup_key_found= 0; dup_key_found= 0;
/* /*
......
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