mirror of
https://github.com/MariaDB/server.git
synced 2025-01-16 03:52:35 +01:00
Enable PERFORMANCE_SCHEMA tracking for SHOW EXPLAIN's conditions.
This commit is contained in:
parent
ae3bc19161
commit
a931467e17
5 changed files with 102 additions and 3 deletions
27
mysql-test/r/show_explain_ps.result
Normal file
27
mysql-test/r/show_explain_ps.result
Normal file
|
@ -0,0 +1,27 @@
|
|||
drop table if exists t0, t1;
|
||||
select * from performance_schema.setup_instruments where name like '%show_explain%';
|
||||
NAME ENABLED TIMED
|
||||
wait/synch/cond/sql/show_explain YES YES
|
||||
# We've got no instances
|
||||
select * from performance_schema.cond_instances where name like '%show_explain%';
|
||||
NAME OBJECT_INSTANCE_BEGIN
|
||||
# Check out if our cond is hit.
|
||||
create table t0 (a int);
|
||||
insert into t0 values (0),(1),(2),(3),(4),(5),(6),(7),(8),(9);
|
||||
set @show_explain_probe_select_id=1;
|
||||
set debug_dbug='d,show_explain_probe_join_exec_start';
|
||||
select count(*) from t0 where a < 100000;
|
||||
show explain for $thr2;
|
||||
id select_type table type possible_keys key key_len ref rows Extra
|
||||
1 SIMPLE t0 ALL NULL NULL NULL NULL 10 Using where
|
||||
Warnings:
|
||||
Note 1003 select count(*) from t0 where a < 100000
|
||||
count(*)
|
||||
10
|
||||
set debug_dbug='';
|
||||
select event_name
|
||||
from performance_schema.events_waits_history_long
|
||||
where event_name='wait/synch/cond/sql/show_explain';
|
||||
event_name
|
||||
wait/synch/cond/sql/show_explain
|
||||
drop table t0;
|
48
mysql-test/t/show_explain_ps.test
Normal file
48
mysql-test/t/show_explain_ps.test
Normal file
|
@ -0,0 +1,48 @@
|
|||
#
|
||||
# Test how SHOW EXPLAIN is represented in performance schema
|
||||
#
|
||||
--source include/have_perfschema.inc
|
||||
|
||||
--disable_warnings
|
||||
drop table if exists t0, t1;
|
||||
--enable_warnings
|
||||
|
||||
select * from performance_schema.setup_instruments where name like '%show_explain%';
|
||||
|
||||
--echo # We've got no instances
|
||||
select * from performance_schema.cond_instances where name like '%show_explain%';
|
||||
|
||||
--echo # Check out if our cond is hit.
|
||||
|
||||
create table t0 (a int);
|
||||
insert into t0 values (0),(1),(2),(3),(4),(5),(6),(7),(8),(9);
|
||||
|
||||
let $thr1=`select connection_id()`;
|
||||
connect (con1, localhost, root,,);
|
||||
connection con1;
|
||||
let $thr2=`select connection_id()`;
|
||||
connection default;
|
||||
|
||||
let $wait_condition= select State='show_explain_trap' from information_schema.processlist where id=$thr2;
|
||||
|
||||
#
|
||||
# Test SHOW EXPLAIN for simple queries
|
||||
#
|
||||
connection con1;
|
||||
set @show_explain_probe_select_id=1;
|
||||
set debug_dbug='d,show_explain_probe_join_exec_start';
|
||||
send select count(*) from t0 where a < 100000;
|
||||
|
||||
connection default;
|
||||
--source include/wait_condition.inc
|
||||
evalp show explain for $thr2;
|
||||
connection con1;
|
||||
reap;
|
||||
|
||||
set debug_dbug='';
|
||||
|
||||
select event_name
|
||||
from performance_schema.events_waits_history_long
|
||||
where event_name='wait/synch/cond/sql/show_explain';
|
||||
|
||||
drop table t0;
|
|
@ -124,6 +124,26 @@ void Apc_target::dequeue_request(Call_request *qe)
|
|||
qe->next->prev= qe->prev;
|
||||
}
|
||||
|
||||
#ifdef HAVE_PSI_INTERFACE
|
||||
|
||||
/* One key for all conds */
|
||||
PSI_cond_key key_show_explain_request_COND;
|
||||
|
||||
static PSI_cond_info show_explain_psi_conds[]=
|
||||
{
|
||||
{ &key_show_explain_request_COND, "show_explain", 0 /* not using PSI_FLAG_GLOBAL*/ }
|
||||
};
|
||||
|
||||
void init_show_explain_psi_keys(void)
|
||||
{
|
||||
if (PSI_server == NULL)
|
||||
return;
|
||||
|
||||
PSI_server->register_cond("sql", show_explain_psi_conds,
|
||||
array_elements(show_explain_psi_conds));
|
||||
}
|
||||
#endif
|
||||
|
||||
|
||||
/*
|
||||
Make an APC (Async Procedure Call) to another thread.
|
||||
|
@ -154,7 +174,8 @@ bool Apc_target::make_apc_call(THD *caller_thd, Apc_call *call,
|
|||
Call_request apc_request;
|
||||
apc_request.call= call;
|
||||
apc_request.processed= FALSE;
|
||||
mysql_cond_init(0 /* do not track in PS */, &apc_request.COND_request, NULL);
|
||||
mysql_cond_init(key_show_explain_request_COND, &apc_request.COND_request,
|
||||
NULL);
|
||||
enqueue_request(&apc_request);
|
||||
apc_request.what="enqueued by make_apc_call";
|
||||
|
||||
|
@ -174,9 +195,7 @@ bool Apc_target::make_apc_call(THD *caller_thd, Apc_call *call,
|
|||
LOCK_thd_data_ptr, &abstime);
|
||||
// &apc_request.LOCK_request, &abstime);
|
||||
if (caller_thd->killed)
|
||||
{
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
if (!apc_request.processed)
|
||||
|
|
|
@ -119,3 +119,7 @@ private:
|
|||
}
|
||||
};
|
||||
|
||||
#ifdef HAVE_PSI_INTERFACE
|
||||
void init_show_explain_psi_keys(void);
|
||||
#endif
|
||||
|
||||
|
|
|
@ -3909,6 +3909,7 @@ static int init_thread_environment()
|
|||
sp_cache_init();
|
||||
#ifdef HAVE_EVENT_SCHEDULER
|
||||
Events::init_mutexes();
|
||||
init_show_explain_psi_keys();
|
||||
#endif
|
||||
/* Parameter for threads created for connections */
|
||||
(void) pthread_attr_init(&connection_attrib);
|
||||
|
|
Loading…
Reference in a new issue