|
|
Edit
|
Copy
|
Delete
DELETE FROM proc WHERE `proc`.`db` = 'sys' AND `proc`.`name` = 'extract_schema_from_file_name' AND `proc`.`type` = 'FUNCTION'
|
sys |
extract_schema_from_file_name |
FUNCTION |
extract_schema_from_file_name |
SQL |
NO_SQL |
YES |
INVOKER |
path VARCHAR(512)
|
varchar(64) CHARSET utf8mb3 COLLATE utf8mb3_general_ci
|
BEGIN
RETURN LEFT(SUBSTRING_INDEX(SUBSTRING_INDEX(REPLACE(path, '\\', '/'), '/', -2), '/', 1), 64);
END
|
mariadb.sys@localhost |
2026-04-10 15:41:07 |
2026-04-10 15:41:07 |
|
Description
Takes a raw... |
utf8mb3 |
utf8mb3_general_ci |
utf8mb3_general_ci |
BEGIN
RETURN LEFT(SUBSTRING_INDEX(SUBSTRING_INDEX(REPLACE(path, '\', '/'), '/', -2), '/', 1), 64);
END
|
NONE |
|
|
Edit
|
Copy
|
Delete
DELETE FROM proc WHERE `proc`.`db` = 'sys' AND `proc`.`name` = 'extract_table_from_file_name' AND `proc`.`type` = 'FUNCTION'
|
sys |
extract_table_from_file_name |
FUNCTION |
extract_table_from_file_name |
SQL |
NO_SQL |
YES |
INVOKER |
path VARCHAR(512)
|
varchar(64) CHARSET utf8mb3 COLLATE utf8mb3_general_ci
|
BEGIN
RETURN LEFT(SUBSTRING_INDEX(REPLACE(SUBSTRING_INDEX(REPLACE(path, '\\', '/'), '/', -1), '@0024', '$'), '.', 1), 64);
END
|
mariadb.sys@localhost |
2026-04-10 15:41:07 |
2026-04-10 15:41:07 |
|
Description
Takes a raw... |
utf8mb3 |
utf8mb3_general_ci |
utf8mb3_general_ci |
BEGIN
RETURN LEFT(SUBSTRING_INDEX(REPLACE(SUBSTRING_INDEX(REPLACE(path, '\', '/'), '/', -1), '@0024', '$'), '.', 1), 64);
END
|
NONE |
|
|
Edit
|
Copy
|
Delete
DELETE FROM proc WHERE `proc`.`db` = 'sys' AND `proc`.`name` = 'format_bytes' AND `proc`.`type` = 'FUNCTION'
|
sys |
format_bytes |
FUNCTION |
format_bytes |
SQL |
NO_SQL |
YES |
INVOKER |
bytes TEXT
|
text CHARSET utf8mb3 COLLATE utf8mb3_general_ci
|
BEGIN
IF bytes IS NULL THEN RETURN NULL;
ELSEIF bytes >= 1125899906842624 THEN RETURN CONCAT(ROUND(bytes / 1125899906842624, 2), ' PiB');
ELSEIF bytes >= 1099511627776 THEN RETURN CONCAT(ROUND(bytes / 1099511627776, 2), ' TiB');
ELSEIF bytes >= 1073741824 THEN RETURN CONCAT(ROUND(bytes / 1073741824, 2), ' GiB');
ELSEIF bytes >= 1048576 THEN RETURN CONCAT(ROUND(bytes / 1048576, 2), ' MiB');
ELSEIF bytes >= 1024 THEN RETURN CONCAT(ROUND(bytes / 1024, 2), ' KiB');
ELSE RETURN CONCAT(ROUND(bytes, 0), ' bytes');
END IF;
END
|
mariadb.sys@localhost |
2026-04-10 15:41:07 |
2026-04-10 15:41:07 |
|
Description
Takes a raw... |
utf8mb3 |
utf8mb3_general_ci |
utf8mb3_general_ci |
BEGIN
IF bytes IS NULL THEN RETURN NULL;
ELSEIF bytes >= 1125899906842624 THEN RETURN CONCAT(ROUND(bytes / 1125899906842624, 2), ' PiB');
ELSEIF bytes >= 1099511627776 THEN RETURN CONCAT(ROUND(bytes / 1099511627776, 2), ' TiB');
ELSEIF bytes >= 1073741824 THEN RETURN CONCAT(ROUND(bytes / 1073741824, 2), ' GiB');
ELSEIF bytes >= 1048576 THEN RETURN CONCAT(ROUND(bytes / 1048576, 2), ' MiB');
ELSEIF bytes >= 1024 THEN RETURN CONCAT(ROUND(bytes / 1024, 2), ' KiB');
ELSE RETURN CONCAT(ROUND(bytes, 0), ' bytes');
END IF;
END
|
NONE |
|
|
Edit
|
Copy
|
Delete
DELETE FROM proc WHERE `proc`.`db` = 'sys' AND `proc`.`name` = 'ps_thread_stack' AND `proc`.`type` = 'FUNCTION'
|
sys |
ps_thread_stack |
FUNCTION |
ps_thread_stack |
SQL |
READS_SQL_DATA |
NO |
INVOKER |
thd_id BIGINT UNSIGNED,
debug BOOLEAN
|
longtext CHARSET latin1 COLLATE latin1_swedish_ci
|
BEGIN
DECLARE json_objects LONGTEXT;
UPDATE performance_schema.threads
SET instrumented = 'NO'
WHERE processlist_id = CONNECTION_ID();
SET SESSION group_concat_max_len=@@global.max_allowed_packet;
SELECT GROUP_CONCAT(CONCAT( '{'
, CONCAT_WS( ', '
, CONCAT('"nesting_event_id": "', IF(nesting_event_id IS NULL, '0', nesting_event_id), '"')
, CONCAT('"event_id": "', event_id, '"')
, CONCAT( '"timer_wait": ', ROUND(timer_wait/1000000, 2))
, CONCAT( '"event_info": "'
, CASE
WHEN event_name NOT LIKE 'wait/io%' THEN REPLACE(SUBSTRING_INDEX(event_name, '/', -2), '\\', '\\\\')
WHEN event_name NOT LIKE 'wait/io/file%' OR event_name NOT LIKE 'wait/io/socket%' THEN REPLACE(SUBSTRING_INDEX(event_name, '/', -4), '\\', '\\\\')
ELSE event_name
END
, '"'
)
, CONCAT( '"wait_info": "', IFNULL(wait_info, ''), '"')
, CONCAT( '"source": "', IF(true AND event_name LIKE 'wait%', IFNULL(wait_info, ''), ''), '"')
, CASE
WHEN event_name LIKE 'wait/io/file%' THEN '"event_type": "io/file"'
WHEN event_name LIKE 'wait/io/table%' THEN '"event_type": "io/table"'
WHEN event_name LIKE 'wait/io/socket%' THEN '"event_type": "io/socket"'
WHEN event_name LIKE 'wait/synch/mutex%' THEN '"event_type": "synch/mutex"'
WHEN event_name LIKE 'wait/synch/cond%' THEN '"event_type": "synch/cond"'
WHEN event_name LIKE 'wait/synch/rwlock%' THEN '"event_type": "synch/rwlock"'
WHEN event_name LIKE 'wait/lock%' THEN '"event_type": "lock"'
WHEN event_name LIKE 'statement/%' THEN '"event_type": "stmt"'
WHEN event_name LIKE 'stage/%' THEN '"event_type": "stage"'
WHEN event_name LIKE '%idle%' THEN '"event_type": "idle"'
ELSE ''
END
)
, '}'
)
ORDER BY event_id ASC SEPARATOR ',') event
INTO json_objects
FROM (
(SELECT thread_id, event_id, event_name, timer_wait, timer_start, nesting_event_id,
CONCAT(sql_text, '\\n',
'errors: ', errors, '\\n',
'warnings: ', warnings, '\\n',
'lock time: ', ROUND(lock_time/1000000, 2),'us\\n',
'rows affected: ', rows_affected, '\\n',
'rows sent: ', rows_sent, '\\n',
'rows examined: ', rows_examined, '\\n',
'tmp tables: ', created_tmp_tables, '\\n',
'tmp disk tables: ', created_tmp_disk_tables, '\\n',
'select scan: ', select_scan, '\\n',
'select full join: ', select_full_join, '\\n',
'select full range join: ', select_full_range_join, '\\n',
'select range: ', select_range, '\\n',
'select range check: ', select_range_check, '\\n',
'sort merge passes: ', sort_merge_passes, '\\n',
'sort rows: ', sort_rows, '\\n',
'sort range: ', sort_range, '\\n',
'sort scan: ', sort_scan, '\\n',
'no index used: ', IF(no_index_used, 'TRUE', 'FALSE'), '\\n',
'no good index used: ', IF(no_good_index_used, 'TRUE', 'FALSE'), '\\n'
) AS wait_info
FROM performance_schema.events_statements_history_long WHERE thread_id = thd_id)
UNION
(SELECT thread_id, event_id, event_name, timer_wait, timer_start, nesting_event_id, null AS wait_info
FROM performance_schema.events_stages_history_long WHERE thread_id = thd_id)
UNION
(SELECT thread_id, event_id,
CONCAT(event_name ,
IF(event_name NOT LIKE 'wait/synch/mutex%', IFNULL(CONCAT(' - ', operation), ''), ''),
IF(number_of_bytes IS NOT NULL, CONCAT(' ', number_of_bytes, ' bytes'), ''),
IF(event_name LIKE 'wait/io/file%', '\\n', ''),
IF(object_schema IS NOT NULL, CONCAT('\\nObject: ', object_schema, '.'), ''),
IF(object_name IS NOT NULL,
IF (event_name LIKE 'wait/io/socket%',
CONCAT(IF (object_name LIKE ':0%', @@socket, object_name)),
object_name),
''),
IF(index_name IS NOT NULL, CONCAT(' Index: ', index_name), ''),'\\n'
) AS event_name,
timer_wait, timer_start, nesting_event_id, source AS wait_info
FROM performance_schema.events_waits_history_long WHERE thread_id = thd_id)) events
ORDER BY event_id;
RETURN CONCAT('{',
CONCAT_WS(',',
'"rankdir": "LR"',
'"nodesep": "0.10"',
CONCAT('"stack_created": "', NOW(), '"'),
CONCAT('"mysql_version": "', VERSION(), '"'),
CONCAT('"mysql_user": "', CURRENT_USER(), '"'),
CONCAT('"events": [', IFNULL(json_objects,''), ']')
),
'}');
END
|
mariadb.sys@localhost |
2026-04-10 15:41:07 |
2026-04-10 15:41:07 |
|
Description
Outputs a J... |
utf8mb3 |
utf8mb3_general_ci |
utf8mb3_general_ci |
BEGIN
DECLARE json_objects LONGTEXT;
UPDATE performance_schema.threads
SET instrumented = 'NO'
WHERE processlist_id = CONNECTION_ID();
SET SESSION group_concat_max_len=@@global.max_allowed_packet;
SELECT GROUP_CONCAT(CONCAT( '{'
, CONCAT_WS( ', '
, CONCAT('"nesting_event_id": "', IF(nesting_event_id IS NULL, '0', nesting_event_id), '"')
, CONCAT('"event_id": "', event_id, '"')
, CONCAT( '"timer_wait": ', ROUND(timer_wait/1000000, 2))
, CONCAT( '"event_info": "'
, CASE
WHEN event_name NOT LIKE 'wait/io%' THEN REPLACE(SUBSTRING_INDEX(event_name, '/', -2), '\', '\\')
WHEN event_name NOT LIKE 'wait/io/file%' OR event_name NOT LIKE 'wait/io/socket%' THEN REPLACE(SUBSTRING_INDEX(event_name, '/', -4), '\', '\\')
ELSE event_name
END
, '"'
)
, CONCAT( '"wait_info": "', IFNULL(wait_info, ''), '"')
, CONCAT( '"source": "', IF(true AND event_name LIKE 'wait%', IFNULL(wait_info, ''), ''), '"')
, CASE
WHEN event_name LIKE 'wait/io/file%' THEN '"event_type": "io/file"'
WHEN event_name LIKE 'wait/io/table%' THEN '"event_type": "io/table"'
WHEN event_name LIKE 'wait/io/socket%' THEN '"event_type": "io/socket"'
WHEN event_name LIKE 'wait/synch/mutex%' THEN '"event_type": "synch/mutex"'
WHEN event_name LIKE 'wait/synch/cond%' THEN '"event_type": "synch/cond"'
WHEN event_name LIKE 'wait/synch/rwlock%' THEN '"event_type": "synch/rwlock"'
WHEN event_name LIKE 'wait/lock%' THEN '"event_type": "lock"'
WHEN event_name LIKE 'statement/%' THEN '"event_type": "stmt"'
WHEN event_name LIKE 'stage/%' THEN '"event_type": "stage"'
WHEN event_name LIKE '%idle%' THEN '"event_type": "idle"'
ELSE ''
END
)
, '}'
)
ORDER BY event_id ASC SEPARATOR ',') event
INTO json_objects
FROM (
(SELECT thread_id, event_id, event_name, timer_wait, timer_start, nesting_event_id,
CONCAT(sql_text, '\n',
'errors: ', errors, '\n',
'warnings: ', warnings, '\n',
'lock time: ', ROUND(lock_time/1000000, 2),'us\n',
'rows affected: ', rows_affected, '\n',
'rows sent: ', rows_sent, '\n',
'rows examined: ', rows_examined, '\n',
'tmp tables: ', created_tmp_tables, '\n',
'tmp disk tables: ', created_tmp_disk_tables, '\n',
'select scan: ', select_scan, '\n',
'select full join: ', select_full_join, '\n',
'select full range join: ', select_full_range_join, '\n',
'select range: ', select_range, '\n',
'select range check: ', select_range_check, '\n',
'sort merge passes: ', sort_merge_passes, '\n',
'sort rows: ', sort_rows, '\n',
'sort range: ', sort_range, '\n',
'sort scan: ', sort_scan, '\n',
'no index used: ', IF(no_index_used, 'TRUE', 'FALSE'), '\n',
'no good index used: ', IF(no_good_index_used, 'TRUE', 'FALSE'), '\n'
) AS wait_info
FROM performance_schema.events_statements_history_long WHERE thread_id = thd_id)
UNION
(SELECT thread_id, event_id, event_name, timer_wait, timer_start, nesting_event_id, null AS wait_info
FROM performance_schema.events_stages_history_long WHERE thread_id = thd_id)
UNION
(SELECT thread_id, event_id,
CONCAT(event_name ,
IF(event_name NOT LIKE 'wait/synch/mutex%', IFNULL(CONCAT(' - ', operation), ''), ''),
IF(number_of_bytes IS NOT NULL, CONCAT(' ', number_of_bytes, ' bytes'), ''),
IF(event_name LIKE 'wait/io/file%', '\n', ''),
IF(object_schema IS NOT NULL, CONCAT('\nObject: ', object_schema, '.'), ''),
IF(object_name IS NOT NULL,
IF (event_name LIKE 'wait/io/socket%',
CONCAT(IF (object_name LIKE ':0%', @@socket, object_name)),
object_name),
''),
IF(index_name IS NOT NULL, CONCAT(' Index: ', index_name), ''),'\n'
) AS event_name,
timer_wait, timer_start, nesting_event_id, source AS wait_info
FROM performance_schema.events_waits_history_long WHERE thread_id = thd_id)) events
ORDER BY event_id;
RETURN CONCAT('{',
CONCAT_WS(',',
'"rankdir": "LR"',
'"nodesep": "0.10"',
CONCAT('"stack_created": "', NOW(), '"'),
CONCAT('"mysql_version": "', VERSION(), '"'),
CONCAT('"mysql_user": "', CURRENT_USER(), '"'),
CONCAT('"events": [', IFNULL(json_objects,''), ']')
),
'}');
END
|
NONE |
|
|
Edit
|
Copy
|
Delete
DELETE FROM proc WHERE `proc`.`db` = 'sys' AND `proc`.`name` = 'ps_thread_trx_info' AND `proc`.`type` = 'FUNCTION'
|
sys |
ps_thread_trx_info |
FUNCTION |
ps_thread_trx_info |
SQL |
READS_SQL_DATA |
NO |
INVOKER |
in_thread_id BIGINT UNSIGNED
|
longtext CHARSET utf8mb3 COLLATE utf8mb3_general_ci
|
BEGIN
DECLARE v_output LONGTEXT DEFAULT '{}';
DECLARE v_msg_text TEXT DEFAULT '';
DECLARE v_signal_msg TEXT DEFAULT '';
DECLARE v_mysql_errno INT;
DECLARE v_max_output_len BIGINT;
DECLARE EXIT HANDLER FOR SQLWARNING, SQLEXCEPTION
BEGIN
GET DIAGNOSTICS CONDITION 1
v_msg_text = MESSAGE_TEXT,
v_mysql_errno = MYSQL_ERRNO;
IF v_mysql_errno = 1260 THEN
SET v_signal_msg = CONCAT('{ "error": "Trx info truncated: ', v_msg_text, '" }');
ELSE
SET v_signal_msg = CONCAT('{ "error": "', v_msg_text, '" }');
END IF;
RETURN v_signal_msg;
END;
IF (@sys.ps_thread_trx_info.max_length IS NULL) THEN
SET @sys.ps_thread_trx_info.max_length = sys.sys_get_config('ps_thread_trx_info.max_length', 65535);
END IF;
IF (@sys.ps_thread_trx_info.max_length != @@session.group_concat_max_len) THEN
SET @old_group_concat_max_len = @@session.group_concat_max_len;
SET v_max_output_len = (@sys.ps_thread_trx_info.max_length - 5);
SET SESSION group_concat_max_len = v_max_output_len;
END IF;
SET v_output = (
SELECT CONCAT('[', IFNULL(GROUP_CONCAT(trx_info ORDER BY event_id), ''), '\n]') AS trx_info
FROM (SELECT trxi.thread_id,
trxi.event_id,
GROUP_CONCAT(
IFNULL(
CONCAT('\n {\n',
' "time": "', IFNULL(sys.format_time(trxi.timer_wait), ''), '",\n',
' "state": "', IFNULL(trxi.state, ''), '",\n',
' "mode": "', IFNULL(trxi.access_mode, ''), '",\n',
' "autocommitted": "', IFNULL(trxi.autocommit, ''), '",\n',
' "gtid": "', IFNULL(trxi.gtid, ''), '",\n',
' "isolation": "', IFNULL(trxi.isolation_level, ''), '",\n',
' "statements_executed": [', IFNULL(s.stmts, ''), IF(s.stmts IS NULL, ' ]\n', '\n ]\n'),
' }'
),
'')
ORDER BY event_id) AS trx_info
FROM (
(SELECT thread_id, event_id, timer_wait, state,access_mode, autocommit, gtid, isolation_level
FROM performance_schema.events_transactions_current
WHERE thread_id = in_thread_id
AND end_event_id IS NULL)
UNION
(SELECT thread_id, event_id, timer_wait, state,access_mode, autocommit, gtid, isolation_level
FROM performance_schema.events_transactions_history
WHERE thread_id = in_thread_id)
) AS trxi
LEFT JOIN (SELECT thread_id,
nesting_event_id,
GROUP_CONCAT(
IFNULL(
CONCAT('\n {\n',
' "sql_text": "', IFNULL(sys.format_statement(REPLACE(sql_text, '\\', '\\\\')), ''), '",\n',
' "time": "', IFNULL(sys.format_time(timer_wait), ''), '",\n',
' "schema": "', IFNULL(current_schema, ''), '",\n',
' "rows_examined": ', IFNULL(rows_examined, ''), ',\n',
' "rows_affected": ', IFNULL(rows_affected, ''), ',\n',
' "rows_sent": ', IFNULL(rows_sent, ''), ',\n',
' "tmp_tables": ', IFNULL(created_tmp_tables, ''), ',\n',
' "tmp_disk_tables": ', IFNULL(created_tmp_disk_tables, ''), ',\n',
' "sort_rows": ', IFNULL(sort_rows, ''), ',\n',
' "sort_merge_passes": ', IFNULL(sort_merge_passes, ''), '\n',
' }'), '') ORDER BY event_id) AS stmts
FROM performance_schema.events_statements_history
WHERE sql_text IS NOT NULL
AND thread_id = in_thread_id
GROUP BY thread_id, nesting_event_id
) AS s
ON trxi.thread_id = s.thread_id
AND trxi.event_id = s.nesting_event_id
WHERE trxi.thread_id = in_thread_id
GROUP BY trxi.thread_id, trxi.event_id
) trxs
GROUP BY thread_id
);
IF (@old_group_concat_max_len IS NOT NULL) THEN
SET SESSION group_concat_max_len = @old_group_concat_max_len;
END IF;
RETURN v_output;
END
|
mariadb.sys@localhost |
2026-04-10 15:41:07 |
2026-04-10 15:41:07 |
|
Description
Returns a J... |
utf8mb3 |
utf8mb3_general_ci |
utf8mb3_general_ci |
BEGIN
DECLARE v_output LONGTEXT DEFAULT '{}';
DECLARE v_msg_text TEXT DEFAULT '';
DECLARE v_signal_msg TEXT DEFAULT '';
DECLARE v_mysql_errno INT;
DECLARE v_max_output_len BIGINT;
DECLARE EXIT HANDLER FOR SQLWARNING, SQLEXCEPTION
BEGIN
GET DIAGNOSTICS CONDITION 1
v_msg_text = MESSAGE_TEXT,
v_mysql_errno = MYSQL_ERRNO;
IF v_mysql_errno = 1260 THEN
SET v_signal_msg = CONCAT('{ "error": "Trx info truncated: ', v_msg_text, '" }');
ELSE
SET v_signal_msg = CONCAT('{ "error": "', v_msg_text, '" }');
END IF;
RETURN v_signal_msg;
END;
IF (@sys.ps_thread_trx_info.max_length IS NULL) THEN
SET @sys.ps_thread_trx_info.max_length = sys.sys_get_config('ps_thread_trx_info.max_length', 65535);
END IF;
IF (@sys.ps_thread_trx_info.max_length != @@session.group_concat_max_len) THEN
SET @old_group_concat_max_len = @@session.group_concat_max_len;
SET v_max_output_len = (@sys.ps_thread_trx_info.max_length - 5);
SET SESSION group_concat_max_len = v_max_output_len;
END IF;
SET v_output = (
SELECT CONCAT('[', IFNULL(GROUP_CONCAT(trx_info ORDER BY event_id), ''), '\n]') AS trx_info
FROM (SELECT trxi.thread_id,
trxi.event_id,
GROUP_CONCAT(
IFNULL(
CONCAT('\n {\n',
' "time": "', IFNULL(sys.format_time(trxi.timer_wait), ''), '",\n',
' "state": "', IFNULL(trxi.state, ''), '",\n',
' "mode": "', IFNULL(trxi.access_mode, ''), '",\n',
' "autocommitted": "', IFNULL(trxi.autocommit, ''), '",\n',
' "gtid": "', IFNULL(trxi.gtid, ''), '",\n',
' "isolation": "', IFNULL(trxi.isolation_level, ''), '",\n',
' "statements_executed": [', IFNULL(s.stmts, ''), IF(s.stmts IS NULL, ' ]\n', '\n ]\n'),
' }'
),
'')
ORDER BY event_id) AS trx_info
FROM (
(SELECT thread_id, event_id, timer_wait, state,access_mode, autocommit, gtid, isolation_level
FROM performance_schema.events_transactions_current
WHERE thread_id = in_thread_id
AND end_event_id IS NULL)
UNION
(SELECT thread_id, event_id, timer_wait, state,access_mode, autocommit, gtid, isolation_level
FROM performance_schema.events_transactions_history
WHERE thread_id = in_thread_id)
) AS trxi
LEFT JOIN (SELECT thread_id,
nesting_event_id,
GROUP_CONCAT(
IFNULL(
CONCAT('\n {\n',
' "sql_text": "', IFNULL(sys.format_statement(REPLACE(sql_text, '\', '\\')), ''), '",\n',
' "time": "', IFNULL(sys.format_time(timer_wait), ''), '",\n',
' "schema": "', IFNULL(current_schema, ''), '",\n',
' "rows_examined": ', IFNULL(rows_examined, ''), ',\n',
' "rows_affected": ', IFNULL(rows_affected, ''), ',\n',
' "rows_sent": ', IFNULL(rows_sent, ''), ',\n',
' "tmp_tables": ', IFNULL(created_tmp_tables, ''), ',\n',
' "tmp_disk_tables": ', IFNULL(created_tmp_disk_tables, ''), ',\n',
' "sort_rows": ', IFNULL(sort_rows, ''), ',\n',
' "sort_merge_passes": ', IFNULL(sort_merge_passes, ''), '\n',
' }'), '') ORDER BY event_id) AS stmts
FROM performance_schema.events_statements_history
WHERE sql_text IS NOT NULL
AND thread_id = in_thread_id
GROUP BY thread_id, nesting_event_id
) AS s
ON trxi.thread_id = s.thread_id
AND trxi.event_id = s.nesting_event_id
WHERE trxi.thread_id = in_thread_id
GROUP BY trxi.thread_id, trxi.event_id
) trxs
GROUP BY thread_id
);
IF (@old_group_concat_max_len IS NOT NULL) THEN
SET SESSION group_concat_max_len = @old_group_concat_max_len;
END IF;
RETURN v_output;
END
|
NONE |
|
|
Edit
|
Copy
|
Delete
DELETE FROM proc WHERE `proc`.`db` = 'sys' AND `proc`.`name` = 'create_synonym_db' AND `proc`.`type` = 'PROCEDURE'
|
sys |
create_synonym_db |
PROCEDURE |
create_synonym_db |
SQL |
MODIFIES_SQL_DATA |
NO |
INVOKER |
IN in_db_name VARCHAR(64),
IN in_synonym VARCHAR(64)
|
|
BEGIN
DECLARE v_done bool DEFAULT FALSE;
DECLARE v_db_name_check VARCHAR(64);
DECLARE v_db_err_msg TEXT;
DECLARE v_table VARCHAR(64);
DECLARE v_views_created INT DEFAULT 0;
DECLARE v_table_exists ENUM('', 'BASE TABLE', 'VIEW', 'TEMPORARY') DEFAULT '';
DECLARE v_temp_table TEXT;
DECLARE c_table_names CURSOR FOR
SELECT TABLE_NAME
FROM INFORMATION_SCHEMA.TABLES
WHERE TABLE_SCHEMA = in_db_name;
DECLARE CONTINUE HANDLER FOR NOT FOUND SET v_done = TRUE;
SELECT SCHEMA_NAME INTO v_db_name_check
FROM INFORMATION_SCHEMA.SCHEMATA
WHERE SCHEMA_NAME = in_db_name;
IF v_db_name_check IS NULL THEN
SET v_db_err_msg = CONCAT('Unknown database ', in_db_name);
SIGNAL SQLSTATE 'HY000'
SET MESSAGE_TEXT = v_db_err_msg;
END IF;
SELECT SCHEMA_NAME INTO v_db_name_check
FROM INFORMATION_SCHEMA.SCHEMATA
WHERE SCHEMA_NAME = in_synonym;
IF v_db_name_check = in_synonym THEN
SET v_db_err_msg = CONCAT('Can\'t create database ', in_synonym, '; database exists');
SIGNAL SQLSTATE 'HY000'
SET MESSAGE_TEXT = v_db_err_msg;
END IF;
SET @create_db_stmt := CONCAT('CREATE DATABASE ', sys.quote_identifier(in_synonym));
PREPARE create_db_stmt FROM @create_db_stmt;
EXECUTE create_db_stmt;
DEALLOCATE PREPARE create_db_stmt;
SET v_done = FALSE;
OPEN c_table_names;
c_table_names: LOOP
FETCH c_table_names INTO v_table;
IF v_done THEN
LEAVE c_table_names;
END IF;
CALL sys.table_exists(in_db_name, v_table, v_table_exists);
IF (v_table_exists = 'TEMPORARY') THEN
SET v_temp_table =
CONCAT(
'Table',
sys.quote_identifier(in_db_name),
'.',
sys.quote_identifier(v_table),
'shadows base table. View cannot be created! Terminating!');
SIGNAL SQLSTATE 'HY000'
SET MESSAGE_TEXT = v_temp_table;
LEAVE c_table_names;
END IF;
SET @create_view_stmt = CONCAT(
'CREATE SQL SECURITY INVOKER VIEW ',
sys.quote_identifier(in_synonym),
'.',
sys.quote_identifier(v_table),
' AS SELECT * FROM ',
sys.quote_identifier(in_db_name),
'.',
sys.quote_identifier(v_table)
);
PREPARE create_view_stmt FROM @create_view_stmt;
EXECUTE create_view_stmt;
DEALLOCATE PREPARE create_view_stmt;
SET v_views_created = v_views_created + 1;
END LOOP;
CLOSE c_table_names;
SELECT CONCAT(
'Created ', v_views_created, ' view',
IF(v_views_created != 1, 's', ''), ' in the ',
sys.quote_identifier(in_synonym), ' database'
) AS summary;
END
|
mariadb.sys@localhost |
2026-04-10 15:41:08 |
2026-04-10 15:41:08 |
|
Description
Takes a sou... |
utf8mb3 |
utf8mb3_general_ci |
utf8mb3_general_ci |
BEGIN
DECLARE v_done bool DEFAULT FALSE;
DECLARE v_db_name_check VARCHAR(64);
DECLARE v_db_err_msg TEXT;
DECLARE v_table VARCHAR(64);
DECLARE v_views_created INT DEFAULT 0;
DECLARE v_table_exists ENUM('', 'BASE TABLE', 'VIEW', 'TEMPORARY') DEFAULT '';
DECLARE v_temp_table TEXT;
DECLARE c_table_names CURSOR FOR
SELECT TABLE_NAME
FROM INFORMATION_SCHEMA.TABLES
WHERE TABLE_SCHEMA = in_db_name;
DECLARE CONTINUE HANDLER FOR NOT FOUND SET v_done = TRUE;
SELECT SCHEMA_NAME INTO v_db_name_check
FROM INFORMATION_SCHEMA.SCHEMATA
WHERE SCHEMA_NAME = in_db_name;
IF v_db_name_check IS NULL THEN
SET v_db_err_msg = CONCAT('Unknown database ', in_db_name);
SIGNAL SQLSTATE 'HY000'
SET MESSAGE_TEXT = v_db_err_msg;
END IF;
SELECT SCHEMA_NAME INTO v_db_name_check
FROM INFORMATION_SCHEMA.SCHEMATA
WHERE SCHEMA_NAME = in_synonym;
IF v_db_name_check = in_synonym THEN
SET v_db_err_msg = CONCAT('Can''t create database ', in_synonym, '; database exists');
SIGNAL SQLSTATE 'HY000'
SET MESSAGE_TEXT = v_db_err_msg;
END IF;
SET @create_db_stmt := CONCAT('CREATE DATABASE ', sys.quote_identifier(in_synonym));
PREPARE create_db_stmt FROM @create_db_stmt;
EXECUTE create_db_stmt;
DEALLOCATE PREPARE create_db_stmt;
SET v_done = FALSE;
OPEN c_table_names;
c_table_names: LOOP
FETCH c_table_names INTO v_table;
IF v_done THEN
LEAVE c_table_names;
END IF;
CALL sys.table_exists(in_db_name, v_table, v_table_exists);
IF (v_table_exists = 'TEMPORARY') THEN
SET v_temp_table =
CONCAT(
'Table',
sys.quote_identifier(in_db_name),
'.',
sys.quote_identifier(v_table),
'shadows base table. View cannot be created! Terminating!');
SIGNAL SQLSTATE 'HY000'
SET MESSAGE_TEXT = v_temp_table;
LEAVE c_table_names;
END IF;
SET @create_view_stmt = CONCAT(
'CREATE SQL SECURITY INVOKER VIEW ',
sys.quote_identifier(in_synonym),
'.',
sys.quote_identifier(v_table),
' AS SELECT * FROM ',
sys.quote_identifier(in_db_name),
'.',
sys.quote_identifier(v_table)
);
PREPARE create_view_stmt FROM @create_view_stmt;
EXECUTE create_view_stmt;
DEALLOCATE PREPARE create_view_stmt;
SET v_views_created = v_views_created + 1;
END LOOP;
CLOSE c_table_names;
SELECT CONCAT(
'Created ', v_views_created, ' view',
IF(v_views_created != 1, 's', ''), ' in the ',
sys.quote_identifier(in_synonym), ' database'
) AS summary;
END
|
NONE |
|
|
Edit
|
Copy
|
Delete
DELETE FROM proc WHERE `proc`.`db` = 'sys' AND `proc`.`name` = 'diagnostics' AND `proc`.`type` = 'PROCEDURE'
|
sys |
diagnostics |
PROCEDURE |
diagnostics |
SQL |
READS_SQL_DATA |
NO |
INVOKER |
IN in_max_runtime int unsigned, IN in_interval int unsigned,
IN in_auto_config enum ('current', 'medium', 'full')
|
|
BEGIN
DECLARE v_start, v_runtime, v_iter_start, v_sleep DECIMAL(20,2) DEFAULT 0.0;
DECLARE v_has_innodb, v_has_ndb, v_has_ps, v_has_replication, v_has_ps_replication VARCHAR(8) CHARSET utf8 DEFAULT 'NO';
DECLARE v_this_thread_enabled, v_has_ps_vars, v_has_metrics ENUM('YES', 'NO');
DECLARE v_table_name, v_banner VARCHAR(64) CHARSET utf8;
DECLARE v_sql_status_summary_select, v_sql_status_summary_delta, v_sql_status_summary_from, v_no_delta_names TEXT;
DECLARE v_output_time, v_output_time_prev DECIMAL(20,3) UNSIGNED;
DECLARE v_output_count, v_count, v_old_group_concat_max_len INT UNSIGNED DEFAULT 0;
DECLARE v_status_summary_width TINYINT UNSIGNED DEFAULT 50;
DECLARE v_done BOOLEAN DEFAULT FALSE;
DECLARE c_ndbinfo CURSOR FOR
SELECT TABLE_NAME
FROM information_schema.TABLES
WHERE TABLE_SCHEMA = 'ndbinfo'
AND TABLE_NAME NOT IN (
'blocks',
'config_params',
'dict_obj_types',
'disk_write_speed_base',
'memory_per_fragment',
'memoryusage',
'operations_per_fragment',
'threadblocks'
);
DECLARE c_sysviews_w_delta CURSOR FOR
SELECT table_name
FROM tmp_sys_views_delta
ORDER BY table_name;
DECLARE CONTINUE HANDLER FOR NOT FOUND SET v_done = TRUE;
SELECT INSTRUMENTED INTO v_this_thread_enabled FROM performance_schema.threads WHERE PROCESSLIST_ID = CONNECTION_ID();
IF (v_this_thread_enabled = 'YES') THEN
CALL sys.ps_setup_disable_thread(CONNECTION_ID());
END IF;
IF (in_max_runtime < in_interval) THEN
SIGNAL SQLSTATE '45000'
SET MESSAGE_TEXT = 'in_max_runtime must be greater than or equal to in_interval';
END IF;
IF (in_max_runtime = 0) THEN
SIGNAL SQLSTATE '45000'
SET MESSAGE_TEXT = 'in_max_runtime must be greater than 0';
END IF;
IF (in_interval = 0) THEN
SIGNAL SQLSTATE '45000'
SET MESSAGE_TEXT = 'in_interval must be greater than 0';
END IF;
IF (@sys.diagnostics.allow_i_s_tables IS NULL) THEN
SET @sys.diagnostics.allow_i_s_tables = sys.sys_get_config('diagnostics.allow_i_s_tables', 'OFF');
END IF;
IF (@sys.diagnostics.include_raw IS NULL) THEN
SET @sys.diagnostics.include_raw = sys.sys_get_config('diagnostics.include_raw' , 'OFF');
END IF;
IF (@sys.debug IS NULL) THEN
SET @sys.debug = sys.sys_get_config('debug' , 'OFF');
END IF;
IF (@sys.statement_truncate_len IS NULL) THEN
SET @sys.statement_truncate_len = sys.sys_get_config('statement_truncate_len' , '64' );
END IF;
SET @log_bin := @@sql_log_bin;
IF (@log_bin = 1) THEN
SET sql_log_bin = 0;
END IF;
SET v_no_delta_names = CONCAT('s%{COUNT}.Variable_name NOT IN (',
'''innodb_buffer_pool_pages_total'', ',
'''innodb_page_size'', ',
'''last_query_cost'', ',
'''last_query_partial_plans'', ',
'''qcache_total_blocks'', ',
'''slave_last_heartbeat'', ',
'''ssl_ctx_verify_depth'', ',
'''ssl_ctx_verify_mode'', ',
'''ssl_session_cache_size'', ',
'''ssl_verify_depth'', ',
'''ssl_verify_mode'', ',
'''ssl_version'', ',
'''buffer_flush_lsn_avg_rate'', ',
'''buffer_flush_pct_for_dirty'', ',
'''buffer_flush_pct_for_lsn'', ',
'''buffer_pool_pages_total'', ',
'''lock_row_lock_time_avg'', ',
'''lock_row_lock_time_max'', ',
'''innodb_page_size''',
')');
IF (in_auto_config <> 'current') THEN
IF (@sys.debug = 'ON') THEN
SELECT CONCAT('Updating Performance Schema configuration to ', in_auto_config) AS 'Debug';
END IF;
CALL sys.ps_setup_save(0);
IF (in_auto_config = 'medium') THEN
UPDATE performance_schema.setup_consumers
SET ENABLED = 'YES'
WHERE NAME NOT LIKE '%\_history%';
UPDATE performance_schema.setup_instruments
SET ENABLED = 'YES',
TIMED = 'YES'
WHERE NAME NOT LIKE 'wait/synch/%';
ELSEIF (in_auto_config = 'full') THEN
UPDATE performance_schema.setup_consumers
SET ENABLED = 'YES';
UPDATE performance_schema.setup_instruments
SET ENABLED = 'YES',
TIMED = 'YES';
END IF;
UPDATE performance_schema.threads
SET INSTRUMENTED = 'YES'
WHERE PROCESSLIST_ID <> CONNECTION_ID();
END IF;
SET v_start = UNIX_TIMESTAMP(NOW(2)),
in_interval = IFNULL(in_interval, 30),
in_max_runtime = IFNULL(in_max_runtime, 60);
SET v_banner = REPEAT(
'-',
LEAST(
GREATEST(
36,
CHAR_LENGTH(VERSION()),
CHAR_LENGTH(@@global.version_comment),
CHAR_LENGTH(@@global.version_compile_os),
CHAR_LENGTH(@@global.version_compile_machine),
CHAR_LENGTH(@@global.socket),
CHAR_LENGTH(@@global.datadir)
),
64
)
);
SELECT 'Hostname' AS 'Name', @@global.hostname AS 'Value'
UNION ALL
SELECT 'Port' AS 'Name', @@global.port AS 'Value'
UNION ALL
SELECT 'Socket' AS 'Name', @@global.socket AS 'Value'
UNION ALL
SELECT 'Datadir' AS 'Name', @@global.datadir AS 'Value'
UNION ALL
SELECT REPEAT('-', 23) AS 'Name', v_banner AS 'Value'
UNION ALL
SELECT 'MySQL Version' AS 'Name', VERSION() AS 'Value'
UNION ALL
SELECT 'Sys Schema Version' AS 'Name', (SELECT sys_version FROM sys.version) AS 'Value'
UNION ALL
SELECT 'Version Comment' AS 'Name', @@global.version_comment AS 'Value'
UNION ALL
SELECT 'Version Compile OS' AS 'Name', @@global.version_compile_os AS 'Value'
UNION ALL
SELECT 'Version Compile Machine' AS 'Name', @@global.version_compile_machine AS 'Value'
UNION ALL
SELECT REPEAT('-', 23) AS 'Name', v_banner AS 'Value'
UNION ALL
SELECT 'UTC Time' AS 'Name', UTC_TIMESTAMP() AS 'Value'
UNION ALL
SELECT 'Local Time' AS 'Name', NOW() AS 'Value'
UNION ALL
SELECT 'Time Zone' AS 'Name', @@global.time_zone AS 'Value'
UNION ALL
SELECT 'System Time Zone' AS 'Name', @@global.system_time_zone AS 'Value'
UNION ALL
SELECT 'Time Zone Offset' AS 'Name', TIMEDIFF(NOW(), UTC_TIMESTAMP()) AS 'Value';
SET v_has_innodb = IFNULL((SELECT SUPPORT FROM information_schema.ENGINES WHERE ENGINE = 'InnoDB'), 'NO'),
v_has_ndb = IFNULL((SELECT SUPPORT FROM information_schema.ENGINES WHERE ENGINE = 'NDBCluster'), 'NO'),
v_has_ps = IFNULL((SELECT SUPPORT FROM information_schema.ENGINES WHERE ENGINE = 'PERFORMANCE_SCHEMA'), 'NO'),
v_has_ps_replication = IF(v_has_ps = 'YES'
AND EXISTS(SELECT 1 FROM information_schema.TABLES WHERE TABLE_SCHEMA = 'performance_schema' AND TABLE_NAME = 'replication_applier_status'),
'YES',
'NO'
),
v_has_replication = 'MAYBE',
v_has_metrics = IF(v_has_ps = 'YES' OR (sys.version_major() = 5 AND sys.version_minor() = 6), 'YES', 'NO'),
v_has_ps_vars = 'NO';
IF (@sys.debug = 'ON') THEN
SELECT v_has_innodb AS 'Has_InnoDB', v_has_ndb AS 'Has_NDBCluster',
v_has_ps AS 'Has_Performance_Schema', v_has_ps_vars AS 'Has_P_S_SHOW_Variables',
v_has_metrics AS 'Has_metrics',
v_has_ps_replication 'AS Has_P_S_Replication', v_has_replication AS 'Has_Replication';
END IF;
IF (v_has_innodb IN ('DEFAULT', 'YES')) THEN
SET @sys.diagnostics.sql = 'SHOW ENGINE InnoDB STATUS';
PREPARE stmt_innodb_status FROM @sys.diagnostics.sql;
END IF;
IF (v_has_ps = 'YES') THEN
SET @sys.diagnostics.sql = 'SHOW ENGINE PERFORMANCE_SCHEMA STATUS';
PREPARE stmt_ps_status FROM @sys.diagnostics.sql;
END IF;
IF (v_has_ndb IN ('DEFAULT', 'YES')) THEN
SET @sys.diagnostics.sql = 'SHOW ENGINE NDBCLUSTER STATUS';
PREPARE stmt_ndbcluster_status FROM @sys.diagnostics.sql;
END IF;
SET @sys.diagnostics.sql_gen_query_template = 'SELECT CONCAT(
''SELECT '',
GROUP_CONCAT(
CASE WHEN (SUBSTRING(TABLE_NAME, 3), COLUMN_NAME) IN (
(''io_global_by_file_by_bytes'', ''total''),
(''io_global_by_wait_by_bytes'', ''total_requested'')
)
THEN CONCAT(''sys.format_bytes('', COLUMN_NAME, '') AS '', COLUMN_NAME)
WHEN SUBSTRING(COLUMN_NAME, -8) = ''_latency''
THEN CONCAT(''sys.format_time('', COLUMN_NAME, '') AS '', COLUMN_NAME)
WHEN SUBSTRING(COLUMN_NAME, -7) = ''_memory'' OR SUBSTRING(COLUMN_NAME, -17) = ''_memory_allocated''
OR ((SUBSTRING(COLUMN_NAME, -5) = ''_read'' OR SUBSTRING(COLUMN_NAME, -8) = ''_written'' OR SUBSTRING(COLUMN_NAME, -6) = ''_write'') AND SUBSTRING(COLUMN_NAME, 1, 6) <> ''COUNT_'')
THEN CONCAT(''sys.format_bytes('', COLUMN_NAME, '') AS '', COLUMN_NAME)
ELSE COLUMN_NAME
END
ORDER BY ORDINAL_POSITION
SEPARATOR '',\n ''
),
''\n FROM tmp_'', SUBSTRING(TABLE_NAME FROM 3), ''_%{OUTPUT}''
) AS Query INTO @sys.diagnostics.sql_select
FROM information_schema.COLUMNS
WHERE TABLE_SCHEMA = ''sys'' AND TABLE_NAME = ?
GROUP BY TABLE_NAME';
SET @sys.diagnostics.sql_gen_query_delta = 'SELECT CONCAT(
''SELECT '',
GROUP_CONCAT(
CASE WHEN FIND_IN_SET(COLUMN_NAME, diag.pk)
THEN COLUMN_NAME
WHEN diag.TABLE_NAME = ''io_global_by_file_by_bytes'' AND COLUMN_NAME = ''write_pct''
THEN CONCAT(''IFNULL(ROUND(100-(((e.total_read-IFNULL(s.total_read, 0))'',
''/NULLIF(((e.total_read-IFNULL(s.total_read, 0))+(e.total_written-IFNULL(s.total_written, 0))), 0))*100), 2), 0.00) AS '',
COLUMN_NAME)
WHEN (diag.TABLE_NAME, COLUMN_NAME) IN (
(''io_global_by_file_by_bytes'', ''total''),
(''io_global_by_wait_by_bytes'', ''total_requested'')
)
THEN CONCAT(''sys.format_bytes(e.'', COLUMN_NAME, ''-IFNULL(s.'', COLUMN_NAME, '', 0)) AS '', COLUMN_NAME)
WHEN SUBSTRING(COLUMN_NAME, 1, 4) IN (''max_'', ''min_'') AND SUBSTRING(COLUMN_NAME, -8) = ''_latency''
THEN CONCAT(''sys.format_time(e.'', COLUMN_NAME, '') AS '', COLUMN_NAME)
WHEN COLUMN_NAME = ''avg_latency''
THEN CONCAT(''sys.format_time((e.total_latency - IFNULL(s.total_latency, 0))'',
''/NULLIF(e.total - IFNULL(s.total, 0), 0)) AS '', COLUMN_NAME)
WHEN SUBSTRING(COLUMN_NAME, -12) = ''_avg_latency''
THEN CONCAT(''sys.format_time((e.'', SUBSTRING(COLUMN_NAME FROM 1 FOR CHAR_LENGTH(COLUMN_NAME)-12), ''_latency - IFNULL(s.'', SUBSTRING(COLUMN_NAME FROM 1 FOR CHAR_LENGTH(COLUMN_NAME)-12), ''_latency, 0))'',
''/NULLIF(e.'', SUBSTRING(COLUMN_NAME FROM 1 FOR CHAR_LENGTH(COLUMN_NAME)-12), ''s - IFNULL(s.'', SUBSTRING(COLUMN_NAME FROM 1 FOR CHAR_LENGTH(COLUMN_NAME)-12), ''s, 0), 0)) AS '', COLUMN_NAME)
WHEN SUBSTRING(COLUMN_NAME, -8) = ''_latency''
THEN CONCAT(''sys.format_time(e.'', COLUMN_NAME, '' - IFNULL(s.'', COLUMN_NAME, '', 0)) AS '', COLUMN_NAME)
WHEN COLUMN_NAME IN (''avg_read'', ''avg_write'', ''avg_written'')
THEN CONCAT(''sys.format_bytes(IFNULL((e.total_'', IF(COLUMN_NAME = ''avg_read'', ''read'', ''written''), ''-IFNULL(s.total_'', IF(COLUMN_NAME = ''avg_read'', ''read'', ''written''), '', 0))'',
''/NULLIF(e.count_'', IF(COLUMN_NAME = ''avg_read'', ''read'', ''write''), ''-IFNULL(s.count_'', IF(COLUMN_NAME = ''avg_read'', ''read'', ''write''), '', 0), 0), 0)) AS '',
COLUMN_NAME)
WHEN SUBSTRING(COLUMN_NAME, -7) = ''_memory'' OR SUBSTRING(COLUMN_NAME, -17) = ''_memory_allocated''
OR ((SUBSTRING(COLUMN_NAME, -5) = ''_read'' OR SUBSTRING(COLUMN_NAME, -8) = ''_written'' OR SUBSTRING(COLUMN_NAME, -6) = ''_write'') AND SUBSTRING(COLUMN_NAME, 1, 6) <> ''COUNT_'')
THEN CONCAT(''sys.format_bytes(e.'', COLUMN_NAME, '' - IFNULL(s.'', COLUMN_NAME, '', 0)) AS '', COLUMN_NAME)
ELSE CONCAT(''(e.'', COLUMN_NAME, '' - IFNULL(s.'', COLUMN_NAME, '', 0)) AS '', COLUMN_NAME)
END
ORDER BY ORDINAL_POSITION
SEPARATOR '',\n ''
),
''\n FROM tmp_'', diag.TABLE_NAME, ''_end e
LEFT OUTER JOIN tmp_'', diag.TABLE_NAME, ''_start s USING ('', diag.pk, '')''
) AS Query INTO @sys.diagnostics.sql_select
FROM tmp_sys_views_delta diag
INNER JOIN information_schema.COLUMNS c ON c.TABLE_NAME = CONCAT(''x$'', diag.TABLE_NAME)
WHERE c.TABLE_SCHEMA = ''sys'' AND diag.TABLE_NAME = ?
GROUP BY diag.TABLE_NAME';
IF (v_has_ps = 'YES') THEN
DROP TEMPORARY TABLE IF EXISTS tmp_sys_views_delta;
CREATE TEMPORARY TABLE tmp_sys_views_delta (
TABLE_NAME varchar(64) NOT NULL,
order_by text COMMENT 'ORDER BY clause for the initial and overall views',
order_by_delta text COMMENT 'ORDER BY clause for the delta views',
where_delta text COMMENT 'WHERE clause to use for delta views to only include rows with a "count" > 0',
limit_rows int unsigned COMMENT 'The maximum number of rows to include for the view',
pk varchar(128) COMMENT 'Used with the FIND_IN_SET() function so use comma separated list without whitespace',
PRIMARY KEY (TABLE_NAME)
);
IF (@sys.debug = 'ON') THEN
SELECT 'Populating tmp_sys_views_delta' AS 'Debug';
END IF;
INSERT INTO tmp_sys_views_delta
VALUES ('host_summary' , '%{TABLE}.statement_latency DESC',
'(e.statement_latency-IFNULL(s.statement_latency, 0)) DESC',
'(e.statements - IFNULL(s.statements, 0)) > 0', NULL, 'host'),
('host_summary_by_file_io' , '%{TABLE}.io_latency DESC',
'(e.io_latency-IFNULL(s.io_latency, 0)) DESC',
'(e.ios - IFNULL(s.ios, 0)) > 0', NULL, 'host'),
('host_summary_by_file_io_type' , '%{TABLE}.host, %{TABLE}.total_latency DESC',
'e.host, (e.total_latency-IFNULL(s.total_latency, 0)) DESC',
'(e.total - IFNULL(s.total, 0)) > 0', NULL, 'host,event_name'),
('host_summary_by_stages' , '%{TABLE}.host, %{TABLE}.total_latency DESC',
'e.host, (e.total_latency-IFNULL(s.total_latency, 0)) DESC',
'(e.total - IFNULL(s.total, 0)) > 0', NULL, 'host,event_name'),
('host_summary_by_statement_latency' , '%{TABLE}.total_latency DESC',
'(e.total_latency-IFNULL(s.total_latency, 0)) DESC',
'(e.total - IFNULL(s.total, 0)) > 0', NULL, 'host'),
('host_summary_by_statement_type' , '%{TABLE}.host, %{TABLE}.total_latency DESC',
'e.host, (e.total_latency-IFNULL(s.total_latency, 0)) DESC',
'(e.total - IFNULL(s.total, 0)) > 0', NULL, 'host,statement'),
('io_by_thread_by_latency' , '%{TABLE}.total_latency DESC',
'(e.total_latency-IFNULL(s.total_latency, 0)) DESC',
'(e.total - IFNULL(s.total, 0)) > 0', NULL, 'user,thread_id,processlist_id'),
('io_global_by_file_by_bytes' , '%{TABLE}.total DESC',
'(e.total-IFNULL(s.total, 0)) DESC',
'(e.total - IFNULL(s.total, 0)) > 0', 100, 'file'),
('io_global_by_file_by_latency' , '%{TABLE}.total_latency DESC',
'(e.total_latency-IFNULL(s.total_latency, 0)) DESC',
'(e.total - IFNULL(s.total, 0)) > 0', 100, 'file'),
('io_global_by_wait_by_bytes' , '%{TABLE}.total_requested DESC',
'(e.total_requested-IFNULL(s.total_requested, 0)) DESC',
'(e.total - IFNULL(s.total, 0)) > 0', NULL, 'event_name'),
('io_global_by_wait_by_latency' , '%{TABLE}.total_latency DESC',
'(e.total_latency-IFNULL(s.total_latency, 0)) DESC',
'(e.total - IFNULL(s.total, 0)) > 0', NULL, 'event_name'),
('schema_index_statistics' , '(%{TABLE}.select_latency+%{TABLE}.insert_latency+%{TABLE}.update_latency+%{TABLE}.delete_latency) DESC',
'((e.select_latency+e.insert_latency+e.update_latency+e.delete_latency)-IFNULL(s.select_latency+s.insert_latency+s.update_latency+s.delete_latency, 0)) DESC',
'((e.rows_selected+e.insert_latency+e.rows_updated+e.rows_deleted)-IFNULL(s.rows_selected+s.rows_inserted+s.rows_updated+s.rows_deleted, 0)) > 0',
100, 'table_schema,table_name,index_name'),
('schema_table_statistics' , '%{TABLE}.total_latency DESC',
'(e.total_latency-IFNULL(s.total_latency, 0)) DESC',
'(e.total_latency-IFNULL(s.total_latency, 0)) > 0', 100, 'table_schema,table_name'),
('schema_tables_with_full_table_scans', '%{TABLE}.rows_full_scanned DESC',
'(e.rows_full_scanned-IFNULL(s.rows_full_scanned, 0)) DESC',
'(e.rows_full_scanned-IFNULL(s.rows_full_scanned, 0)) > 0', 100, 'object_schema,object_name'),
('user_summary' , '%{TABLE}.statement_latency DESC',
'(e.statement_latency-IFNULL(s.statement_latency, 0)) DESC',
'(e.statements - IFNULL(s.statements, 0)) > 0', NULL, 'user'),
('user_summary_by_file_io' , '%{TABLE}.io_latency DESC',
'(e.io_latency-IFNULL(s.io_latency, 0)) DESC',
'(e.ios - IFNULL(s.ios, 0)) > 0', NULL, 'user'),
('user_summary_by_file_io_type' , '%{TABLE}.user, %{TABLE}.latency DESC',
'e.user, (e.latency-IFNULL(s.latency, 0)) DESC',
'(e.total - IFNULL(s.total, 0)) > 0', NULL, 'user,event_name'),
('user_summary_by_stages' , '%{TABLE}.user, %{TABLE}.total_latency DESC',
'e.user, (e.total_latency-IFNULL(s.total_latency, 0)) DESC',
'(e.total - IFNULL(s.total, 0)) > 0', NULL, 'user,event_name'),
('user_summary_by_statement_latency' , '%{TABLE}.total_latency DESC',
'(e.total_latency-IFNULL(s.total_latency, 0)) DESC',
'(e.total - IFNULL(s.total, 0)) > 0', NULL, 'user'),
('user_summary_by_statement_type' , '%{TABLE}.user, %{TABLE}.total_latency DESC',
'e.user, (e.total_latency-IFNULL(s.total_latency, 0)) DESC',
'(e.total - IFNULL(s.total, 0)) > 0', NULL, 'user,statement'),
('wait_classes_global_by_avg_latency' , 'IFNULL(%{TABLE}.total_latency / NULLIF(%{TABLE}.total, 0), 0) DESC',
'IFNULL((e.total_latency-IFNULL(s.total_latency, 0)) / NULLIF((e.total - IFNULL(s.total, 0)), 0), 0) DESC',
'(e.total - IFNULL(s.total, 0)) > 0', NULL, 'event_class'),
('wait_classes_global_by_latency' , '%{TABLE}.total_latency DESC',
'(e.total_latency-IFNULL(s.total_latency, 0)) DESC',
'(e.total - IFNULL(s.total, 0)) > 0', NULL, 'event_class'),
('waits_by_host_by_latency' , '%{TABLE}.host, %{TABLE}.total_latency DESC',
'e.host, (e.total_latency-IFNULL(s.total_latency, 0)) DESC',
'(e.total - IFNULL(s.total, 0)) > 0', NULL, 'host,event'),
('waits_by_user_by_latency' , '%{TABLE}.user, %{TABLE}.total_latency DESC',
'e.user, (e.total_latency-IFNULL(s.total_latency, 0)) DESC',
'(e.total - IFNULL(s.total, 0)) > 0', NULL, 'user,event'),
('waits_global_by_latency' , '%{TABLE}.total_latency DESC',
'(e.total_latency-IFNULL(s.total_latency, 0)) DESC',
'(e.total - IFNULL(s.total, 0)) > 0', NULL, 'events')
;
END IF;
SELECT '
=======================
Configuration
=======================
' AS '';
SELECT 'GLOBAL VARIABLES' AS 'The following output is:';
IF (v_has_ps_vars = 'YES') THEN
SELECT LOWER(VARIABLE_NAME) AS Variable_name, VARIABLE_VALUE AS Variable_value FROM performance_schema.global_variables ORDER BY VARIABLE_NAME;
ELSE
SELECT LOWER(VARIABLE_NAME) AS Variable_name, VARIABLE_VALUE AS Variable_value FROM information_schema.GLOBAL_VARIABLES ORDER BY VARIABLE_NAME;
END IF;
IF (v_has_ps = 'YES') THEN
SELECT 'Performance Schema Setup - Actors' AS 'The following output is:';
SELECT * FROM performance_schema.setup_actors;
SELECT 'Performance Schema Setup - Consumers' AS 'The following output is:';
SELECT NAME AS Consumer, ENABLED, sys.ps_is_consumer_enabled(NAME) AS COLLECTS
FROM performance_schema.setup_consumers;
SELECT 'Performance Schema Setup - Instruments' AS 'The following output is:';
SELECT SUBSTRING_INDEX(NAME, '/', 2) AS 'InstrumentClass',
ROUND(100*SUM(IF(ENABLED = 'YES', 1, 0))/COUNT(*), 2) AS 'EnabledPct',
ROUND(100*SUM(IF(TIMED = 'YES', 1, 0))/COUNT(*), 2) AS 'TimedPct'
FROM performance_schema.setup_instruments
GROUP BY SUBSTRING_INDEX(NAME, '/', 2)
ORDER BY SUBSTRING_INDEX(NAME, '/', 2);
SELECT 'Performance Schema Setup - Objects' AS 'The following output is:';
SELECT * FROM performance_schema.setup_objects;
SELECT 'Performance Schema Setup - Threads' AS 'The following output is:';
SELECT `TYPE` AS ThreadType, COUNT(*) AS 'Total', ROUND(100*SUM(IF(INSTRUMENTED = 'YES', 1, 0))/COUNT(*), 2) AS 'InstrumentedPct'
FROM performance_schema.threads
GROUP BY TYPE;
END IF;
IF (v_has_replication = 'NO') THEN
SELECT 'No Replication Configured' AS 'Replication Status';
ELSE
SELECT CONCAT('Replication Configured: ', v_has_replication, ' - Performance Schema Replication Tables: ', v_has_ps_replication) AS 'Replication Status';
IF (v_has_ps_replication = 'YES') THEN
SELECT 'Replication - Connection Configuration' AS 'The following output is:';
SELECT * FROM performance_schema.replication_connection_configuration;
END IF;
IF (v_has_ps_replication = 'YES') THEN
SELECT 'Replication - Applier Configuration' AS 'The following output is:';
SELECT * FROM performance_schema.replication_applier_configuration ORDER BY CHANNEL_NAME;
END IF;
END IF;
IF (v_has_ndb IN ('DEFAULT', 'YES')) THEN
SELECT 'Cluster Thread Blocks' AS 'The following output is:';
SELECT * FROM ndbinfo.threadblocks;
END IF;
IF (v_has_ps = 'YES') THEN
IF (@sys.diagnostics.include_raw = 'ON') THEN
SELECT '
========================
Initial Status
========================
' AS '';
END IF;
DROP TEMPORARY TABLE IF EXISTS tmp_digests_start;
CALL sys.statement_performance_analyzer('create_tmp', 'tmp_digests_start', NULL);
CALL sys.statement_performance_analyzer('snapshot', NULL, NULL);
CALL sys.statement_performance_analyzer('save', 'tmp_digests_start', NULL);
IF (@sys.diagnostics.include_raw = 'ON') THEN
SET @sys.diagnostics.sql = REPLACE(@sys.diagnostics.sql_gen_query_template, '%{OUTPUT}', 'start');
IF (@sys.debug = 'ON') THEN
SELECT 'The following query will be used to generate the query for each sys view' AS 'Debug';
SELECT @sys.diagnostics.sql AS 'Debug';
END IF;
PREPARE stmt_gen_query FROM @sys.diagnostics.sql;
END IF;
SET v_done = FALSE;
OPEN c_sysviews_w_delta;
c_sysviews_w_delta_loop: LOOP
FETCH c_sysviews_w_delta INTO v_table_name;
IF v_done THEN
LEAVE c_sysviews_w_delta_loop;
END IF;
IF (@sys.debug = 'ON') THEN
SELECT CONCAT('The following queries are for storing the initial content of ', v_table_name) AS 'Debug';
END IF;
CALL sys.execute_prepared_stmt(CONCAT('DROP TEMPORARY TABLE IF EXISTS `tmp_', v_table_name, '_start`'));
CALL sys.execute_prepared_stmt(CONCAT('CREATE TEMPORARY TABLE `tmp_', v_table_name, '_start` SELECT * FROM `sys`.`x$', v_table_name, '`'));
IF (@sys.diagnostics.include_raw = 'ON') THEN
SET @sys.diagnostics.table_name = CONCAT('x$', v_table_name);
EXECUTE stmt_gen_query USING @sys.diagnostics.table_name;
SELECT CONCAT(@sys.diagnostics.sql_select,
IF(order_by IS NOT NULL, CONCAT('\n ORDER BY ', REPLACE(order_by, '%{TABLE}', CONCAT('tmp_', v_table_name, '_start'))), ''),
IF(limit_rows IS NOT NULL, CONCAT('\n LIMIT ', limit_rows), '')
)
INTO @sys.diagnostics.sql_select
FROM tmp_sys_views_delta
WHERE TABLE_NAME = v_table_name;
SELECT CONCAT('Initial ', v_table_name) AS 'The following output is:';
CALL sys.execute_prepared_stmt(@sys.diagnostics.sql_select);
END IF;
END LOOP;
CLOSE c_sysviews_w_delta;
IF (@sys.diagnostics.include_raw = 'ON') THEN
DEALLOCATE PREPARE stmt_gen_query;
END IF;
END IF;
SET v_sql_status_summary_select = 'SELECT Variable_name',
v_sql_status_summary_delta = '',
v_sql_status_summary_from = '';
REPEAT
SET v_output_count = v_output_count + 1;
IF (v_output_count > 1) THEN
SET v_sleep = in_interval-(UNIX_TIMESTAMP(NOW(2))-v_iter_start);
SELECT NOW() AS 'Time', CONCAT('Going to sleep for ', v_sleep, ' seconds. Please do not interrupt') AS 'The following output is:';
DO SLEEP(in_interval);
END IF;
SET v_iter_start = UNIX_TIMESTAMP(NOW(2));
SELECT NOW(), CONCAT('Iteration Number ', IFNULL(v_output_count, 'NULL')) AS 'The following output is:';
IF (@@log_bin = 1) THEN
SELECT 'SHOW MASTER STATUS' AS 'The following output is:';
SHOW MASTER STATUS;
END IF;
IF (v_has_replication <> 'NO') THEN
SELECT 'SHOW SLAVE STATUS' AS 'The following output is:';
SHOW SLAVE STATUS;
END IF;
SET v_table_name = CONCAT('tmp_metrics_', v_output_count);
CALL sys.execute_prepared_stmt(CONCAT('DROP TEMPORARY TABLE IF EXISTS ', v_table_name));
CALL sys.execute_prepared_stmt(CONCAT('CREATE TEMPORARY TABLE ', v_table_name, ' (
Variable_name VARCHAR(193) NOT NULL,
Variable_value VARCHAR(1024),
Type VARCHAR(100) NOT NULL,
Enabled ENUM(''YES'', ''NO'', ''PARTIAL'') NOT NULL,
PRIMARY KEY (Type, Variable_name)
) ENGINE = InnoDB DEFAULT CHARSET=utf8'));
IF (v_has_metrics) THEN
SET @sys.diagnostics.sql = CONCAT(
'INSERT INTO ', v_table_name,
' SELECT Variable_name, REPLACE(Variable_value, ''\n'', ''\\\\n'') AS Variable_value, Type, Enabled FROM sys.metrics'
);
ELSE
SET @sys.diagnostics.sql = CONCAT(
'INSERT INTO ', v_table_name,
'(SELECT LOWER(VARIABLE_NAME) AS Variable_name, REPLACE(VARIABLE_VALUE, ''\n'', ''\\\\n'') AS Variable_value,
''Global Status'' AS Type, ''YES'' AS Enabled
FROM performance_schema.global_status
) UNION ALL (
SELECT NAME AS Variable_name, COUNT AS Variable_value,
CONCAT(''InnoDB Metrics - '', SUBSYSTEM) AS Type,
IF(STATUS = ''enabled'', ''YES'', ''NO'') AS Enabled
FROM information_schema.INNODB_METRICS
WHERE NAME NOT IN (
''lock_row_lock_time'', ''lock_row_lock_time_avg'', ''lock_row_lock_time_max'', ''lock_row_lock_waits'',
''buffer_pool_reads'', ''buffer_pool_read_requests'', ''buffer_pool_write_requests'', ''buffer_pool_wait_free'',
''buffer_pool_read_ahead'', ''buffer_pool_read_ahead_evicted'', ''buffer_pool_pages_total'', ''buffer_pool_pages_misc'',
''buffer_pool_pages_data'', ''buffer_pool_bytes_data'', ''buffer_pool_pages_dirty'', ''buffer_pool_bytes_dirty'',
''buffer_pool_pages_free'', ''buffer_pages_created'', ''buffer_pages_written'', ''buffer_pages_read'',
''buffer_data_reads'', ''buffer_data_written'', ''file_num_open_files'',
''os_log_bytes_written'', ''os_log_fsyncs'', ''os_log_pending_fsyncs'', ''os_log_pending_writes'',
''log_waits'', ''log_write_requests'', ''log_writes'', ''innodb_dblwr_writes'', ''innodb_dblwr_pages_written'', ''innodb_page_size'')
) UNION ALL (
SELECT ''NOW()'' AS Variable_name, NOW(3) AS Variable_value, ''System Time'' AS Type, ''YES'' AS Enabled
) UNION ALL (
SELECT ''UNIX_TIMESTAMP()'' AS Variable_name, ROUND(UNIX_TIMESTAMP(NOW(3)), 3) AS Variable_value, ''System Time'' AS Type, ''YES'' AS Enabled
)
ORDER BY Type, Variable_name;'
);
END IF;
CALL sys.execute_prepared_stmt(@sys.diagnostics.sql);
CALL sys.execute_prepared_stmt(
CONCAT('SELECT Variable_value INTO @sys.diagnostics.output_time FROM ', v_table_name, ' WHERE Type = ''System Time'' AND Variable_name = ''UNIX_TIMESTAMP()''')
);
SET v_output_time = @sys.diagnostics.output_time;
SET v_sql_status_summary_select = CONCAT(v_sql_status_summary_select, ',
CONCAT(
LEFT(s', v_output_count, '.Variable_value, ', v_status_summary_width, '),
IF(', REPLACE(v_no_delta_names, '%{COUNT}', v_output_count), ' AND s', v_output_count, '.Variable_value REGEXP ''^[0-9]+(\\\\.[0-9]+)?$'', CONCAT('' ('', ROUND(s', v_output_count, '.Variable_value/', v_output_time, ', 2), ''/sec)''), '''')
) AS ''Output ', v_output_count, ''''),
v_sql_status_summary_from = CONCAT(v_sql_status_summary_from, '
',
IF(v_output_count = 1, ' FROM ', ' INNER JOIN '),
v_table_name, ' s', v_output_count,
IF (v_output_count = 1, '', ' USING (Type, Variable_name)'));
IF (v_output_count > 1) THEN
SET v_sql_status_summary_delta = CONCAT(v_sql_status_summary_delta, ',
IF(', REPLACE(v_no_delta_names, '%{COUNT}', v_output_count), ' AND s', (v_output_count-1), '.Variable_value REGEXP ''^[0-9]+(\\\\.[0-9]+)?$'' AND s', v_output_count, '.Variable_value REGEXP ''^[0-9]+(\\\\.[0-9]+)?$'',
CONCAT(IF(s', (v_output_count-1), '.Variable_value REGEXP ''^[0-9]+\\\\.[0-9]+$'' OR s', v_output_count, '.Variable_value REGEXP ''^[0-9]+\\\\.[0-9]+$'',
ROUND((s', v_output_count, '.Variable_value-s', (v_output_count-1), '.Variable_value), 2),
(s', v_output_count, '.Variable_value-s', (v_output_count-1), '.Variable_value)
),
'' ('', ROUND((s', v_output_count, '.Variable_value-s', (v_output_count-1), '.Variable_value)/(', v_output_time, '-', v_output_time_prev, '), 2), ''/sec)''
),
''''
) AS ''Delta (', (v_output_count-1), ' -> ', v_output_count, ')''');
END IF;
SET v_output_time_prev = v_output_time;
IF (@sys.diagnostics.include_raw = 'ON') THEN
IF (v_has_metrics) THEN
SELECT 'SELECT * FROM sys.metrics' AS 'The following output is:';
ELSE
SELECT 'sys.metrics equivalent' AS 'The following output is:';
END IF;
CALL sys.execute_prepared_stmt(CONCAT('SELECT Type, Variable_name, Enabled, Variable_value FROM ', v_table_name, ' ORDER BY Type, Variable_name'));
END IF;
IF (v_has_innodb IN ('DEFAULT', 'YES')) THEN
SELECT 'SHOW ENGINE INNODB STATUS' AS 'The following output is:';
EXECUTE stmt_innodb_status;
SELECT 'InnoDB - Transactions' AS 'The following output is:';
SELECT * FROM information_schema.INNODB_TRX;
END IF;
IF (v_has_ndb IN ('DEFAULT', 'YES')) THEN
SELECT 'SHOW ENGINE NDBCLUSTER STATUS' AS 'The following output is:';
EXECUTE stmt_ndbcluster_status;
SELECT 'ndbinfo.memoryusage' AS 'The following output is:';
SELECT node_id, memory_type, sys.format_bytes(used) AS used, used_pages, sys.format_bytes(total) AS total, total_pages,
ROUND(100*(used/total), 2) AS 'Used %'
FROM ndbinfo.memoryusage;
SET v_done = FALSE;
OPEN c_ndbinfo;
c_ndbinfo_loop: LOOP
FETCH c_ndbinfo INTO v_table_name;
IF v_done THEN
LEAVE c_ndbinfo_loop;
END IF;
SELECT CONCAT('SELECT * FROM ndbinfo.', v_table_name) AS 'The following output is:';
CALL sys.execute_prepared_stmt(CONCAT('SELECT * FROM `ndbinfo`.`', v_table_name, '`'));
END LOOP;
CLOSE c_ndbinfo;
SELECT * FROM information_schema.FILES;
END IF;
SELECT 'SELECT * FROM sys.processlist' AS 'The following output is:';
SELECT processlist.* FROM sys.processlist;
IF (v_has_ps = 'YES') THEN
IF (sys.ps_is_consumer_enabled('events_waits_history_long') = 'YES') THEN
SELECT 'SELECT * FROM sys.latest_file_io' AS 'The following output is:';
SELECT * FROM sys.latest_file_io;
END IF;
IF (EXISTS(SELECT 1 FROM performance_schema.setup_instruments WHERE NAME LIKE 'memory/%' AND ENABLED = 'YES')) THEN
SELECT 'SELECT * FROM sys.memory_by_host_by_current_bytes' AS 'The following output is:';
SELECT * FROM sys.memory_by_host_by_current_bytes;
SELECT 'SELECT * FROM sys.memory_by_thread_by_current_bytes' AS 'The following output is:';
SELECT * FROM sys.memory_by_thread_by_current_bytes;
SELECT 'SELECT * FROM sys.memory_by_user_by_current_bytes' AS 'The following output is:';
SELECT * FROM sys.memory_by_user_by_current_bytes;
SELECT 'SELECT * FROM sys.memory_global_by_current_bytes' AS 'The following output is:';
SELECT * FROM sys.memory_global_by_current_bytes;
END IF;
END IF;
SET v_runtime = (UNIX_TIMESTAMP(NOW(2)) - v_start);
UNTIL (v_runtime + in_interval >= in_max_runtime) END REPEAT;
IF (v_has_ps = 'YES') THEN
SELECT 'SHOW ENGINE PERFORMANCE_SCHEMA STATUS' AS 'The following output is:';
EXECUTE stmt_ps_status;
END IF;
IF (v_has_innodb IN ('DEFAULT', 'YES')) THEN
DEALLOCATE PREPARE stmt_innodb_status;
END IF;
IF (v_has_ps = 'YES') THEN
DEALLOCATE PREPARE stmt_ps_status;
END IF;
IF (v_has_ndb IN ('DEFAULT', 'YES')) THEN
DEALLOCATE PREPARE stmt_ndbcluster_status;
END IF;
SELECT '
============================
Schema Information
============================
' AS '';
SELECT COUNT(*) AS 'Total Number of Tables' FROM information_schema.TABLES;
IF (@sys.diagnostics.allow_i_s_tables = 'ON') THEN
SELECT 'Storage Engine Usage' AS 'The following output is:';
SELECT ENGINE, COUNT(*) AS NUM_TABLES,
sys.format_bytes(SUM(DATA_LENGTH)) AS DATA_LENGTH,
sys.format_bytes(SUM(INDEX_LENGTH)) AS INDEX_LENGTH,
sys.format_bytes(SUM(DATA_LENGTH+INDEX_LENGTH)) AS TOTAL
FROM information_schema.TABLES
GROUP BY ENGINE;
SELECT 'Schema Object Overview' AS 'The following output is:';
SELECT * FROM sys.schema_object_overview;
SELECT 'Tables without a PRIMARY KEY' AS 'The following output is:';
SELECT TABLES.TABLE_SCHEMA, ENGINE, COUNT(*) AS NumTables
FROM information_schema.TABLES
LEFT OUTER JOIN information_schema.STATISTICS ON STATISTICS.TABLE_SCHEMA = TABLES.TABLE_SCHEMA
AND STATISTICS.TABLE_NAME = TABLES.TABLE_NAME
AND STATISTICS.INDEX_NAME = 'PRIMARY'
WHERE STATISTICS.TABLE_NAME IS NULL
AND TABLES.TABLE_SCHEMA NOT IN ('mysql', 'information_schema', 'performance_schema', 'sys')
AND TABLES.TABLE_TYPE = 'BASE TABLE'
GROUP BY TABLES.TABLE_SCHEMA, ENGINE;
END IF;
IF (v_has_ps = 'YES') THEN
SELECT 'Unused Indexes' AS 'The following output is:';
SELECT object_schema, COUNT(*) AS NumUnusedIndexes
FROM performance_schema.table_io_waits_summary_by_index_usage
WHERE index_name IS NOT NULL
AND count_star = 0
AND object_schema NOT IN ('mysql', 'sys')
AND index_name != 'PRIMARY'
GROUP BY object_schema;
END IF;
IF (v_has_ps = 'YES') THEN
SELECT '
=========================
Overall Status
=========================
' AS '';
SELECT 'CALL sys.ps_statement_avg_latency_histogram()' AS 'The following output is:';
CALL sys.ps_statement_avg_latency_histogram();
CALL sys.statement_performance_analyzer('snapshot', NULL, NULL);
CALL sys.statement_performance_analyzer('overall', NULL, 'with_runtimes_in_95th_percentile');
SET @sys.diagnostics.sql = REPLACE(@sys.diagnostics.sql_gen_query_template, '%{OUTPUT}', 'end');
IF (@sys.debug = 'ON') THEN
SELECT 'The following query will be used to generate the query for each sys view' AS 'Debug';
SELECT @sys.diagnostics.sql AS 'Debug';
END IF;
PREPARE stmt_gen_query FROM @sys.diagnostics.sql;
SET v_done = FALSE;
OPEN c_sysviews_w_delta;
c_sysviews_w_delta_loop: LOOP
FETCH c_sysviews_w_delta INTO v_table_name;
IF v_done THEN
LEAVE c_sysviews_w_delta_loop;
END IF;
IF (@sys.debug = 'ON') THEN
SELECT CONCAT('The following queries are for storing the final content of ', v_table_name) AS 'Debug';
END IF;
CALL sys.execute_prepared_stmt(CONCAT('DROP TEMPORARY TABLE IF EXISTS `tmp_', v_table_name, '_end`'));
CALL sys.execute_prepared_stmt(CONCAT('CREATE TEMPORARY TABLE `tmp_', v_table_name, '_end` SELECT * FROM `sys`.`x$', v_table_name, '`'));
IF (@sys.diagnostics.include_raw = 'ON') THEN
SET @sys.diagnostics.table_name = CONCAT('x$', v_table_name);
EXECUTE stmt_gen_query USING @sys.diagnostics.table_name;
SELECT CONCAT(@sys.diagnostics.sql_select,
IF(order_by IS NOT NULL, CONCAT('\n ORDER BY ', REPLACE(order_by, '%{TABLE}', CONCAT('tmp_', v_table_name, '_end'))), ''),
IF(limit_rows IS NOT NULL, CONCAT('\n LIMIT ', limit_rows), '')
)
INTO @sys.diagnostics.sql_select
FROM tmp_sys_views_delta
WHERE TABLE_NAME = v_table_name;
SELECT CONCAT('Overall ', v_table_name) AS 'The following output is:';
CALL sys.execute_prepared_stmt(@sys.diagnostics.sql_select);
END IF;
END LOOP;
CLOSE c_sysviews_w_delta;
DEALLOCATE PREPARE stmt_gen_query;
SELECT '
======================
Delta Status
======================
' AS '';
CALL sys.statement_performance_analyzer('delta', 'tmp_digests_start', 'with_runtimes_in_95th_percentile');
CALL sys.statement_performance_analyzer('cleanup', NULL, NULL);
DROP TEMPORARY TABLE tmp_digests_start;
IF (@sys.debug = 'ON') THEN
SELECT 'The following query will be used to generate the query for each sys view delta' AS 'Debug';
SELECT @sys.diagnostics.sql_gen_query_delta AS 'Debug';
END IF;
PREPARE stmt_gen_query_delta FROM @sys.diagnostics.sql_gen_query_delta;
SET v_old_group_concat_max_len = @@session.group_concat_max_len;
SET @@session.group_concat_max_len = 2048;
SET v_done = FALSE;
OPEN c_sysviews_w_delta;
c_sysviews_w_delta_loop: LOOP
FETCH c_sysviews_w_delta INTO v_table_name;
IF v_done THEN
LEAVE c_sysviews_w_delta_loop;
END IF;
SET @sys.diagnostics.table_name = v_table_name;
EXECUTE stmt_gen_query_delta USING @sys.diagnostics.table_name;
SELECT CONCAT(@sys.diagnostics.sql_select,
IF(where_delta IS NOT NULL, CONCAT('\n WHERE ', where_delta), ''),
IF(order_by_delta IS NOT NULL, CONCAT('\n ORDER BY ', order_by_delta), ''),
IF(limit_rows IS NOT NULL, CONCAT('\n LIMIT ', limit_rows), '')
)
INTO @sys.diagnostics.sql_select
FROM tmp_sys_views_delta
WHERE TABLE_NAME = v_table_name;
SELECT CONCAT('Delta ', v_table_name) AS 'The following output is:';
CALL sys.execute_prepared_stmt(@sys.diagnostics.sql_select);
CALL sys.execute_prepared_stmt(CONCAT('DROP TEMPORARY TABLE `tmp_', v_table_name, '_end`'));
CALL sys.execute_prepared_stmt(CONCAT('DROP TEMPORARY TABLE `tmp_', v_table_name, '_start`'));
END LOOP;
CLOSE c_sysviews_w_delta;
SET @@session.group_concat_max_len = v_old_group_concat_max_len;
DEALLOCATE PREPARE stmt_gen_query_delta;
DROP TEMPORARY TABLE tmp_sys_views_delta;
END IF;
IF (v_has_metrics) THEN
SELECT 'SELECT * FROM sys.metrics' AS 'The following output is:';
ELSE
SELECT 'sys.metrics equivalent' AS 'The following output is:';
END IF;
CALL sys.execute_prepared_stmt(
CONCAT(v_sql_status_summary_select, v_sql_status_summary_delta, ', Type, s1.Enabled', v_sql_status_summary_from,
'
ORDER BY Type, Variable_name'
)
);
SET v_count = 0;
WHILE (v_count < v_output_count) DO
SET v_count = v_count + 1;
SET v_table_name = CONCAT('tmp_metrics_', v_count);
CALL sys.execute_prepared_stmt(CONCAT('DROP TEMPORARY TABLE IF EXISTS ', v_table_name));
END WHILE;
IF (in_auto_config <> 'current') THEN
CALL sys.ps_setup_reload_saved();
SET sql_log_bin = @log_bin;
END IF;
SET @sys.diagnostics.output_time = NULL,
@sys.diagnostics.sql = NULL,
@sys.diagnostics.sql_gen_query_delta = NULL,
@sys.diagnostics.sql_gen_query_template = NULL,
@sys.diagnostics.sql_select = NULL,
@sys.diagnostics.table_name = NULL;
IF (v_this_thread_enabled = 'YES') THEN
CALL sys.ps_setup_enable_thread(CONNECTION_ID());
END IF;
IF (@log_bin = 1) THEN
SET sql_log_bin = @log_bin;
END IF;
END
|
mariadb.sys@localhost |
2026-04-10 15:41:08 |
2026-04-10 15:41:08 |
|
Description
Create a re... |
utf8mb3 |
utf8mb3_general_ci |
utf8mb3_general_ci |
BEGIN
DECLARE v_start, v_runtime, v_iter_start, v_sleep DECIMAL(20,2) DEFAULT 0.0;
DECLARE v_has_innodb, v_has_ndb, v_has_ps, v_has_replication, v_has_ps_replication VARCHAR(8) CHARSET utf8 DEFAULT 'NO';
DECLARE v_this_thread_enabled, v_has_ps_vars, v_has_metrics ENUM('YES', 'NO');
DECLARE v_table_name, v_banner VARCHAR(64) CHARSET utf8;
DECLARE v_sql_status_summary_select, v_sql_status_summary_delta, v_sql_status_summary_from, v_no_delta_names TEXT;
DECLARE v_output_time, v_output_time_prev DECIMAL(20,3) UNSIGNED;
DECLARE v_output_count, v_count, v_old_group_concat_max_len INT UNSIGNED DEFAULT 0;
DECLARE v_status_summary_width TINYINT UNSIGNED DEFAULT 50;
DECLARE v_done BOOLEAN DEFAULT FALSE;
DECLARE c_ndbinfo CURSOR FOR
SELECT TABLE_NAME
FROM information_schema.TABLES
WHERE TABLE_SCHEMA = 'ndbinfo'
AND TABLE_NAME NOT IN (
'blocks',
'config_params',
'dict_obj_types',
'disk_write_speed_base',
'memory_per_fragment',
'memoryusage',
'operations_per_fragment',
'threadblocks'
);
DECLARE c_sysviews_w_delta CURSOR FOR
SELECT table_name
FROM tmp_sys_views_delta
ORDER BY table_name;
DECLARE CONTINUE HANDLER FOR NOT FOUND SET v_done = TRUE;
SELECT INSTRUMENTED INTO v_this_thread_enabled FROM performance_schema.threads WHERE PROCESSLIST_ID = CONNECTION_ID();
IF (v_this_thread_enabled = 'YES') THEN
CALL sys.ps_setup_disable_thread(CONNECTION_ID());
END IF;
IF (in_max_runtime < in_interval) THEN
SIGNAL SQLSTATE '45000'
SET MESSAGE_TEXT = 'in_max_runtime must be greater than or equal to in_interval';
END IF;
IF (in_max_runtime = 0) THEN
SIGNAL SQLSTATE '45000'
SET MESSAGE_TEXT = 'in_max_runtime must be greater than 0';
END IF;
IF (in_interval = 0) THEN
SIGNAL SQLSTATE '45000'
SET MESSAGE_TEXT = 'in_interval must be greater than 0';
END IF;
IF (@sys.diagnostics.allow_i_s_tables IS NULL) THEN
SET @sys.diagnostics.allow_i_s_tables = sys.sys_get_config('diagnostics.allow_i_s_tables', 'OFF');
END IF;
IF (@sys.diagnostics.include_raw IS NULL) THEN
SET @sys.diagnostics.include_raw = sys.sys_get_config('diagnostics.include_raw' , 'OFF');
END IF;
IF (@sys.debug IS NULL) THEN
SET @sys.debug = sys.sys_get_config('debug' , 'OFF');
END IF;
IF (@sys.statement_truncate_len IS NULL) THEN
SET @sys.statement_truncate_len = sys.sys_get_config('statement_truncate_len' , '64' );
END IF;
SET @log_bin := @@sql_log_bin;
IF (@log_bin = 1) THEN
SET sql_log_bin = 0;
END IF;
SET v_no_delta_names = CONCAT('s%{COUNT}.Variable_name NOT IN (',
'''innodb_buffer_pool_pages_total'', ',
'''innodb_page_size'', ',
'''last_query_cost'', ',
'''last_query_partial_plans'', ',
'''qcache_total_blocks'', ',
'''slave_last_heartbeat'', ',
'''ssl_ctx_verify_depth'', ',
'''ssl_ctx_verify_mode'', ',
'''ssl_session_cache_size'', ',
'''ssl_verify_depth'', ',
'''ssl_verify_mode'', ',
'''ssl_version'', ',
'''buffer_flush_lsn_avg_rate'', ',
'''buffer_flush_pct_for_dirty'', ',
'''buffer_flush_pct_for_lsn'', ',
'''buffer_pool_pages_total'', ',
'''lock_row_lock_time_avg'', ',
'''lock_row_lock_time_max'', ',
'''innodb_page_size''',
')');
IF (in_auto_config <> 'current') THEN
IF (@sys.debug = 'ON') THEN
SELECT CONCAT('Updating Performance Schema configuration to ', in_auto_config) AS 'Debug';
END IF;
CALL sys.ps_setup_save(0);
IF (in_auto_config = 'medium') THEN
UPDATE performance_schema.setup_consumers
SET ENABLED = 'YES'
WHERE NAME NOT LIKE '%\_history%';
UPDATE performance_schema.setup_instruments
SET ENABLED = 'YES',
TIMED = 'YES'
WHERE NAME NOT LIKE 'wait/synch/%';
ELSEIF (in_auto_config = 'full') THEN
UPDATE performance_schema.setup_consumers
SET ENABLED = 'YES';
UPDATE performance_schema.setup_instruments
SET ENABLED = 'YES',
TIMED = 'YES';
END IF;
UPDATE performance_schema.threads
SET INSTRUMENTED = 'YES'
WHERE PROCESSLIST_ID <> CONNECTION_ID();
END IF;
SET v_start = UNIX_TIMESTAMP(NOW(2)),
in_interval = IFNULL(in_interval, 30),
in_max_runtime = IFNULL(in_max_runtime, 60);
SET v_banner = REPEAT(
'-',
LEAST(
GREATEST(
36,
CHAR_LENGTH(VERSION()),
CHAR_LENGTH(@@global.version_comment),
CHAR_LENGTH(@@global.version_compile_os),
CHAR_LENGTH(@@global.version_compile_machine),
CHAR_LENGTH(@@global.socket),
CHAR_LENGTH(@@global.datadir)
),
64
)
);
SELECT 'Hostname' AS 'Name', @@global.hostname AS 'Value'
UNION ALL
SELECT 'Port' AS 'Name', @@global.port AS 'Value'
UNION ALL
SELECT 'Socket' AS 'Name', @@global.socket AS 'Value'
UNION ALL
SELECT 'Datadir' AS 'Name', @@global.datadir AS 'Value'
UNION ALL
SELECT REPEAT('-', 23) AS 'Name', v_banner AS 'Value'
UNION ALL
SELECT 'MySQL Version' AS 'Name', VERSION() AS 'Value'
UNION ALL
SELECT 'Sys Schema Version' AS 'Name', (SELECT sys_version FROM sys.version) AS 'Value'
UNION ALL
SELECT 'Version Comment' AS 'Name', @@global.version_comment AS 'Value'
UNION ALL
SELECT 'Version Compile OS' AS 'Name', @@global.version_compile_os AS 'Value'
UNION ALL
SELECT 'Version Compile Machine' AS 'Name', @@global.version_compile_machine AS 'Value'
UNION ALL
SELECT REPEAT('-', 23) AS 'Name', v_banner AS 'Value'
UNION ALL
SELECT 'UTC Time' AS 'Name', UTC_TIMESTAMP() AS 'Value'
UNION ALL
SELECT 'Local Time' AS 'Name', NOW() AS 'Value'
UNION ALL
SELECT 'Time Zone' AS 'Name', @@global.time_zone AS 'Value'
UNION ALL
SELECT 'System Time Zone' AS 'Name', @@global.system_time_zone AS 'Value'
UNION ALL
SELECT 'Time Zone Offset' AS 'Name', TIMEDIFF(NOW(), UTC_TIMESTAMP()) AS 'Value';
SET v_has_innodb = IFNULL((SELECT SUPPORT FROM information_schema.ENGINES WHERE ENGINE = 'InnoDB'), 'NO'),
v_has_ndb = IFNULL((SELECT SUPPORT FROM information_schema.ENGINES WHERE ENGINE = 'NDBCluster'), 'NO'),
v_has_ps = IFNULL((SELECT SUPPORT FROM information_schema.ENGINES WHERE ENGINE = 'PERFORMANCE_SCHEMA'), 'NO'),
v_has_ps_replication = IF(v_has_ps = 'YES'
AND EXISTS(SELECT 1 FROM information_schema.TABLES WHERE TABLE_SCHEMA = 'performance_schema' AND TABLE_NAME = 'replication_applier_status'),
'YES',
'NO'
),
v_has_replication = 'MAYBE',
v_has_metrics = IF(v_has_ps = 'YES' OR (sys.version_major() = 5 AND sys.version_minor() = 6), 'YES', 'NO'),
v_has_ps_vars = 'NO';
IF (@sys.debug = 'ON') THEN
SELECT v_has_innodb AS 'Has_InnoDB', v_has_ndb AS 'Has_NDBCluster',
v_has_ps AS 'Has_Performance_Schema', v_has_ps_vars AS 'Has_P_S_SHOW_Variables',
v_has_metrics AS 'Has_metrics',
v_has_ps_replication 'AS Has_P_S_Replication', v_has_replication AS 'Has_Replication';
END IF;
IF (v_has_innodb IN ('DEFAULT', 'YES')) THEN
SET @sys.diagnostics.sql = 'SHOW ENGINE InnoDB STATUS';
PREPARE stmt_innodb_status FROM @sys.diagnostics.sql;
END IF;
IF (v_has_ps = 'YES') THEN
SET @sys.diagnostics.sql = 'SHOW ENGINE PERFORMANCE_SCHEMA STATUS';
PREPARE stmt_ps_status FROM @sys.diagnostics.sql;
END IF;
IF (v_has_ndb IN ('DEFAULT', 'YES')) THEN
SET @sys.diagnostics.sql = 'SHOW ENGINE NDBCLUSTER STATUS';
PREPARE stmt_ndbcluster_status FROM @sys.diagnostics.sql;
END IF;
SET @sys.diagnostics.sql_gen_query_template = 'SELECT CONCAT(\n ''SELECT '',\n GROUP_CONCAT(\n CASE WHEN (SUBSTRING(TABLE_NAME, 3), COLUMN_NAME) IN (\n (''io_global_by_file_by_bytes'', ''total''),\n (''io_global_by_wait_by_bytes'', ''total_requested'')\n )\n THEN CONCAT(''sys.format_bytes('', COLUMN_NAME, '') AS '', COLUMN_NAME)\n WHEN SUBSTRING(COLUMN_NAME, -8) = ''_latency''\n THEN CONCAT(''sys.format_time('', COLUMN_NAME, '') AS '', COLUMN_NAME)\n WHEN SUBSTRING(COLUMN_NAME, -7) = ''_memory'' OR SUBSTRING(COLUMN_NAME, -17) = ''_memory_allocated''\n OR ((SUBSTRING(COLUMN_NAME, -5) = ''_read'' OR SUBSTRING(COLUMN_NAME, -8) = ''_written'' OR SUBSTRING(COLUMN_NAME, -6) = ''_write'') AND SUBSTRING(COLUMN_NAME, 1, 6) <> ''COUNT_'')\n THEN CONCAT(''sys.format_bytes('', COLUMN_NAME, '') AS '', COLUMN_NAME)\n ELSE COLUMN_NAME\n END\n ORDER BY ORDINAL_POSITION\n SEPARATOR '',\n ''\n ),\n ''\n FROM tmp_'', SUBSTRING(TABLE_NAME FROM 3), ''_%{OUTPUT}''\n ) AS Query INTO @sys.diagnostics.sql_select\n FROM information_schema.COLUMNS\n WHERE TABLE_SCHEMA = ''sys'' AND TABLE_NAME = ?\n GROUP BY TABLE_NAME';
SET @sys.diagnostics.sql_gen_query_delta = 'SELECT CONCAT(\n ''SELECT '',\n GROUP_CONCAT(\n CASE WHEN FIND_IN_SET(COLUMN_NAME, diag.pk)\n THEN COLUMN_NAME\n WHEN diag.TABLE_NAME = ''io_global_by_file_by_bytes'' AND COLUMN_NAME = ''write_pct''\n THEN CONCAT(''IFNULL(ROUND(100-(((e.total_read-IFNULL(s.total_read, 0))'',\n ''/NULLIF(((e.total_read-IFNULL(s.total_read, 0))+(e.total_written-IFNULL(s.total_written, 0))), 0))*100), 2), 0.00) AS '',\n COLUMN_NAME)\n WHEN (diag.TABLE_NAME, COLUMN_NAME) IN (\n (''io_global_by_file_by_bytes'', ''total''),\n (''io_global_by_wait_by_bytes'', ''total_requested'')\n )\n THEN CONCAT(''sys.format_bytes(e.'', COLUMN_NAME, ''-IFNULL(s.'', COLUMN_NAME, '', 0)) AS '', COLUMN_NAME)\n WHEN SUBSTRING(COLUMN_NAME, 1, 4) IN (''max_'', ''min_'') AND SUBSTRING(COLUMN_NAME, -8) = ''_latency''\n THEN CONCAT(''sys.format_time(e.'', COLUMN_NAME, '') AS '', COLUMN_NAME)\n WHEN COLUMN_NAME = ''avg_latency''\n THEN CONCAT(''sys.format_time((e.total_latency - IFNULL(s.total_latency, 0))'',\n ''/NULLIF(e.total - IFNULL(s.total, 0), 0)) AS '', COLUMN_NAME)\n WHEN SUBSTRING(COLUMN_NAME, -12) = ''_avg_latency''\n THEN CONCAT(''sys.format_time((e.'', SUBSTRING(COLUMN_NAME FROM 1 FOR CHAR_LENGTH(COLUMN_NAME)-12), ''_latency - IFNULL(s.'', SUBSTRING(COLUMN_NAME FROM 1 FOR CHAR_LENGTH(COLUMN_NAME)-12), ''_latency, 0))'',\n ''/NULLIF(e.'', SUBSTRING(COLUMN_NAME FROM 1 FOR CHAR_LENGTH(COLUMN_NAME)-12), ''s - IFNULL(s.'', SUBSTRING(COLUMN_NAME FROM 1 FOR CHAR_LENGTH(COLUMN_NAME)-12), ''s, 0), 0)) AS '', COLUMN_NAME)\n WHEN SUBSTRING(COLUMN_NAME, -8) = ''_latency''\n THEN CONCAT(''sys.format_time(e.'', COLUMN_NAME, '' - IFNULL(s.'', COLUMN_NAME, '', 0)) AS '', COLUMN_NAME)\n WHEN COLUMN_NAME IN (''avg_read'', ''avg_write'', ''avg_written'')\n THEN CONCAT(''sys.format_bytes(IFNULL((e.total_'', IF(COLUMN_NAME = ''avg_read'', ''read'', ''written''), ''-IFNULL(s.total_'', IF(COLUMN_NAME = ''avg_read'', ''read'', ''written''), '', 0))'',\n ''/NULLIF(e.count_'', IF(COLUMN_NAME = ''avg_read'', ''read'', ''write''), ''-IFNULL(s.count_'', IF(COLUMN_NAME = ''avg_read'', ''read'', ''write''), '', 0), 0), 0)) AS '',\n COLUMN_NAME)\n WHEN SUBSTRING(COLUMN_NAME, -7) = ''_memory'' OR SUBSTRING(COLUMN_NAME, -17) = ''_memory_allocated''\n OR ((SUBSTRING(COLUMN_NAME, -5) = ''_read'' OR SUBSTRING(COLUMN_NAME, -8) = ''_written'' OR SUBSTRING(COLUMN_NAME, -6) = ''_write'') AND SUBSTRING(COLUMN_NAME, 1, 6) <> ''COUNT_'')\n THEN CONCAT(''sys.format_bytes(e.'', COLUMN_NAME, '' - IFNULL(s.'', COLUMN_NAME, '', 0)) AS '', COLUMN_NAME)\n ELSE CONCAT(''(e.'', COLUMN_NAME, '' - IFNULL(s.'', COLUMN_NAME, '', 0)) AS '', COLUMN_NAME)\n END\n ORDER BY ORDINAL_POSITION\n SEPARATOR '',\n ''\n ),\n ''\n FROM tmp_'', diag.TABLE_NAME, ''_end e\n LEFT OUTER JOIN tmp_'', diag.TABLE_NAME, ''_start s USING ('', diag.pk, '')''\n ) AS Query INTO @sys.diagnostics.sql_select\n FROM tmp_sys_views_delta diag\n INNER JOIN information_schema.COLUMNS c ON c.TABLE_NAME = CONCAT(''x$'', diag.TABLE_NAME)\n WHERE c.TABLE_SCHEMA = ''sys'' AND diag.TABLE_NAME = ?\n GROUP BY diag.TABLE_NAME';
IF (v_has_ps = 'YES') THEN
DROP TEMPORARY TABLE IF EXISTS tmp_sys_views_delta;
CREATE TEMPORARY TABLE tmp_sys_views_delta (
TABLE_NAME varchar(64) NOT NULL,
order_by text COMMENT 'ORDER BY clause for the initial and overall views',
order_by_delta text COMMENT 'ORDER BY clause for the delta views',
where_delta text COMMENT 'WHERE clause to use for delta views to only include rows with a "count" > 0',
limit_rows int unsigned COMMENT 'The maximum number of rows to include for the view',
pk varchar(128) COMMENT 'Used with the FIND_IN_SET() function so use comma separated list without whitespace',
PRIMARY KEY (TABLE_NAME)
);
IF (@sys.debug = 'ON') THEN
SELECT 'Populating tmp_sys_views_delta' AS 'Debug';
END IF;
INSERT INTO tmp_sys_views_delta
VALUES ('host_summary' , '%{TABLE}.statement_latency DESC',
'(e.statement_latency-IFNULL(s.statement_latency, 0)) DESC',
'(e.statements - IFNULL(s.statements, 0)) > 0', NULL, 'host'),
('host_summary_by_file_io' , '%{TABLE}.io_latency DESC',
'(e.io_latency-IFNULL(s.io_latency, 0)) DESC',
'(e.ios - IFNULL(s.ios, 0)) > 0', NULL, 'host'),
('host_summary_by_file_io_type' , '%{TABLE}.host, %{TABLE}.total_latency DESC',
'e.host, (e.total_latency-IFNULL(s.total_latency, 0)) DESC',
'(e.total - IFNULL(s.total, 0)) > 0', NULL, 'host,event_name'),
('host_summary_by_stages' , '%{TABLE}.host, %{TABLE}.total_latency DESC',
'e.host, (e.total_latency-IFNULL(s.total_latency, 0)) DESC',
'(e.total - IFNULL(s.total, 0)) > 0', NULL, 'host,event_name'),
('host_summary_by_statement_latency' , '%{TABLE}.total_latency DESC',
'(e.total_latency-IFNULL(s.total_latency, 0)) DESC',
'(e.total - IFNULL(s.total, 0)) > 0', NULL, 'host'),
('host_summary_by_statement_type' , '%{TABLE}.host, %{TABLE}.total_latency DESC',
'e.host, (e.total_latency-IFNULL(s.total_latency, 0)) DESC',
'(e.total - IFNULL(s.total, 0)) > 0', NULL, 'host,statement'),
('io_by_thread_by_latency' , '%{TABLE}.total_latency DESC',
'(e.total_latency-IFNULL(s.total_latency, 0)) DESC',
'(e.total - IFNULL(s.total, 0)) > 0', NULL, 'user,thread_id,processlist_id'),
('io_global_by_file_by_bytes' , '%{TABLE}.total DESC',
'(e.total-IFNULL(s.total, 0)) DESC',
'(e.total - IFNULL(s.total, 0)) > 0', 100, 'file'),
('io_global_by_file_by_latency' , '%{TABLE}.total_latency DESC',
'(e.total_latency-IFNULL(s.total_latency, 0)) DESC',
'(e.total - IFNULL(s.total, 0)) > 0', 100, 'file'),
('io_global_by_wait_by_bytes' , '%{TABLE}.total_requested DESC',
'(e.total_requested-IFNULL(s.total_requested, 0)) DESC',
'(e.total - IFNULL(s.total, 0)) > 0', NULL, 'event_name'),
('io_global_by_wait_by_latency' , '%{TABLE}.total_latency DESC',
'(e.total_latency-IFNULL(s.total_latency, 0)) DESC',
'(e.total - IFNULL(s.total, 0)) > 0', NULL, 'event_name'),
('schema_index_statistics' , '(%{TABLE}.select_latency+%{TABLE}.insert_latency+%{TABLE}.update_latency+%{TABLE}.delete_latency) DESC',
'((e.select_latency+e.insert_latency+e.update_latency+e.delete_latency)-IFNULL(s.select_latency+s.insert_latency+s.update_latency+s.delete_latency, 0)) DESC',
'((e.rows_selected+e.insert_latency+e.rows_updated+e.rows_deleted)-IFNULL(s.rows_selected+s.rows_inserted+s.rows_updated+s.rows_deleted, 0)) > 0',
100, 'table_schema,table_name,index_name'),
('schema_table_statistics' , '%{TABLE}.total_latency DESC',
'(e.total_latency-IFNULL(s.total_latency, 0)) DESC',
'(e.total_latency-IFNULL(s.total_latency, 0)) > 0', 100, 'table_schema,table_name'),
('schema_tables_with_full_table_scans', '%{TABLE}.rows_full_scanned DESC',
'(e.rows_full_scanned-IFNULL(s.rows_full_scanned, 0)) DESC',
'(e.rows_full_scanned-IFNULL(s.rows_full_scanned, 0)) > 0', 100, 'object_schema,object_name'),
('user_summary' , '%{TABLE}.statement_latency DESC',
'(e.statement_latency-IFNULL(s.statement_latency, 0)) DESC',
'(e.statements - IFNULL(s.statements, 0)) > 0', NULL, 'user'),
('user_summary_by_file_io' , '%{TABLE}.io_latency DESC',
'(e.io_latency-IFNULL(s.io_latency, 0)) DESC',
'(e.ios - IFNULL(s.ios, 0)) > 0', NULL, 'user'),
('user_summary_by_file_io_type' , '%{TABLE}.user, %{TABLE}.latency DESC',
'e.user, (e.latency-IFNULL(s.latency, 0)) DESC',
'(e.total - IFNULL(s.total, 0)) > 0', NULL, 'user,event_name'),
('user_summary_by_stages' , '%{TABLE}.user, %{TABLE}.total_latency DESC',
'e.user, (e.total_latency-IFNULL(s.total_latency, 0)) DESC',
'(e.total - IFNULL(s.total, 0)) > 0', NULL, 'user,event_name'),
('user_summary_by_statement_latency' , '%{TABLE}.total_latency DESC',
'(e.total_latency-IFNULL(s.total_latency, 0)) DESC',
'(e.total - IFNULL(s.total, 0)) > 0', NULL, 'user'),
('user_summary_by_statement_type' , '%{TABLE}.user, %{TABLE}.total_latency DESC',
'e.user, (e.total_latency-IFNULL(s.total_latency, 0)) DESC',
'(e.total - IFNULL(s.total, 0)) > 0', NULL, 'user,statement'),
('wait_classes_global_by_avg_latency' , 'IFNULL(%{TABLE}.total_latency / NULLIF(%{TABLE}.total, 0), 0) DESC',
'IFNULL((e.total_latency-IFNULL(s.total_latency, 0)) / NULLIF((e.total - IFNULL(s.total, 0)), 0), 0) DESC',
'(e.total - IFNULL(s.total, 0)) > 0', NULL, 'event_class'),
('wait_classes_global_by_latency' , '%{TABLE}.total_latency DESC',
'(e.total_latency-IFNULL(s.total_latency, 0)) DESC',
'(e.total - IFNULL(s.total, 0)) > 0', NULL, 'event_class'),
('waits_by_host_by_latency' , '%{TABLE}.host, %{TABLE}.total_latency DESC',
'e.host, (e.total_latency-IFNULL(s.total_latency, 0)) DESC',
'(e.total - IFNULL(s.total, 0)) > 0', NULL, 'host,event'),
('waits_by_user_by_latency' , '%{TABLE}.user, %{TABLE}.total_latency DESC',
'e.user, (e.total_latency-IFNULL(s.total_latency, 0)) DESC',
'(e.total - IFNULL(s.total, 0)) > 0', NULL, 'user,event'),
('waits_global_by_latency' , '%{TABLE}.total_latency DESC',
'(e.total_latency-IFNULL(s.total_latency, 0)) DESC',
'(e.total - IFNULL(s.total, 0)) > 0', NULL, 'events')
;
END IF;
SELECT '\n=======================\n Configuration\n=======================\n' AS '';
SELECT 'GLOBAL VARIABLES' AS 'The following output is:';
IF (v_has_ps_vars = 'YES') THEN
SELECT LOWER(VARIABLE_NAME) AS Variable_name, VARIABLE_VALUE AS Variable_value FROM performance_schema.global_variables ORDER BY VARIABLE_NAME;
ELSE
SELECT LOWER(VARIABLE_NAME) AS Variable_name, VARIABLE_VALUE AS Variable_value FROM information_schema.GLOBAL_VARIABLES ORDER BY VARIABLE_NAME;
END IF;
IF (v_has_ps = 'YES') THEN
SELECT 'Performance Schema Setup - Actors' AS 'The following output is:';
SELECT * FROM performance_schema.setup_actors;
SELECT 'Performance Schema Setup - Consumers' AS 'The following output is:';
SELECT NAME AS Consumer, ENABLED, sys.ps_is_consumer_enabled(NAME) AS COLLECTS
FROM performance_schema.setup_consumers;
SELECT 'Performance Schema Setup - Instruments' AS 'The following output is:';
SELECT SUBSTRING_INDEX(NAME, '/', 2) AS 'InstrumentClass',
ROUND(100*SUM(IF(ENABLED = 'YES', 1, 0))/COUNT(*), 2) AS 'EnabledPct',
ROUND(100*SUM(IF(TIMED = 'YES', 1, 0))/COUNT(*), 2) AS 'TimedPct'
FROM performance_schema.setup_instruments
GROUP BY SUBSTRING_INDEX(NAME, '/', 2)
ORDER BY SUBSTRING_INDEX(NAME, '/', 2);
SELECT 'Performance Schema Setup - Objects' AS 'The following output is:';
SELECT * FROM performance_schema.setup_objects;
SELECT 'Performance Schema Setup - Threads' AS 'The following output is:';
SELECT `TYPE` AS ThreadType, COUNT(*) AS 'Total', ROUND(100*SUM(IF(INSTRUMENTED = 'YES', 1, 0))/COUNT(*), 2) AS 'InstrumentedPct'
FROM performance_schema.threads
GROUP BY TYPE;
END IF;
IF (v_has_replication = 'NO') THEN
SELECT 'No Replication Configured' AS 'Replication Status';
ELSE
SELECT CONCAT('Replication Configured: ', v_has_replication, ' - Performance Schema Replication Tables: ', v_has_ps_replication) AS 'Replication Status';
IF (v_has_ps_replication = 'YES') THEN
SELECT 'Replication - Connection Configuration' AS 'The following output is:';
SELECT * FROM performance_schema.replication_connection_configuration;
END IF;
IF (v_has_ps_replication = 'YES') THEN
SELECT 'Replication - Applier Configuration' AS 'The following output is:';
SELECT * FROM performance_schema.replication_applier_configuration ORDER BY CHANNEL_NAME;
END IF;
END IF;
IF (v_has_ndb IN ('DEFAULT', 'YES')) THEN
SELECT 'Cluster Thread Blocks' AS 'The following output is:';
SELECT * FROM ndbinfo.threadblocks;
END IF;
IF (v_has_ps = 'YES') THEN
IF (@sys.diagnostics.include_raw = 'ON') THEN
SELECT '\n========================\n Initial Status\n========================\n' AS '';
END IF;
DROP TEMPORARY TABLE IF EXISTS tmp_digests_start;
CALL sys.statement_performance_analyzer('create_tmp', 'tmp_digests_start', NULL);
CALL sys.statement_performance_analyzer('snapshot', NULL, NULL);
CALL sys.statement_performance_analyzer('save', 'tmp_digests_start', NULL);
IF (@sys.diagnostics.include_raw = 'ON') THEN
SET @sys.diagnostics.sql = REPLACE(@sys.diagnostics.sql_gen_query_template, '%{OUTPUT}', 'start');
IF (@sys.debug = 'ON') THEN
SELECT 'The following query will be used to generate the query for each sys view' AS 'Debug';
SELECT @sys.diagnostics.sql AS 'Debug';
END IF;
PREPARE stmt_gen_query FROM @sys.diagnostics.sql;
END IF;
SET v_done = FALSE;
OPEN c_sysviews_w_delta;
c_sysviews_w_delta_loop: LOOP
FETCH c_sysviews_w_delta INTO v_table_name;
IF v_done THEN
LEAVE c_sysviews_w_delta_loop;
END IF;
IF (@sys.debug = 'ON') THEN
SELECT CONCAT('The following queries are for storing the initial content of ', v_table_name) AS 'Debug';
END IF;
CALL sys.execute_prepared_stmt(CONCAT('DROP TEMPORARY TABLE IF EXISTS `tmp_', v_table_name, '_start`'));
CALL sys.execute_prepared_stmt(CONCAT('CREATE TEMPORARY TABLE `tmp_', v_table_name, '_start` SELECT * FROM `sys`.`x$', v_table_name, '`'));
IF (@sys.diagnostics.include_raw = 'ON') THEN
SET @sys.diagnostics.table_name = CONCAT('x$', v_table_name);
EXECUTE stmt_gen_query USING @sys.diagnostics.table_name;
SELECT CONCAT(@sys.diagnostics.sql_select,
IF(order_by IS NOT NULL, CONCAT('\n ORDER BY ', REPLACE(order_by, '%{TABLE}', CONCAT('tmp_', v_table_name, '_start'))), ''),
IF(limit_rows IS NOT NULL, CONCAT('\n LIMIT ', limit_rows), '')
)
INTO @sys.diagnostics.sql_select
FROM tmp_sys_views_delta
WHERE TABLE_NAME = v_table_name;
SELECT CONCAT('Initial ', v_table_name) AS 'The following output is:';
CALL sys.execute_prepared_stmt(@sys.diagnostics.sql_select);
END IF;
END LOOP;
CLOSE c_sysviews_w_delta;
IF (@sys.diagnostics.include_raw = 'ON') THEN
DEALLOCATE PREPARE stmt_gen_query;
END IF;
END IF;
SET v_sql_status_summary_select = 'SELECT Variable_name',
v_sql_status_summary_delta = '',
v_sql_status_summary_from = '';
REPEAT
SET v_output_count = v_output_count + 1;
IF (v_output_count > 1) THEN
SET v_sleep = in_interval-(UNIX_TIMESTAMP(NOW(2))-v_iter_start);
SELECT NOW() AS 'Time', CONCAT('Going to sleep for ', v_sleep, ' seconds. Please do not interrupt') AS 'The following output is:';
DO SLEEP(in_interval);
END IF;
SET v_iter_start = UNIX_TIMESTAMP(NOW(2));
SELECT NOW(), CONCAT('Iteration Number ', IFNULL(v_output_count, 'NULL')) AS 'The following output is:';
IF (@@log_bin = 1) THEN
SELECT 'SHOW MASTER STATUS' AS 'The following output is:';
SHOW MASTER STATUS;
END IF;
IF (v_has_replication <> 'NO') THEN
SELECT 'SHOW SLAVE STATUS' AS 'The following output is:';
SHOW SLAVE STATUS;
END IF;
SET v_table_name = CONCAT('tmp_metrics_', v_output_count);
CALL sys.execute_prepared_stmt(CONCAT('DROP TEMPORARY TABLE IF EXISTS ', v_table_name));
CALL sys.execute_prepared_stmt(CONCAT('CREATE TEMPORARY TABLE ', v_table_name, ' (\n Variable_name VARCHAR(193) NOT NULL,\n Variable_value VARCHAR(1024),\n Type VARCHAR(100) NOT NULL,\n Enabled ENUM(''YES'', ''NO'', ''PARTIAL'') NOT NULL,\n PRIMARY KEY (Type, Variable_name)\n) ENGINE = InnoDB DEFAULT CHARSET=utf8'));
IF (v_has_metrics) THEN
SET @sys.diagnostics.sql = CONCAT(
'INSERT INTO ', v_table_name,
' SELECT Variable_name, REPLACE(Variable_value, ''\n'', ''\\n'') AS Variable_value, Type, Enabled FROM sys.metrics'
);
ELSE
SET @sys.diagnostics.sql = CONCAT(
'INSERT INTO ', v_table_name,
'(SELECT LOWER(VARIABLE_NAME) AS Variable_name, REPLACE(VARIABLE_VALUE, ''\n'', ''\\n'') AS Variable_value,\n ''Global Status'' AS Type, ''YES'' AS Enabled\n FROM performance_schema.global_status\n) UNION ALL (\nSELECT NAME AS Variable_name, COUNT AS Variable_value,\n CONCAT(''InnoDB Metrics - '', SUBSYSTEM) AS Type,\n IF(STATUS = ''enabled'', ''YES'', ''NO'') AS Enabled\n FROM information_schema.INNODB_METRICS\n WHERE NAME NOT IN (\n ''lock_row_lock_time'', ''lock_row_lock_time_avg'', ''lock_row_lock_time_max'', ''lock_row_lock_waits'',\n ''buffer_pool_reads'', ''buffer_pool_read_requests'', ''buffer_pool_write_requests'', ''buffer_pool_wait_free'',\n ''buffer_pool_read_ahead'', ''buffer_pool_read_ahead_evicted'', ''buffer_pool_pages_total'', ''buffer_pool_pages_misc'',\n ''buffer_pool_pages_data'', ''buffer_pool_bytes_data'', ''buffer_pool_pages_dirty'', ''buffer_pool_bytes_dirty'',\n ''buffer_pool_pages_free'', ''buffer_pages_created'', ''buffer_pages_written'', ''buffer_pages_read'',\n ''buffer_data_reads'', ''buffer_data_written'', ''file_num_open_files'',\n ''os_log_bytes_written'', ''os_log_fsyncs'', ''os_log_pending_fsyncs'', ''os_log_pending_writes'',\n ''log_waits'', ''log_write_requests'', ''log_writes'', ''innodb_dblwr_writes'', ''innodb_dblwr_pages_written'', ''innodb_page_size'')\n) UNION ALL (\nSELECT ''NOW()'' AS Variable_name, NOW(3) AS Variable_value, ''System Time'' AS Type, ''YES'' AS Enabled\n) UNION ALL (\nSELECT ''UNIX_TIMESTAMP()'' AS Variable_name, ROUND(UNIX_TIMESTAMP(NOW(3)), 3) AS Variable_value, ''System Time'' AS Type, ''YES'' AS Enabled\n)\n ORDER BY Type, Variable_name;'
);
END IF;
CALL sys.execute_prepared_stmt(@sys.diagnostics.sql);
CALL sys.execute_prepared_stmt(
CONCAT('SELECT Variable_value INTO @sys.diagnostics.output_time FROM ', v_table_name, ' WHERE Type = ''System Time'' AND Variable_name = ''UNIX_TIMESTAMP()''')
);
SET v_output_time = @sys.diagnostics.output_time;
SET v_sql_status_summary_select = CONCAT(v_sql_status_summary_select, ',\n CONCAT(\n LEFT(s', v_output_count, '.Variable_value, ', v_status_summary_width, '),\n IF(', REPLACE(v_no_delta_names, '%{COUNT}', v_output_count), ' AND s', v_output_count, '.Variable_value REGEXP ''^[0-9]+(\\.[0-9]+)?$'', CONCAT('' ('', ROUND(s', v_output_count, '.Variable_value/', v_output_time, ', 2), ''/sec)''), '''')\n ) AS ''Output ', v_output_count, ''''),
v_sql_status_summary_from = CONCAT(v_sql_status_summary_from, '\n',
IF(v_output_count = 1, ' FROM ', ' INNER JOIN '),
v_table_name, ' s', v_output_count,
IF (v_output_count = 1, '', ' USING (Type, Variable_name)'));
IF (v_output_count > 1) THEN
SET v_sql_status_summary_delta = CONCAT(v_sql_status_summary_delta, ',\n IF(', REPLACE(v_no_delta_names, '%{COUNT}', v_output_count), ' AND s', (v_output_count-1), '.Variable_value REGEXP ''^[0-9]+(\\.[0-9]+)?$'' AND s', v_output_count, '.Variable_value REGEXP ''^[0-9]+(\\.[0-9]+)?$'',\n CONCAT(IF(s', (v_output_count-1), '.Variable_value REGEXP ''^[0-9]+\\.[0-9]+$'' OR s', v_output_count, '.Variable_value REGEXP ''^[0-9]+\\.[0-9]+$'',\n ROUND((s', v_output_count, '.Variable_value-s', (v_output_count-1), '.Variable_value), 2),\n (s', v_output_count, '.Variable_value-s', (v_output_count-1), '.Variable_value)\n ),\n '' ('', ROUND((s', v_output_count, '.Variable_value-s', (v_output_count-1), '.Variable_value)/(', v_output_time, '-', v_output_time_prev, '), 2), ''/sec)''\n ),\n ''''\n ) AS ''Delta (', (v_output_count-1), ' -> ', v_output_count, ')''');
END IF;
SET v_output_time_prev = v_output_time;
IF (@sys.diagnostics.include_raw = 'ON') THEN
IF (v_has_metrics) THEN
SELECT 'SELECT * FROM sys.metrics' AS 'The following output is:';
ELSE
SELECT 'sys.metrics equivalent' AS 'The following output is:';
END IF;
CALL sys.execute_prepared_stmt(CONCAT('SELECT Type, Variable_name, Enabled, Variable_value FROM ', v_table_name, ' ORDER BY Type, Variable_name'));
END IF;
IF (v_has_innodb IN ('DEFAULT', 'YES')) THEN
SELECT 'SHOW ENGINE INNODB STATUS' AS 'The following output is:';
EXECUTE stmt_innodb_status;
SELECT 'InnoDB - Transactions' AS 'The following output is:';
SELECT * FROM information_schema.INNODB_TRX;
END IF;
IF (v_has_ndb IN ('DEFAULT', 'YES')) THEN
SELECT 'SHOW ENGINE NDBCLUSTER STATUS' AS 'The following output is:';
EXECUTE stmt_ndbcluster_status;
SELECT 'ndbinfo.memoryusage' AS 'The following output is:';
SELECT node_id, memory_type, sys.format_bytes(used) AS used, used_pages, sys.format_bytes(total) AS total, total_pages,
ROUND(100*(used/total), 2) AS 'Used %'
FROM ndbinfo.memoryusage;
SET v_done = FALSE;
OPEN c_ndbinfo;
c_ndbinfo_loop: LOOP
FETCH c_ndbinfo INTO v_table_name;
IF v_done THEN
LEAVE c_ndbinfo_loop;
END IF;
SELECT CONCAT('SELECT * FROM ndbinfo.', v_table_name) AS 'The following output is:';
CALL sys.execute_prepared_stmt(CONCAT('SELECT * FROM `ndbinfo`.`', v_table_name, '`'));
END LOOP;
CLOSE c_ndbinfo;
SELECT * FROM information_schema.FILES;
END IF;
SELECT 'SELECT * FROM sys.processlist' AS 'The following output is:';
SELECT processlist.* FROM sys.processlist;
IF (v_has_ps = 'YES') THEN
IF (sys.ps_is_consumer_enabled('events_waits_history_long') = 'YES') THEN
SELECT 'SELECT * FROM sys.latest_file_io' AS 'The following output is:';
SELECT * FROM sys.latest_file_io;
END IF;
IF (EXISTS(SELECT 1 FROM performance_schema.setup_instruments WHERE NAME LIKE 'memory/%' AND ENABLED = 'YES')) THEN
SELECT 'SELECT * FROM sys.memory_by_host_by_current_bytes' AS 'The following output is:';
SELECT * FROM sys.memory_by_host_by_current_bytes;
SELECT 'SELECT * FROM sys.memory_by_thread_by_current_bytes' AS 'The following output is:';
SELECT * FROM sys.memory_by_thread_by_current_bytes;
SELECT 'SELECT * FROM sys.memory_by_user_by_current_bytes' AS 'The following output is:';
SELECT * FROM sys.memory_by_user_by_current_bytes;
SELECT 'SELECT * FROM sys.memory_global_by_current_bytes' AS 'The following output is:';
SELECT * FROM sys.memory_global_by_current_bytes;
END IF;
END IF;
SET v_runtime = (UNIX_TIMESTAMP(NOW(2)) - v_start);
UNTIL (v_runtime + in_interval >= in_max_runtime) END REPEAT;
IF (v_has_ps = 'YES') THEN
SELECT 'SHOW ENGINE PERFORMANCE_SCHEMA STATUS' AS 'The following output is:';
EXECUTE stmt_ps_status;
END IF;
IF (v_has_innodb IN ('DEFAULT', 'YES')) THEN
DEALLOCATE PREPARE stmt_innodb_status;
END IF;
IF (v_has_ps = 'YES') THEN
DEALLOCATE PREPARE stmt_ps_status;
END IF;
IF (v_has_ndb IN ('DEFAULT', 'YES')) THEN
DEALLOCATE PREPARE stmt_ndbcluster_status;
END IF;
SELECT '\n============================\n Schema Information\n============================\n' AS '';
SELECT COUNT(*) AS 'Total Number of Tables' FROM information_schema.TABLES;
IF (@sys.diagnostics.allow_i_s_tables = 'ON') THEN
SELECT 'Storage Engine Usage' AS 'The following output is:';
SELECT ENGINE, COUNT(*) AS NUM_TABLES,
sys.format_bytes(SUM(DATA_LENGTH)) AS DATA_LENGTH,
sys.format_bytes(SUM(INDEX_LENGTH)) AS INDEX_LENGTH,
sys.format_bytes(SUM(DATA_LENGTH+INDEX_LENGTH)) AS TOTAL
FROM information_schema.TABLES
GROUP BY ENGINE;
SELECT 'Schema Object Overview' AS 'The following output is:';
SELECT * FROM sys.schema_object_overview;
SELECT 'Tables without a PRIMARY KEY' AS 'The following output is:';
SELECT TABLES.TABLE_SCHEMA, ENGINE, COUNT(*) AS NumTables
FROM information_schema.TABLES
LEFT OUTER JOIN information_schema.STATISTICS ON STATISTICS.TABLE_SCHEMA = TABLES.TABLE_SCHEMA
AND STATISTICS.TABLE_NAME = TABLES.TABLE_NAME
AND STATISTICS.INDEX_NAME = 'PRIMARY'
WHERE STATISTICS.TABLE_NAME IS NULL
AND TABLES.TABLE_SCHEMA NOT IN ('mysql', 'information_schema', 'performance_schema', 'sys')
AND TABLES.TABLE_TYPE = 'BASE TABLE'
GROUP BY TABLES.TABLE_SCHEMA, ENGINE;
END IF;
IF (v_has_ps = 'YES') THEN
SELECT 'Unused Indexes' AS 'The following output is:';
SELECT object_schema, COUNT(*) AS NumUnusedIndexes
FROM performance_schema.table_io_waits_summary_by_index_usage
WHERE index_name IS NOT NULL
AND count_star = 0
AND object_schema NOT IN ('mysql', 'sys')
AND index_name != 'PRIMARY'
GROUP BY object_schema;
END IF;
IF (v_has_ps = 'YES') THEN
SELECT '\n=========================\n Overall Status\n=========================\n' AS '';
SELECT 'CALL sys.ps_statement_avg_latency_histogram()' AS 'The following output is:';
CALL sys.ps_statement_avg_latency_histogram();
CALL sys.statement_performance_analyzer('snapshot', NULL, NULL);
CALL sys.statement_performance_analyzer('overall', NULL, 'with_runtimes_in_95th_percentile');
SET @sys.diagnostics.sql = REPLACE(@sys.diagnostics.sql_gen_query_template, '%{OUTPUT}', 'end');
IF (@sys.debug = 'ON') THEN
SELECT 'The following query will be used to generate the query for each sys view' AS 'Debug';
SELECT @sys.diagnostics.sql AS 'Debug';
END IF;
PREPARE stmt_gen_query FROM @sys.diagnostics.sql;
SET v_done = FALSE;
OPEN c_sysviews_w_delta;
c_sysviews_w_delta_loop: LOOP
FETCH c_sysviews_w_delta INTO v_table_name;
IF v_done THEN
LEAVE c_sysviews_w_delta_loop;
END IF;
IF (@sys.debug = 'ON') THEN
SELECT CONCAT('The following queries are for storing the final content of ', v_table_name) AS 'Debug';
END IF;
CALL sys.execute_prepared_stmt(CONCAT('DROP TEMPORARY TABLE IF EXISTS `tmp_', v_table_name, '_end`'));
CALL sys.execute_prepared_stmt(CONCAT('CREATE TEMPORARY TABLE `tmp_', v_table_name, '_end` SELECT * FROM `sys`.`x$', v_table_name, '`'));
IF (@sys.diagnostics.include_raw = 'ON') THEN
SET @sys.diagnostics.table_name = CONCAT('x$', v_table_name);
EXECUTE stmt_gen_query USING @sys.diagnostics.table_name;
SELECT CONCAT(@sys.diagnostics.sql_select,
IF(order_by IS NOT NULL, CONCAT('\n ORDER BY ', REPLACE(order_by, '%{TABLE}', CONCAT('tmp_', v_table_name, '_end'))), ''),
IF(limit_rows IS NOT NULL, CONCAT('\n LIMIT ', limit_rows), '')
)
INTO @sys.diagnostics.sql_select
FROM tmp_sys_views_delta
WHERE TABLE_NAME = v_table_name;
SELECT CONCAT('Overall ', v_table_name) AS 'The following output is:';
CALL sys.execute_prepared_stmt(@sys.diagnostics.sql_select);
END IF;
END LOOP;
CLOSE c_sysviews_w_delta;
DEALLOCATE PREPARE stmt_gen_query;
SELECT '\n======================\n Delta Status\n======================\n' AS '';
CALL sys.statement_performance_analyzer('delta', 'tmp_digests_start', 'with_runtimes_in_95th_percentile');
CALL sys.statement_performance_analyzer('cleanup', NULL, NULL);
DROP TEMPORARY TABLE tmp_digests_start;
IF (@sys.debug = 'ON') THEN
SELECT 'The following query will be used to generate the query for each sys view delta' AS 'Debug';
SELECT @sys.diagnostics.sql_gen_query_delta AS 'Debug';
END IF;
PREPARE stmt_gen_query_delta FROM @sys.diagnostics.sql_gen_query_delta;
SET v_old_group_concat_max_len = @@session.group_concat_max_len;
SET @@session.group_concat_max_len = 2048;
SET v_done = FALSE;
OPEN c_sysviews_w_delta;
c_sysviews_w_delta_loop: LOOP
FETCH c_sysviews_w_delta INTO v_table_name;
IF v_done THEN
LEAVE c_sysviews_w_delta_loop;
END IF;
SET @sys.diagnostics.table_name = v_table_name;
EXECUTE stmt_gen_query_delta USING @sys.diagnostics.table_name;
SELECT CONCAT(@sys.diagnostics.sql_select,
IF(where_delta IS NOT NULL, CONCAT('\n WHERE ', where_delta), ''),
IF(order_by_delta IS NOT NULL, CONCAT('\n ORDER BY ', order_by_delta), ''),
IF(limit_rows IS NOT NULL, CONCAT('\n LIMIT ', limit_rows), '')
)
INTO @sys.diagnostics.sql_select
FROM tmp_sys_views_delta
WHERE TABLE_NAME = v_table_name;
SELECT CONCAT('Delta ', v_table_name) AS 'The following output is:';
CALL sys.execute_prepared_stmt(@sys.diagnostics.sql_select);
CALL sys.execute_prepared_stmt(CONCAT('DROP TEMPORARY TABLE `tmp_', v_table_name, '_end`'));
CALL sys.execute_prepared_stmt(CONCAT('DROP TEMPORARY TABLE `tmp_', v_table_name, '_start`'));
END LOOP;
CLOSE c_sysviews_w_delta;
SET @@session.group_concat_max_len = v_old_group_concat_max_len;
DEALLOCATE PREPARE stmt_gen_query_delta;
DROP TEMPORARY TABLE tmp_sys_views_delta;
END IF;
IF (v_has_metrics) THEN
SELECT 'SELECT * FROM sys.metrics' AS 'The following output is:';
ELSE
SELECT 'sys.metrics equivalent' AS 'The following output is:';
END IF;
CALL sys.execute_prepared_stmt(
CONCAT(v_sql_status_summary_select, v_sql_status_summary_delta, ', Type, s1.Enabled', v_sql_status_summary_from,
'\n ORDER BY Type, Variable_name'
)
);
SET v_count = 0;
WHILE (v_count < v_output_count) DO
SET v_count = v_count + 1;
SET v_table_name = CONCAT('tmp_metrics_', v_count);
CALL sys.execute_prepared_stmt(CONCAT('DROP TEMPORARY TABLE IF EXISTS ', v_table_name));
END WHILE;
IF (in_auto_config <> 'current') THEN
CALL sys.ps_setup_reload_saved();
SET sql_log_bin = @log_bin;
END IF;
SET @sys.diagnostics.output_time = NULL,
@sys.diagnostics.sql = NULL,
@sys.diagnostics.sql_gen_query_delta = NULL,
@sys.diagnostics.sql_gen_query_template = NULL,
@sys.diagnostics.sql_select = NULL,
@sys.diagnostics.table_name = NULL;
IF (v_this_thread_enabled = 'YES') THEN
CALL sys.ps_setup_enable_thread(CONNECTION_ID());
END IF;
IF (@log_bin = 1) THEN
SET sql_log_bin = @log_bin;
END IF;
END
|
NONE |
|
|
Edit
|
Copy
|
Delete
DELETE FROM proc WHERE `proc`.`db` = 'sys' AND `proc`.`name` = 'ps_statement_avg_latency_histogram' AND `proc`.`type` = 'PROCEDURE'
|
sys |
ps_statement_avg_latency_histogram |
PROCEDURE |
ps_statement_avg_latency_histogram |
SQL |
READS_SQL_DATA |
NO |
INVOKER |
|
|
BEGIN
SELECT CONCAT('\n',
'\n . = 1 unit',
'\n * = 2 units',
'\n # = 3 units\n',
@label := CONCAT(@label_inner := CONCAT('\n(0 - ',
ROUND((@bucket_size := (SELECT ROUND((MAX(avg_us) - MIN(avg_us)) / (@buckets := 16)) AS size
FROM sys.x$ps_digest_avg_latency_distribution)) / (@unit_div := 1000)),
(@unit := 'ms'), ')'),
REPEAT(' ', (@max_label_size := ((1 + LENGTH(ROUND((@bucket_size * 15) / @unit_div)) + 3 + LENGTH(ROUND(@bucket_size * 16) / @unit_div)) + 1)) - LENGTH(@label_inner)),
@count_in_bucket := IFNULL((SELECT SUM(cnt)
FROM sys.x$ps_digest_avg_latency_distribution AS b1
WHERE b1.avg_us <= @bucket_size), 0)),
REPEAT(' ', (@max_label_len := (@max_label_size + LENGTH((@total_queries := (SELECT SUM(cnt) FROM sys.x$ps_digest_avg_latency_distribution)))) + 1) - LENGTH(@label)), '| ',
IFNULL(REPEAT(IF(@count_in_bucket < (@one_unit := 40), '.', IF(@count_in_bucket < (@two_unit := 80), '*', '#')),
IF(@count_in_bucket < @one_unit, @count_in_bucket,
IF(@count_in_bucket < @two_unit, @count_in_bucket / 2, @count_in_bucket / 3))), ''),
@label := CONCAT(@label_inner := CONCAT('\n(', ROUND(@bucket_size / @unit_div), ' - ', ROUND((@bucket_size * 2) / @unit_div), @unit, ')'),
REPEAT(' ', @max_label_size - LENGTH(@label_inner)),
@count_in_bucket := IFNULL((SELECT SUM(cnt)
FROM sys.x$ps_digest_avg_latency_distribution AS b1
WHERE b1.avg_us > @bucket_size AND b1.avg_us <= @bucket_size * 2), 0)),
REPEAT(' ', @max_label_len - LENGTH(@label)), '| ',
IFNULL(REPEAT(IF(@count_in_bucket < @one_unit, '.', IF(@count_in_bucket < @two_unit, '*', '#')),
IF(@count_in_bucket < @one_unit, @count_in_bucket,
IF(@count_in_bucket < @two_unit, @count_in_bucket / 2, @count_in_bucket / 3))), ''),
@label := CONCAT(@label_inner := CONCAT('\n(', ROUND((@bucket_size * 2) / @unit_div), ' - ', ROUND((@bucket_size * 3) / @unit_div), @unit, ')'),
REPEAT(' ', @max_label_size - LENGTH(@label_inner)),
@count_in_bucket := IFNULL((SELECT SUM(cnt)
FROM sys.x$ps_digest_avg_latency_distribution AS b1
WHERE b1.avg_us > @bucket_size * 2 AND b1.avg_us <= @bucket_size * 3), 0)),
REPEAT(' ', @max_label_len - LENGTH(@label)), '| ',
IFNULL(REPEAT(IF(@count_in_bucket < @one_unit, '.', IF(@count_in_bucket < @two_unit, '*', '#')),
IF(@count_in_bucket < @one_unit, @count_in_bucket,
IF(@count_in_bucket < @two_unit, @count_in_bucket / 2, @count_in_bucket / 3))), ''),
@label := CONCAT(@label_inner := CONCAT('\n(', ROUND((@bucket_size * 3) / @unit_div), ' - ', ROUND((@bucket_size * 4) / @unit_div), @unit, ')'),
REPEAT(' ', @max_label_size - LENGTH(@label_inner)),
@count_in_bucket := IFNULL((SELECT SUM(cnt)
FROM sys.x$ps_digest_avg_latency_distribution AS b1
WHERE b1.avg_us > @bucket_size * 3 AND b1.avg_us <= @bucket_size * 4), 0)),
REPEAT(' ', @max_label_len - LENGTH(@label)), '| ',
IFNULL(REPEAT(IF(@count_in_bucket < @one_unit, '.', IF(@count_in_bucket < @two_unit, '*', '#')),
IF(@count_in_bucket < @one_unit, @count_in_bucket,
IF(@count_in_bucket < @two_unit, @count_in_bucket / 2, @count_in_bucket / 3))), ''),
@label := CONCAT(@label_inner := CONCAT('\n(', ROUND((@bucket_size * 4) / @unit_div), ' - ', ROUND((@bucket_size * 5) / @unit_div), @unit, ')'),
REPEAT(' ', @max_label_size - LENGTH(@label_inner)),
@count_in_bucket := IFNULL((SELECT SUM(cnt)
FROM sys.x$ps_digest_avg_latency_distribution AS b1
WHERE b1.avg_us > @bucket_size * 4 AND b1.avg_us <= @bucket_size * 5), 0)),
REPEAT(' ', @max_label_len - LENGTH(@label)), '| ',
IFNULL(REPEAT(IF(@count_in_bucket < @one_unit, '.', IF(@count_in_bucket < @two_unit, '*', '#')),
IF(@count_in_bucket < @one_unit, @count_in_bucket,
IF(@count_in_bucket < @two_unit, @count_in_bucket / 2, @count_in_bucket / 3))), ''),
@label := CONCAT(@label_inner := CONCAT('\n(', ROUND((@bucket_size * 5) / @unit_div), ' - ', ROUND((@bucket_size * 6) / @unit_div), @unit, ')'),
REPEAT(' ', @max_label_size - LENGTH(@label_inner)),
@count_in_bucket := IFNULL((SELECT SUM(cnt)
FROM sys.x$ps_digest_avg_latency_distribution AS b1
WHERE b1.avg_us > @bucket_size * 5 AND b1.avg_us <= @bucket_size * 6), 0)),
REPEAT(' ', @max_label_len - LENGTH(@label)), '| ',
IFNULL(REPEAT(IF(@count_in_bucket < @one_unit, '.', IF(@count_in_bucket < @two_unit, '*', '#')),
IF(@count_in_bucket < @one_unit, @count_in_bucket,
IF(@count_in_bucket < @two_unit, @count_in_bucket / 2, @count_in_bucket / 3))), ''),
@label := CONCAT(@label_inner := CONCAT('\n(', ROUND((@bucket_size * 6) / @unit_div), ' - ', ROUND((@bucket_size * 7) / @unit_div), @unit, ')'),
REPEAT(' ', @max_label_size - LENGTH(@label_inner)),
@count_in_bucket := IFNULL((SELECT SUM(cnt)
FROM sys.x$ps_digest_avg_latency_distribution AS b1
WHERE b1.avg_us > @bucket_size * 6 AND b1.avg_us <= @bucket_size * 7), 0)),
REPEAT(' ', @max_label_len - LENGTH(@label)), '| ',
IFNULL(REPEAT(IF(@count_in_bucket < @one_unit, '.', IF(@count_in_bucket < @two_unit, '*', '#')),
IF(@count_in_bucket < @one_unit, @count_in_bucket,
IF(@count_in_bucket < @two_unit, @count_in_bucket / 2, @count_in_bucket / 3))), ''),
@label := CONCAT(@label_inner := CONCAT('\n(', ROUND((@bucket_size * 7) / @unit_div), ' - ', ROUND((@bucket_size * 8) / @unit_div), @unit, ')'),
REPEAT(' ', @max_label_size - LENGTH(@label_inner)),
@count_in_bucket := IFNULL((SELECT SUM(cnt)
FROM sys.x$ps_digest_avg_latency_distribution AS b1
WHERE b1.avg_us > @bucket_size * 7 AND b1.avg_us <= @bucket_size * 8), 0)),
REPEAT(' ', @max_label_len - LENGTH(@label)), '| ',
IFNULL(REPEAT(IF(@count_in_bucket < @one_unit, '.', IF(@count_in_bucket < @two_unit, '*', '#')),
IF(@count_in_bucket < @one_unit, @count_in_bucket,
IF(@count_in_bucket < @two_unit, @count_in_bucket / 2, @count_in_bucket / 3))), ''),
@label := CONCAT(@label_inner := CONCAT('\n(', ROUND((@bucket_size * 8) / @unit_div), ' - ', ROUND((@bucket_size * 9) / @unit_div), @unit, ')'),
REPEAT(' ', @max_label_size - LENGTH(@label_inner)),
@count_in_bucket := IFNULL((SELECT SUM(cnt)
FROM sys.x$ps_digest_avg_latency_distribution AS b1
WHERE b1.avg_us > @bucket_size * 8 AND b1.avg_us <= @bucket_size * 9), 0)),
REPEAT(' ', @max_label_len - LENGTH(@label)), '| ',
IFNULL(REPEAT(IF(@count_in_bucket < @one_unit, '.', IF(@count_in_bucket < @two_unit, '*', '#')),
IF(@count_in_bucket < @one_unit, @count_in_bucket,
IF(@count_in_bucket < @two_unit, @count_in_bucket / 2, @count_in_bucket / 3))), ''),
@label := CONCAT(@label_inner := CONCAT('\n(', ROUND((@bucket_size * 9) / @unit_div), ' - ', ROUND((@bucket_size * 10) / @unit_div), @unit, ')'),
REPEAT(' ', @max_label_size - LENGTH(@label_inner)),
@count_in_bucket := IFNULL((SELECT SUM(cnt)
FROM sys.x$ps_digest_avg_latency_distribution AS b1
WHERE b1.avg_us > @bucket_size * 9 AND b1.avg_us <= @bucket_size * 10), 0)),
REPEAT(' ', @max_label_len - LENGTH(@label)), '| ',
IFNULL(REPEAT(IF(@count_in_bucket < @one_unit, '.', IF(@count_in_bucket < @two_unit, '*', '#')),
IF(@count_in_bucket < @one_unit, @count_in_bucket,
IF(@count_in_bucket < @two_unit, @count_in_bucket / 2, @count_in_bucket / 3))), ''),
@label := CONCAT(@label_inner := CONCAT('\n(', ROUND((@bucket_size * 10) / @unit_div), ' - ', ROUND((@bucket_size * 11) / @unit_div), @unit, ')'),
REPEAT(' ', @max_label_size - LENGTH(@label_inner)),
@count_in_bucket := IFNULL((SELECT SUM(cnt)
FROM sys.x$ps_digest_avg_latency_distribution AS b1
WHERE b1.avg_us > @bucket_size * 10 AND b1.avg_us <= @bucket_size * 11), 0)),
REPEAT(' ', @max_label_len - LENGTH(@label)), '| ',
IFNULL(REPEAT(IF(@count_in_bucket < @one_unit, '.', IF(@count_in_bucket < @two_unit, '*', '#')),
IF(@count_in_bucket < @one_unit, @count_in_bucket,
IF(@count_in_bucket < @two_unit, @count_in_bucket / 2, @count_in_bucket / 3))), ''),
@label := CONCAT(@label_inner := CONCAT('\n(', ROUND((@bucket_size * 11) / @unit_div), ' - ', ROUND((@bucket_size * 12) / @unit_div), @unit, ')'),
REPEAT(' ', @max_label_size - LENGTH(@label_inner)),
@count_in_bucket := IFNULL((SELECT SUM(cnt)
FROM sys.x$ps_digest_avg_latency_distribution AS b1
WHERE b1.avg_us > @bucket_size * 11 AND b1.avg_us <= @bucket_size * 12), 0)),
REPEAT(' ', @max_label_len - LENGTH(@label)), '| ',
IFNULL(REPEAT(IF(@count_in_bucket < @one_unit, '.', IF(@count_in_bucket < @two_unit, '*', '#')),
IF(@count_in_bucket < @one_unit, @count_in_bucket,
IF(@count_in_bucket < @two_unit, @count_in_bucket / 2, @count_in_bucket / 3))), ''),
@label := CONCAT(@label_inner := CONCAT('\n(', ROUND((@bucket_size * 12) / @unit_div), ' - ', ROUND((@bucket_size * 13) / @unit_div), @unit, ')'),
REPEAT(' ', @max_label_size - LENGTH(@label_inner)),
@count_in_bucket := IFNULL((SELECT SUM(cnt)
FROM sys.x$ps_digest_avg_latency_distribution AS b1
WHERE b1.avg_us > @bucket_size * 12 AND b1.avg_us <= @bucket_size * 13), 0)),
REPEAT(' ', @max_label_len - LENGTH(@label)), '| ',
IFNULL(REPEAT(IF(@count_in_bucket < @one_unit, '.', IF(@count_in_bucket < @two_unit, '*', '#')),
IF(@count_in_bucket < @one_unit, @count_in_bucket,
IF(@count_in_bucket < @two_unit, @count_in_bucket / 2, @count_in_bucket / 3))), ''),
@label := CONCAT(@label_inner := CONCAT('\n(', ROUND((@bucket_size * 13) / @unit_div), ' - ', ROUND((@bucket_size * 14) / @unit_div), @unit, ')'),
REPEAT(' ', @max_label_size - LENGTH(@label_inner)),
@count_in_bucket := IFNULL((SELECT SUM(cnt)
FROM sys.x$ps_digest_avg_latency_distribution AS b1
WHERE b1.avg_us > @bucket_size * 13 AND b1.avg_us <= @bucket_size * 14), 0)),
REPEAT(' ', @max_label_len - LENGTH(@label)), '| ',
IFNULL(REPEAT(IF(@count_in_bucket < @one_unit, '.', IF(@count_in_bucket < @two_unit, '*', '#')),
IF(@count_in_bucket < @one_unit, @count_in_bucket,
IF(@count_in_bucket < @two_unit, @count_in_bucket / 2, @count_in_bucket / 3))), ''),
@label := CONCAT(@label_inner := CONCAT('\n(', ROUND((@bucket_size * 14) / @unit_div), ' - ', ROUND((@bucket_size * 15) / @unit_div), @unit, ')'),
REPEAT(' ', @max_label_size - LENGTH(@label_inner)),
@count_in_bucket := IFNULL((SELECT SUM(cnt)
FROM sys.x$ps_digest_avg_latency_distribution AS b1
WHERE b1.avg_us > @bucket_size * 14 AND b1.avg_us <= @bucket_size * 15), 0)),
REPEAT(' ', @max_label_len - LENGTH(@label)), '| ',
IFNULL(REPEAT(IF(@count_in_bucket < @one_unit, '.', IF(@count_in_bucket < @two_unit, '*', '#')),
IF(@count_in_bucket < @one_unit, @count_in_bucket,
IF(@count_in_bucket < @two_unit, @count_in_bucket / 2, @count_in_bucket / 3))), ''),
@label := CONCAT(@label_inner := CONCAT('\n(', ROUND((@bucket_size * 15) / @unit_div), ' - ', ROUND((@bucket_size * 16) / @unit_div), @unit, ')'),
REPEAT(' ', @max_label_size - LENGTH(@label_inner)),
@count_in_bucket := IFNULL((SELECT SUM(cnt)
FROM sys.x$ps_digest_avg_latency_distribution AS b1
WHERE b1.avg_us > @bucket_size * 15 AND b1.avg_us <= @bucket_size * 16), 0)),
REPEAT(' ', @max_label_len - LENGTH(@label)), '| ',
IFNULL(REPEAT(IF(@count_in_bucket < @one_unit, '.', IF(@count_in_bucket < @two_unit, '*', '#')),
IF(@count_in_bucket < @one_unit, @count_in_bucket,
IF(@count_in_bucket < @two_unit, @count_in_bucket / 2, @count_in_bucket / 3))), ''),
'\n\n Total Statements: ', @total_queries, '; Buckets: ', @buckets , '; Bucket Size: ', ROUND(@bucket_size / @unit_div) , ' ', @unit, ';\n'
) AS `Performance Schema Statement Digest Average Latency Histogram`;
END
|
mariadb.sys@localhost |
2026-04-10 15:41:08 |
2026-04-10 15:41:08 |
|
Description
Outputs a t... |
utf8mb3 |
utf8mb3_general_ci |
utf8mb3_general_ci |
BEGIN
SELECT CONCAT('\n',
'\n . = 1 unit',
'\n * = 2 units',
'\n # = 3 units\n',
@label := CONCAT(@label_inner := CONCAT('\n(0 - ',
ROUND((@bucket_size := (SELECT ROUND((MAX(avg_us) - MIN(avg_us)) / (@buckets := 16)) AS size
FROM sys.x$ps_digest_avg_latency_distribution)) / (@unit_div := 1000)),
(@unit := 'ms'), ')'),
REPEAT(' ', (@max_label_size := ((1 + LENGTH(ROUND((@bucket_size * 15) / @unit_div)) + 3 + LENGTH(ROUND(@bucket_size * 16) / @unit_div)) + 1)) - LENGTH(@label_inner)),
@count_in_bucket := IFNULL((SELECT SUM(cnt)
FROM sys.x$ps_digest_avg_latency_distribution AS b1
WHERE b1.avg_us <= @bucket_size), 0)),
REPEAT(' ', (@max_label_len := (@max_label_size + LENGTH((@total_queries := (SELECT SUM(cnt) FROM sys.x$ps_digest_avg_latency_distribution)))) + 1) - LENGTH(@label)), '| ',
IFNULL(REPEAT(IF(@count_in_bucket < (@one_unit := 40), '.', IF(@count_in_bucket < (@two_unit := 80), '*', '#')),
IF(@count_in_bucket < @one_unit, @count_in_bucket,
IF(@count_in_bucket < @two_unit, @count_in_bucket / 2, @count_in_bucket / 3))), ''),
@label := CONCAT(@label_inner := CONCAT('\n(', ROUND(@bucket_size / @unit_div), ' - ', ROUND((@bucket_size * 2) / @unit_div), @unit, ')'),
REPEAT(' ', @max_label_size - LENGTH(@label_inner)),
@count_in_bucket := IFNULL((SELECT SUM(cnt)
FROM sys.x$ps_digest_avg_latency_distribution AS b1
WHERE b1.avg_us > @bucket_size AND b1.avg_us <= @bucket_size * 2), 0)),
REPEAT(' ', @max_label_len - LENGTH(@label)), '| ',
IFNULL(REPEAT(IF(@count_in_bucket < @one_unit, '.', IF(@count_in_bucket < @two_unit, '*', '#')),
IF(@count_in_bucket < @one_unit, @count_in_bucket,
IF(@count_in_bucket < @two_unit, @count_in_bucket / 2, @count_in_bucket / 3))), ''),
@label := CONCAT(@label_inner := CONCAT('\n(', ROUND((@bucket_size * 2) / @unit_div), ' - ', ROUND((@bucket_size * 3) / @unit_div), @unit, ')'),
REPEAT(' ', @max_label_size - LENGTH(@label_inner)),
@count_in_bucket := IFNULL((SELECT SUM(cnt)
FROM sys.x$ps_digest_avg_latency_distribution AS b1
WHERE b1.avg_us > @bucket_size * 2 AND b1.avg_us <= @bucket_size * 3), 0)),
REPEAT(' ', @max_label_len - LENGTH(@label)), '| ',
IFNULL(REPEAT(IF(@count_in_bucket < @one_unit, '.', IF(@count_in_bucket < @two_unit, '*', '#')),
IF(@count_in_bucket < @one_unit, @count_in_bucket,
IF(@count_in_bucket < @two_unit, @count_in_bucket / 2, @count_in_bucket / 3))), ''),
@label := CONCAT(@label_inner := CONCAT('\n(', ROUND((@bucket_size * 3) / @unit_div), ' - ', ROUND((@bucket_size * 4) / @unit_div), @unit, ')'),
REPEAT(' ', @max_label_size - LENGTH(@label_inner)),
@count_in_bucket := IFNULL((SELECT SUM(cnt)
FROM sys.x$ps_digest_avg_latency_distribution AS b1
WHERE b1.avg_us > @bucket_size * 3 AND b1.avg_us <= @bucket_size * 4), 0)),
REPEAT(' ', @max_label_len - LENGTH(@label)), '| ',
IFNULL(REPEAT(IF(@count_in_bucket < @one_unit, '.', IF(@count_in_bucket < @two_unit, '*', '#')),
IF(@count_in_bucket < @one_unit, @count_in_bucket,
IF(@count_in_bucket < @two_unit, @count_in_bucket / 2, @count_in_bucket / 3))), ''),
@label := CONCAT(@label_inner := CONCAT('\n(', ROUND((@bucket_size * 4) / @unit_div), ' - ', ROUND((@bucket_size * 5) / @unit_div), @unit, ')'),
REPEAT(' ', @max_label_size - LENGTH(@label_inner)),
@count_in_bucket := IFNULL((SELECT SUM(cnt)
FROM sys.x$ps_digest_avg_latency_distribution AS b1
WHERE b1.avg_us > @bucket_size * 4 AND b1.avg_us <= @bucket_size * 5), 0)),
REPEAT(' ', @max_label_len - LENGTH(@label)), '| ',
IFNULL(REPEAT(IF(@count_in_bucket < @one_unit, '.', IF(@count_in_bucket < @two_unit, '*', '#')),
IF(@count_in_bucket < @one_unit, @count_in_bucket,
IF(@count_in_bucket < @two_unit, @count_in_bucket / 2, @count_in_bucket / 3))), ''),
@label := CONCAT(@label_inner := CONCAT('\n(', ROUND((@bucket_size * 5) / @unit_div), ' - ', ROUND((@bucket_size * 6) / @unit_div), @unit, ')'),
REPEAT(' ', @max_label_size - LENGTH(@label_inner)),
@count_in_bucket := IFNULL((SELECT SUM(cnt)
FROM sys.x$ps_digest_avg_latency_distribution AS b1
WHERE b1.avg_us > @bucket_size * 5 AND b1.avg_us <= @bucket_size * 6), 0)),
REPEAT(' ', @max_label_len - LENGTH(@label)), '| ',
IFNULL(REPEAT(IF(@count_in_bucket < @one_unit, '.', IF(@count_in_bucket < @two_unit, '*', '#')),
IF(@count_in_bucket < @one_unit, @count_in_bucket,
IF(@count_in_bucket < @two_unit, @count_in_bucket / 2, @count_in_bucket / 3))), ''),
@label := CONCAT(@label_inner := CONCAT('\n(', ROUND((@bucket_size * 6) / @unit_div), ' - ', ROUND((@bucket_size * 7) / @unit_div), @unit, ')'),
REPEAT(' ', @max_label_size - LENGTH(@label_inner)),
@count_in_bucket := IFNULL((SELECT SUM(cnt)
FROM sys.x$ps_digest_avg_latency_distribution AS b1
WHERE b1.avg_us > @bucket_size * 6 AND b1.avg_us <= @bucket_size * 7), 0)),
REPEAT(' ', @max_label_len - LENGTH(@label)), '| ',
IFNULL(REPEAT(IF(@count_in_bucket < @one_unit, '.', IF(@count_in_bucket < @two_unit, '*', '#')),
IF(@count_in_bucket < @one_unit, @count_in_bucket,
IF(@count_in_bucket < @two_unit, @count_in_bucket / 2, @count_in_bucket / 3))), ''),
@label := CONCAT(@label_inner := CONCAT('\n(', ROUND((@bucket_size * 7) / @unit_div), ' - ', ROUND((@bucket_size * 8) / @unit_div), @unit, ')'),
REPEAT(' ', @max_label_size - LENGTH(@label_inner)),
@count_in_bucket := IFNULL((SELECT SUM(cnt)
FROM sys.x$ps_digest_avg_latency_distribution AS b1
WHERE b1.avg_us > @bucket_size * 7 AND b1.avg_us <= @bucket_size * 8), 0)),
REPEAT(' ', @max_label_len - LENGTH(@label)), '| ',
IFNULL(REPEAT(IF(@count_in_bucket < @one_unit, '.', IF(@count_in_bucket < @two_unit, '*', '#')),
IF(@count_in_bucket < @one_unit, @count_in_bucket,
IF(@count_in_bucket < @two_unit, @count_in_bucket / 2, @count_in_bucket / 3))), ''),
@label := CONCAT(@label_inner := CONCAT('\n(', ROUND((@bucket_size * 8) / @unit_div), ' - ', ROUND((@bucket_size * 9) / @unit_div), @unit, ')'),
REPEAT(' ', @max_label_size - LENGTH(@label_inner)),
@count_in_bucket := IFNULL((SELECT SUM(cnt)
FROM sys.x$ps_digest_avg_latency_distribution AS b1
WHERE b1.avg_us > @bucket_size * 8 AND b1.avg_us <= @bucket_size * 9), 0)),
REPEAT(' ', @max_label_len - LENGTH(@label)), '| ',
IFNULL(REPEAT(IF(@count_in_bucket < @one_unit, '.', IF(@count_in_bucket < @two_unit, '*', '#')),
IF(@count_in_bucket < @one_unit, @count_in_bucket,
IF(@count_in_bucket < @two_unit, @count_in_bucket / 2, @count_in_bucket / 3))), ''),
@label := CONCAT(@label_inner := CONCAT('\n(', ROUND((@bucket_size * 9) / @unit_div), ' - ', ROUND((@bucket_size * 10) / @unit_div), @unit, ')'),
REPEAT(' ', @max_label_size - LENGTH(@label_inner)),
@count_in_bucket := IFNULL((SELECT SUM(cnt)
FROM sys.x$ps_digest_avg_latency_distribution AS b1
WHERE b1.avg_us > @bucket_size * 9 AND b1.avg_us <= @bucket_size * 10), 0)),
REPEAT(' ', @max_label_len - LENGTH(@label)), '| ',
IFNULL(REPEAT(IF(@count_in_bucket < @one_unit, '.', IF(@count_in_bucket < @two_unit, '*', '#')),
IF(@count_in_bucket < @one_unit, @count_in_bucket,
IF(@count_in_bucket < @two_unit, @count_in_bucket / 2, @count_in_bucket / 3))), ''),
@label := CONCAT(@label_inner := CONCAT('\n(', ROUND((@bucket_size * 10) / @unit_div), ' - ', ROUND((@bucket_size * 11) / @unit_div), @unit, ')'),
REPEAT(' ', @max_label_size - LENGTH(@label_inner)),
@count_in_bucket := IFNULL((SELECT SUM(cnt)
FROM sys.x$ps_digest_avg_latency_distribution AS b1
WHERE b1.avg_us > @bucket_size * 10 AND b1.avg_us <= @bucket_size * 11), 0)),
REPEAT(' ', @max_label_len - LENGTH(@label)), '| ',
IFNULL(REPEAT(IF(@count_in_bucket < @one_unit, '.', IF(@count_in_bucket < @two_unit, '*', '#')),
IF(@count_in_bucket < @one_unit, @count_in_bucket,
IF(@count_in_bucket < @two_unit, @count_in_bucket / 2, @count_in_bucket / 3))), ''),
@label := CONCAT(@label_inner := CONCAT('\n(', ROUND((@bucket_size * 11) / @unit_div), ' - ', ROUND((@bucket_size * 12) / @unit_div), @unit, ')'),
REPEAT(' ', @max_label_size - LENGTH(@label_inner)),
@count_in_bucket := IFNULL((SELECT SUM(cnt)
FROM sys.x$ps_digest_avg_latency_distribution AS b1
WHERE b1.avg_us > @bucket_size * 11 AND b1.avg_us <= @bucket_size * 12), 0)),
REPEAT(' ', @max_label_len - LENGTH(@label)), '| ',
IFNULL(REPEAT(IF(@count_in_bucket < @one_unit, '.', IF(@count_in_bucket < @two_unit, '*', '#')),
IF(@count_in_bucket < @one_unit, @count_in_bucket,
IF(@count_in_bucket < @two_unit, @count_in_bucket / 2, @count_in_bucket / 3))), ''),
@label := CONCAT(@label_inner := CONCAT('\n(', ROUND((@bucket_size * 12) / @unit_div), ' - ', ROUND((@bucket_size * 13) / @unit_div), @unit, ')'),
REPEAT(' ', @max_label_size - LENGTH(@label_inner)),
@count_in_bucket := IFNULL((SELECT SUM(cnt)
FROM sys.x$ps_digest_avg_latency_distribution AS b1
WHERE b1.avg_us > @bucket_size * 12 AND b1.avg_us <= @bucket_size * 13), 0)),
REPEAT(' ', @max_label_len - LENGTH(@label)), '| ',
IFNULL(REPEAT(IF(@count_in_bucket < @one_unit, '.', IF(@count_in_bucket < @two_unit, '*', '#')),
IF(@count_in_bucket < @one_unit, @count_in_bucket,
IF(@count_in_bucket < @two_unit, @count_in_bucket / 2, @count_in_bucket / 3))), ''),
@label := CONCAT(@label_inner := CONCAT('\n(', ROUND((@bucket_size * 13) / @unit_div), ' - ', ROUND((@bucket_size * 14) / @unit_div), @unit, ')'),
REPEAT(' ', @max_label_size - LENGTH(@label_inner)),
@count_in_bucket := IFNULL((SELECT SUM(cnt)
FROM sys.x$ps_digest_avg_latency_distribution AS b1
WHERE b1.avg_us > @bucket_size * 13 AND b1.avg_us <= @bucket_size * 14), 0)),
REPEAT(' ', @max_label_len - LENGTH(@label)), '| ',
IFNULL(REPEAT(IF(@count_in_bucket < @one_unit, '.', IF(@count_in_bucket < @two_unit, '*', '#')),
IF(@count_in_bucket < @one_unit, @count_in_bucket,
IF(@count_in_bucket < @two_unit, @count_in_bucket / 2, @count_in_bucket / 3))), ''),
@label := CONCAT(@label_inner := CONCAT('\n(', ROUND((@bucket_size * 14) / @unit_div), ' - ', ROUND((@bucket_size * 15) / @unit_div), @unit, ')'),
REPEAT(' ', @max_label_size - LENGTH(@label_inner)),
@count_in_bucket := IFNULL((SELECT SUM(cnt)
FROM sys.x$ps_digest_avg_latency_distribution AS b1
WHERE b1.avg_us > @bucket_size * 14 AND b1.avg_us <= @bucket_size * 15), 0)),
REPEAT(' ', @max_label_len - LENGTH(@label)), '| ',
IFNULL(REPEAT(IF(@count_in_bucket < @one_unit, '.', IF(@count_in_bucket < @two_unit, '*', '#')),
IF(@count_in_bucket < @one_unit, @count_in_bucket,
IF(@count_in_bucket < @two_unit, @count_in_bucket / 2, @count_in_bucket / 3))), ''),
@label := CONCAT(@label_inner := CONCAT('\n(', ROUND((@bucket_size * 15) / @unit_div), ' - ', ROUND((@bucket_size * 16) / @unit_div), @unit, ')'),
REPEAT(' ', @max_label_size - LENGTH(@label_inner)),
@count_in_bucket := IFNULL((SELECT SUM(cnt)
FROM sys.x$ps_digest_avg_latency_distribution AS b1
WHERE b1.avg_us > @bucket_size * 15 AND b1.avg_us <= @bucket_size * 16), 0)),
REPEAT(' ', @max_label_len - LENGTH(@label)), '| ',
IFNULL(REPEAT(IF(@count_in_bucket < @one_unit, '.', IF(@count_in_bucket < @two_unit, '*', '#')),
IF(@count_in_bucket < @one_unit, @count_in_bucket,
IF(@count_in_bucket < @two_unit, @count_in_bucket / 2, @count_in_bucket / 3))), ''),
'\n\n Total Statements: ', @total_queries, '; Buckets: ', @buckets , '; Bucket Size: ', ROUND(@bucket_size / @unit_div) , ' ', @unit, ';\n'
) AS `Performance Schema Statement Digest Average Latency Histogram`;
END
|
NONE |
|
|
Edit
|
Copy
|
Delete
DELETE FROM proc WHERE `proc`.`db` = 'sys' AND `proc`.`name` = 'ps_trace_statement_digest' AND `proc`.`type` = 'PROCEDURE'
|
sys |
ps_trace_statement_digest |
PROCEDURE |
ps_trace_statement_digest |
SQL |
MODIFIES_SQL_DATA |
NO |
INVOKER |
IN in_digest VARCHAR(32),
IN in_runtime INT,
IN in_interval DECIMAL(2,2),
IN in_start_fresh BOOLEAN,
IN in_auto_enable BOOLEAN
|
|
BEGIN
DECLARE v_start_fresh BOOLEAN DEFAULT false;
DECLARE v_auto_enable BOOLEAN DEFAULT false;
DECLARE v_explain BOOLEAN DEFAULT true;
DECLARE v_this_thread_enabed ENUM('YES', 'NO');
DECLARE v_runtime INT DEFAULT 0;
DECLARE v_start INT DEFAULT 0;
DECLARE v_found_stmts INT;
SET @log_bin := @@sql_log_bin;
SET sql_log_bin = 0;
SELECT INSTRUMENTED INTO v_this_thread_enabed FROM performance_schema.threads WHERE PROCESSLIST_ID = CONNECTION_ID();
CALL sys.ps_setup_disable_thread(CONNECTION_ID());
DROP TEMPORARY TABLE IF EXISTS stmt_trace;
CREATE TEMPORARY TABLE stmt_trace (
thread_id BIGINT UNSIGNED,
timer_start BIGINT UNSIGNED,
event_id BIGINT UNSIGNED,
sql_text longtext,
timer_wait BIGINT UNSIGNED,
lock_time BIGINT UNSIGNED,
errors BIGINT UNSIGNED,
mysql_errno INT,
rows_sent BIGINT UNSIGNED,
rows_affected BIGINT UNSIGNED,
rows_examined BIGINT UNSIGNED,
created_tmp_tables BIGINT UNSIGNED,
created_tmp_disk_tables BIGINT UNSIGNED,
no_index_used BIGINT UNSIGNED,
PRIMARY KEY (thread_id, timer_start)
);
DROP TEMPORARY TABLE IF EXISTS stmt_stages;
CREATE TEMPORARY TABLE stmt_stages (
event_id BIGINT UNSIGNED,
stmt_id BIGINT UNSIGNED,
event_name VARCHAR(128),
timer_wait BIGINT UNSIGNED,
PRIMARY KEY (event_id)
);
SET v_start_fresh = in_start_fresh;
IF v_start_fresh THEN
TRUNCATE TABLE performance_schema.events_statements_history_long;
TRUNCATE TABLE performance_schema.events_stages_history_long;
END IF;
SET v_auto_enable = in_auto_enable;
IF v_auto_enable THEN
CALL sys.ps_setup_save(0);
UPDATE performance_schema.threads
SET INSTRUMENTED = IF(PROCESSLIST_ID IS NOT NULL, 'YES', 'NO');
UPDATE performance_schema.setup_consumers
SET ENABLED = 'YES'
WHERE NAME NOT LIKE '%\_history'
AND NAME NOT LIKE 'events_wait%'
AND NAME NOT LIKE 'events_transactions%'
AND NAME <> 'statements_digest';
UPDATE performance_schema.setup_instruments
SET ENABLED = 'YES',
TIMED = 'YES'
WHERE NAME LIKE 'statement/%' OR NAME LIKE 'stage/%';
END IF;
WHILE v_runtime < in_runtime DO
SELECT UNIX_TIMESTAMP() INTO v_start;
INSERT IGNORE INTO stmt_trace
SELECT thread_id, timer_start, event_id, sql_text, timer_wait, lock_time, errors, mysql_errno,
rows_sent, rows_affected, rows_examined, created_tmp_tables, created_tmp_disk_tables, no_index_used
FROM performance_schema.events_statements_history_long
WHERE digest = in_digest;
INSERT IGNORE INTO stmt_stages
SELECT stages.event_id, stmt_trace.event_id,
stages.event_name, stages.timer_wait
FROM performance_schema.events_stages_history_long AS stages
JOIN stmt_trace ON stages.nesting_event_id = stmt_trace.event_id;
SELECT SLEEP(in_interval) INTO @sleep;
SET v_runtime = v_runtime + (UNIX_TIMESTAMP() - v_start);
END WHILE;
SELECT "SUMMARY STATISTICS";
SELECT COUNT(*) executions,
sys.format_time(SUM(timer_wait)) AS exec_time,
sys.format_time(SUM(lock_time)) AS lock_time,
SUM(rows_sent) AS rows_sent,
SUM(rows_affected) AS rows_affected,
SUM(rows_examined) AS rows_examined,
SUM(created_tmp_tables) AS tmp_tables,
SUM(no_index_used) AS full_scans
FROM stmt_trace;
SELECT event_name,
COUNT(*) as count,
sys.format_time(SUM(timer_wait)) as latency
FROM stmt_stages
GROUP BY event_name
ORDER BY SUM(timer_wait) DESC;
SELECT "LONGEST RUNNING STATEMENT";
SELECT thread_id,
sys.format_time(timer_wait) AS exec_time,
sys.format_time(lock_time) AS lock_time,
rows_sent,
rows_affected,
rows_examined,
created_tmp_tables AS tmp_tables,
no_index_used AS full_scan
FROM stmt_trace
ORDER BY timer_wait DESC LIMIT 1;
SELECT sql_text
FROM stmt_trace
ORDER BY timer_wait DESC LIMIT 1;
SELECT sql_text, event_id INTO @sql, @sql_id
FROM stmt_trace
ORDER BY timer_wait DESC LIMIT 1;
IF (@sql_id IS NOT NULL) THEN
SELECT event_name,
sys.format_time(timer_wait) as latency
FROM stmt_stages
WHERE stmt_id = @sql_id
ORDER BY event_id;
END IF;
DROP TEMPORARY TABLE stmt_trace;
DROP TEMPORARY TABLE stmt_stages;
IF (@sql IS NOT NULL) THEN
SET @stmt := CONCAT("EXPLAIN FORMAT=JSON ", @sql);
BEGIN
DECLARE CONTINUE HANDLER FOR 1064, 1146 SET v_explain = false;
PREPARE explain_stmt FROM @stmt;
END;
IF (v_explain) THEN
EXECUTE explain_stmt;
DEALLOCATE PREPARE explain_stmt;
END IF;
END IF;
IF v_auto_enable THEN
CALL sys.ps_setup_reload_saved();
END IF;
IF (v_this_thread_enabed = 'YES') THEN
CALL sys.ps_setup_enable_thread(CONNECTION_ID());
END IF;
SET sql_log_bin = @log_bin;
END
|
mariadb.sys@localhost |
2026-04-10 15:41:08 |
2026-04-10 15:41:08 |
|
Description
Traces all ... |
utf8mb3 |
utf8mb3_general_ci |
utf8mb3_general_ci |
BEGIN
DECLARE v_start_fresh BOOLEAN DEFAULT false;
DECLARE v_auto_enable BOOLEAN DEFAULT false;
DECLARE v_explain BOOLEAN DEFAULT true;
DECLARE v_this_thread_enabed ENUM('YES', 'NO');
DECLARE v_runtime INT DEFAULT 0;
DECLARE v_start INT DEFAULT 0;
DECLARE v_found_stmts INT;
SET @log_bin := @@sql_log_bin;
SET sql_log_bin = 0;
SELECT INSTRUMENTED INTO v_this_thread_enabed FROM performance_schema.threads WHERE PROCESSLIST_ID = CONNECTION_ID();
CALL sys.ps_setup_disable_thread(CONNECTION_ID());
DROP TEMPORARY TABLE IF EXISTS stmt_trace;
CREATE TEMPORARY TABLE stmt_trace (
thread_id BIGINT UNSIGNED,
timer_start BIGINT UNSIGNED,
event_id BIGINT UNSIGNED,
sql_text longtext,
timer_wait BIGINT UNSIGNED,
lock_time BIGINT UNSIGNED,
errors BIGINT UNSIGNED,
mysql_errno INT,
rows_sent BIGINT UNSIGNED,
rows_affected BIGINT UNSIGNED,
rows_examined BIGINT UNSIGNED,
created_tmp_tables BIGINT UNSIGNED,
created_tmp_disk_tables BIGINT UNSIGNED,
no_index_used BIGINT UNSIGNED,
PRIMARY KEY (thread_id, timer_start)
);
DROP TEMPORARY TABLE IF EXISTS stmt_stages;
CREATE TEMPORARY TABLE stmt_stages (
event_id BIGINT UNSIGNED,
stmt_id BIGINT UNSIGNED,
event_name VARCHAR(128),
timer_wait BIGINT UNSIGNED,
PRIMARY KEY (event_id)
);
SET v_start_fresh = in_start_fresh;
IF v_start_fresh THEN
TRUNCATE TABLE performance_schema.events_statements_history_long;
TRUNCATE TABLE performance_schema.events_stages_history_long;
END IF;
SET v_auto_enable = in_auto_enable;
IF v_auto_enable THEN
CALL sys.ps_setup_save(0);
UPDATE performance_schema.threads
SET INSTRUMENTED = IF(PROCESSLIST_ID IS NOT NULL, 'YES', 'NO');
UPDATE performance_schema.setup_consumers
SET ENABLED = 'YES'
WHERE NAME NOT LIKE '%\_history'
AND NAME NOT LIKE 'events_wait%'
AND NAME NOT LIKE 'events_transactions%'
AND NAME <> 'statements_digest';
UPDATE performance_schema.setup_instruments
SET ENABLED = 'YES',
TIMED = 'YES'
WHERE NAME LIKE 'statement/%' OR NAME LIKE 'stage/%';
END IF;
WHILE v_runtime < in_runtime DO
SELECT UNIX_TIMESTAMP() INTO v_start;
INSERT IGNORE INTO stmt_trace
SELECT thread_id, timer_start, event_id, sql_text, timer_wait, lock_time, errors, mysql_errno,
rows_sent, rows_affected, rows_examined, created_tmp_tables, created_tmp_disk_tables, no_index_used
FROM performance_schema.events_statements_history_long
WHERE digest = in_digest;
INSERT IGNORE INTO stmt_stages
SELECT stages.event_id, stmt_trace.event_id,
stages.event_name, stages.timer_wait
FROM performance_schema.events_stages_history_long AS stages
JOIN stmt_trace ON stages.nesting_event_id = stmt_trace.event_id;
SELECT SLEEP(in_interval) INTO @sleep;
SET v_runtime = v_runtime + (UNIX_TIMESTAMP() - v_start);
END WHILE;
SELECT "SUMMARY STATISTICS";
SELECT COUNT(*) executions,
sys.format_time(SUM(timer_wait)) AS exec_time,
sys.format_time(SUM(lock_time)) AS lock_time,
SUM(rows_sent) AS rows_sent,
SUM(rows_affected) AS rows_affected,
SUM(rows_examined) AS rows_examined,
SUM(created_tmp_tables) AS tmp_tables,
SUM(no_index_used) AS full_scans
FROM stmt_trace;
SELECT event_name,
COUNT(*) as count,
sys.format_time(SUM(timer_wait)) as latency
FROM stmt_stages
GROUP BY event_name
ORDER BY SUM(timer_wait) DESC;
SELECT "LONGEST RUNNING STATEMENT";
SELECT thread_id,
sys.format_time(timer_wait) AS exec_time,
sys.format_time(lock_time) AS lock_time,
rows_sent,
rows_affected,
rows_examined,
created_tmp_tables AS tmp_tables,
no_index_used AS full_scan
FROM stmt_trace
ORDER BY timer_wait DESC LIMIT 1;
SELECT sql_text
FROM stmt_trace
ORDER BY timer_wait DESC LIMIT 1;
SELECT sql_text, event_id INTO @sql, @sql_id
FROM stmt_trace
ORDER BY timer_wait DESC LIMIT 1;
IF (@sql_id IS NOT NULL) THEN
SELECT event_name,
sys.format_time(timer_wait) as latency
FROM stmt_stages
WHERE stmt_id = @sql_id
ORDER BY event_id;
END IF;
DROP TEMPORARY TABLE stmt_trace;
DROP TEMPORARY TABLE stmt_stages;
IF (@sql IS NOT NULL) THEN
SET @stmt := CONCAT("EXPLAIN FORMAT=JSON ", @sql);
BEGIN
DECLARE CONTINUE HANDLER FOR 1064, 1146 SET v_explain = false;
PREPARE explain_stmt FROM @stmt;
END;
IF (v_explain) THEN
EXECUTE explain_stmt;
DEALLOCATE PREPARE explain_stmt;
END IF;
END IF;
IF v_auto_enable THEN
CALL sys.ps_setup_reload_saved();
END IF;
IF (v_this_thread_enabed = 'YES') THEN
CALL sys.ps_setup_enable_thread(CONNECTION_ID());
END IF;
SET sql_log_bin = @log_bin;
END
|
NONE |
|
|
Edit
|
Copy
|
Delete
DELETE FROM proc WHERE `proc`.`db` = 'sys' AND `proc`.`name` = 'ps_trace_thread' AND `proc`.`type` = 'PROCEDURE'
|
sys |
ps_trace_thread |
PROCEDURE |
ps_trace_thread |
SQL |
MODIFIES_SQL_DATA |
NO |
INVOKER |
IN in_thread_id BIGINT UNSIGNED,
IN in_outfile VARCHAR(255),
IN in_max_runtime DECIMAL(20,2),
IN in_interval DECIMAL(20,2),
IN in_start_fresh BOOLEAN,
IN in_auto_setup BOOLEAN,
IN in_debug BOOLEAN
|
|
BEGIN
DECLARE v_done bool DEFAULT FALSE;
DECLARE v_start, v_runtime DECIMAL(20,2) DEFAULT 0.0;
DECLARE v_min_event_id bigint unsigned DEFAULT 0;
DECLARE v_this_thread_enabed ENUM('YES', 'NO');
DECLARE v_event longtext;
DECLARE c_stack CURSOR FOR
SELECT CONCAT(IF(nesting_event_id IS NOT NULL, CONCAT(nesting_event_id, ' -> '), ''),
event_id, '; ', event_id, ' [label="',
'(', sys.format_time(timer_wait), ') ',
IF (event_name NOT LIKE 'wait/io%',
SUBSTRING_INDEX(event_name, '/', -2),
IF (event_name NOT LIKE 'wait/io/file%' OR event_name NOT LIKE 'wait/io/socket%',
SUBSTRING_INDEX(event_name, '/', -4),
event_name)
),
IF (event_name LIKE 'statement/%', IFNULL(CONCAT('\\n', wait_info), ''), ''),
IF (in_debug AND event_name LIKE 'wait%', wait_info, ''),
'", ',
CASE WHEN event_name LIKE 'wait/io/file%' THEN
'shape=box, style=filled, color=red'
WHEN event_name LIKE 'wait/io/table%' THEN
'shape=box, style=filled, color=green'
WHEN event_name LIKE 'wait/io/socket%' THEN
'shape=box, style=filled, color=yellow'
WHEN event_name LIKE 'wait/synch/mutex%' THEN
'style=filled, color=lightskyblue'
WHEN event_name LIKE 'wait/synch/cond%' THEN
'style=filled, color=darkseagreen3'
WHEN event_name LIKE 'wait/synch/rwlock%' THEN
'style=filled, color=orchid'
WHEN event_name LIKE 'wait/lock%' THEN
'shape=box, style=filled, color=tan'
WHEN event_name LIKE 'statement/%' THEN
CONCAT('shape=box, style=bold',
CASE WHEN event_name LIKE 'statement/com/%' THEN
' style=filled, color=darkseagreen'
ELSE
IF((timer_wait/1000000000000) > @@log_slow_query_time,
' style=filled, color=red',
' style=filled, color=lightblue')
END
)
WHEN event_name LIKE 'stage/%' THEN
'style=filled, color=slategray3'
WHEN event_name LIKE '%idle%' THEN
'shape=box, style=filled, color=firebrick3'
ELSE '' END,
'];\n'
) event, event_id
FROM (
(SELECT thread_id, event_id, event_name, timer_wait, timer_start, nesting_event_id,
CONCAT(sql_text, '\\n',
'errors: ', errors, '\\n',
'warnings: ', warnings, '\\n',
'lock time: ', sys.format_time(lock_time),'\\n',
'rows affected: ', rows_affected, '\\n',
'rows sent: ', rows_sent, '\\n',
'rows examined: ', rows_examined, '\\n',
'tmp tables: ', created_tmp_tables, '\\n',
'tmp disk tables: ', created_tmp_disk_tables, '\\n'
'select scan: ', select_scan, '\\n',
'select full join: ', select_full_join, '\\n',
'select full range join: ', select_full_range_join, '\\n',
'select range: ', select_range, '\\n',
'select range check: ', select_range_check, '\\n',
'sort merge passes: ', sort_merge_passes, '\\n',
'sort rows: ', sort_rows, '\\n',
'sort range: ', sort_range, '\\n',
'sort scan: ', sort_scan, '\\n',
'no index used: ', IF(no_index_used, 'TRUE', 'FALSE'), '\\n',
'no good index used: ', IF(no_good_index_used, 'TRUE', 'FALSE'), '\\n'
) AS wait_info
FROM performance_schema.events_statements_history_long
WHERE thread_id = in_thread_id AND event_id > v_min_event_id)
UNION
(SELECT thread_id, event_id, event_name, timer_wait, timer_start, nesting_event_id, null AS wait_info
FROM performance_schema.events_stages_history_long
WHERE thread_id = in_thread_id AND event_id > v_min_event_id)
UNION
(SELECT thread_id, event_id,
CONCAT(event_name,
IF(event_name NOT LIKE 'wait/synch/mutex%', IFNULL(CONCAT(' - ', operation), ''), ''),
IF(number_of_bytes IS NOT NULL, CONCAT(' ', number_of_bytes, ' bytes'), ''),
IF(event_name LIKE 'wait/io/file%', '\\n', ''),
IF(object_schema IS NOT NULL, CONCAT('\\nObject: ', object_schema, '.'), ''),
IF(object_name IS NOT NULL,
IF (event_name LIKE 'wait/io/socket%',
CONCAT('\\n', IF (object_name LIKE ':0%', @@socket, object_name)),
object_name),
''
),
IF(index_name IS NOT NULL, CONCAT(' Index: ', index_name), ''), '\\n'
) AS event_name,
timer_wait, timer_start, nesting_event_id, source AS wait_info
FROM performance_schema.events_waits_history_long
WHERE thread_id = in_thread_id AND event_id > v_min_event_id)
) events
ORDER BY event_id;
DECLARE CONTINUE HANDLER FOR NOT FOUND SET v_done = TRUE;
SET @log_bin := @@sql_log_bin;
SET sql_log_bin = 0;
SELECT INSTRUMENTED INTO v_this_thread_enabed FROM performance_schema.threads WHERE PROCESSLIST_ID = CONNECTION_ID();
CALL sys.ps_setup_disable_thread(CONNECTION_ID());
IF (in_auto_setup) THEN
CALL sys.ps_setup_save(0);
DELETE FROM performance_schema.setup_actors;
UPDATE performance_schema.threads
SET INSTRUMENTED = IF(THREAD_ID = in_thread_id, 'YES', 'NO');
UPDATE performance_schema.setup_consumers
SET ENABLED = 'YES'
WHERE NAME NOT LIKE '%\_history';
UPDATE performance_schema.setup_instruments
SET ENABLED = 'YES',
TIMED = 'YES';
END IF;
IF (in_start_fresh) THEN
TRUNCATE performance_schema.events_statements_history_long;
TRUNCATE performance_schema.events_stages_history_long;
TRUNCATE performance_schema.events_waits_history_long;
END IF;
DROP TEMPORARY TABLE IF EXISTS tmp_events;
CREATE TEMPORARY TABLE tmp_events (
event_id bigint unsigned NOT NULL,
event longblob,
PRIMARY KEY (event_id)
);
INSERT INTO tmp_events VALUES (0, CONCAT('digraph events { rankdir=LR; nodesep=0.10;\n',
'// Stack created .....: ', NOW(), '\n',
'// MySQL version .....: ', VERSION(), '\n',
'// MySQL hostname ....: ', @@hostname, '\n',
'// MySQL port ........: ', @@port, '\n',
'// MySQL socket ......: ', @@socket, '\n',
'// MySQL user ........: ', CURRENT_USER(), '\n'));
SELECT CONCAT('Data collection starting for THREAD_ID = ', in_thread_id) AS 'Info';
SET v_min_event_id = 0,
v_start = UNIX_TIMESTAMP(),
in_interval = IFNULL(in_interval, 1.00),
in_max_runtime = IFNULL(in_max_runtime, 60.00);
WHILE (v_runtime < in_max_runtime
AND (SELECT INSTRUMENTED FROM performance_schema.threads WHERE THREAD_ID = in_thread_id) = 'YES') DO
SET v_done = FALSE;
OPEN c_stack;
c_stack_loop: LOOP
FETCH c_stack INTO v_event, v_min_event_id;
IF v_done THEN
LEAVE c_stack_loop;
END IF;
IF (LENGTH(v_event) > 0) THEN
INSERT INTO tmp_events VALUES (v_min_event_id, v_event);
END IF;
END LOOP;
CLOSE c_stack;
SELECT SLEEP(in_interval) INTO @sleep;
SET v_runtime = (UNIX_TIMESTAMP() - v_start);
END WHILE;
INSERT INTO tmp_events VALUES (v_min_event_id+1, '}');
SET @query = CONCAT('SELECT event FROM tmp_events ORDER BY event_id INTO OUTFILE ''', in_outfile, ''' FIELDS ESCAPED BY '''' LINES TERMINATED BY ''''');
PREPARE stmt_output FROM @query;
EXECUTE stmt_output;
DEALLOCATE PREPARE stmt_output;
SELECT CONCAT('Stack trace written to ', in_outfile) AS 'Info';
SELECT CONCAT('dot -Tpdf -o /tmp/stack_', in_thread_id, '.pdf ', in_outfile) AS 'Convert to PDF';
SELECT CONCAT('dot -Tpng -o /tmp/stack_', in_thread_id, '.png ', in_outfile) AS 'Convert to PNG';
DROP TEMPORARY TABLE tmp_events;
IF (in_auto_setup) THEN
CALL sys.ps_setup_reload_saved();
END IF;
IF (v_this_thread_enabed = 'YES') THEN
CALL sys.ps_setup_enable_thread(CONNECTION_ID());
END IF;
SET sql_log_bin = @log_bin;
END
|
mariadb.sys@localhost |
2026-04-10 15:41:08 |
2026-04-10 15:41:08 |
|
Description
Dumps all d... |
utf8mb3 |
utf8mb3_general_ci |
utf8mb3_general_ci |
BEGIN
DECLARE v_done bool DEFAULT FALSE;
DECLARE v_start, v_runtime DECIMAL(20,2) DEFAULT 0.0;
DECLARE v_min_event_id bigint unsigned DEFAULT 0;
DECLARE v_this_thread_enabed ENUM('YES', 'NO');
DECLARE v_event longtext;
DECLARE c_stack CURSOR FOR
SELECT CONCAT(IF(nesting_event_id IS NOT NULL, CONCAT(nesting_event_id, ' -> '), ''),
event_id, '; ', event_id, ' [label="',
'(', sys.format_time(timer_wait), ') ',
IF (event_name NOT LIKE 'wait/io%',
SUBSTRING_INDEX(event_name, '/', -2),
IF (event_name NOT LIKE 'wait/io/file%' OR event_name NOT LIKE 'wait/io/socket%',
SUBSTRING_INDEX(event_name, '/', -4),
event_name)
),
IF (event_name LIKE 'statement/%', IFNULL(CONCAT('\n', wait_info), ''), ''),
IF (in_debug AND event_name LIKE 'wait%', wait_info, ''),
'", ',
CASE WHEN event_name LIKE 'wait/io/file%' THEN
'shape=box, style=filled, color=red'
WHEN event_name LIKE 'wait/io/table%' THEN
'shape=box, style=filled, color=green'
WHEN event_name LIKE 'wait/io/socket%' THEN
'shape=box, style=filled, color=yellow'
WHEN event_name LIKE 'wait/synch/mutex%' THEN
'style=filled, color=lightskyblue'
WHEN event_name LIKE 'wait/synch/cond%' THEN
'style=filled, color=darkseagreen3'
WHEN event_name LIKE 'wait/synch/rwlock%' THEN
'style=filled, color=orchid'
WHEN event_name LIKE 'wait/lock%' THEN
'shape=box, style=filled, color=tan'
WHEN event_name LIKE 'statement/%' THEN
CONCAT('shape=box, style=bold',
CASE WHEN event_name LIKE 'statement/com/%' THEN
' style=filled, color=darkseagreen'
ELSE
IF((timer_wait/1000000000000) > @@log_slow_query_time,
' style=filled, color=red',
' style=filled, color=lightblue')
END
)
WHEN event_name LIKE 'stage/%' THEN
'style=filled, color=slategray3'
WHEN event_name LIKE '%idle%' THEN
'shape=box, style=filled, color=firebrick3'
ELSE '' END,
'];\n'
) event, event_id
FROM (
(SELECT thread_id, event_id, event_name, timer_wait, timer_start, nesting_event_id,
CONCAT(sql_text, '\n',
'errors: ', errors, '\n',
'warnings: ', warnings, '\n',
'lock time: ', sys.format_time(lock_time),'\n',
'rows affected: ', rows_affected, '\n',
'rows sent: ', rows_sent, '\n',
'rows examined: ', rows_examined, '\n',
'tmp tables: ', created_tmp_tables, '\n',
'tmp disk tables: ', created_tmp_disk_tables, '\n'
'select scan: ', select_scan, '\n',
'select full join: ', select_full_join, '\n',
'select full range join: ', select_full_range_join, '\n',
'select range: ', select_range, '\n',
'select range check: ', select_range_check, '\n',
'sort merge passes: ', sort_merge_passes, '\n',
'sort rows: ', sort_rows, '\n',
'sort range: ', sort_range, '\n',
'sort scan: ', sort_scan, '\n',
'no index used: ', IF(no_index_used, 'TRUE', 'FALSE'), '\n',
'no good index used: ', IF(no_good_index_used, 'TRUE', 'FALSE'), '\n'
) AS wait_info
FROM performance_schema.events_statements_history_long
WHERE thread_id = in_thread_id AND event_id > v_min_event_id)
UNION
(SELECT thread_id, event_id, event_name, timer_wait, timer_start, nesting_event_id, null AS wait_info
FROM performance_schema.events_stages_history_long
WHERE thread_id = in_thread_id AND event_id > v_min_event_id)
UNION
(SELECT thread_id, event_id,
CONCAT(event_name,
IF(event_name NOT LIKE 'wait/synch/mutex%', IFNULL(CONCAT(' - ', operation), ''), ''),
IF(number_of_bytes IS NOT NULL, CONCAT(' ', number_of_bytes, ' bytes'), ''),
IF(event_name LIKE 'wait/io/file%', '\n', ''),
IF(object_schema IS NOT NULL, CONCAT('\nObject: ', object_schema, '.'), ''),
IF(object_name IS NOT NULL,
IF (event_name LIKE 'wait/io/socket%',
CONCAT('\n', IF (object_name LIKE ':0%', @@socket, object_name)),
object_name),
''
),
IF(index_name IS NOT NULL, CONCAT(' Index: ', index_name), ''), '\n'
) AS event_name,
timer_wait, timer_start, nesting_event_id, source AS wait_info
FROM performance_schema.events_waits_history_long
WHERE thread_id = in_thread_id AND event_id > v_min_event_id)
) events
ORDER BY event_id;
DECLARE CONTINUE HANDLER FOR NOT FOUND SET v_done = TRUE;
SET @log_bin := @@sql_log_bin;
SET sql_log_bin = 0;
SELECT INSTRUMENTED INTO v_this_thread_enabed FROM performance_schema.threads WHERE PROCESSLIST_ID = CONNECTION_ID();
CALL sys.ps_setup_disable_thread(CONNECTION_ID());
IF (in_auto_setup) THEN
CALL sys.ps_setup_save(0);
DELETE FROM performance_schema.setup_actors;
UPDATE performance_schema.threads
SET INSTRUMENTED = IF(THREAD_ID = in_thread_id, 'YES', 'NO');
UPDATE performance_schema.setup_consumers
SET ENABLED = 'YES'
WHERE NAME NOT LIKE '%\_history';
UPDATE performance_schema.setup_instruments
SET ENABLED = 'YES',
TIMED = 'YES';
END IF;
IF (in_start_fresh) THEN
TRUNCATE performance_schema.events_statements_history_long;
TRUNCATE performance_schema.events_stages_history_long;
TRUNCATE performance_schema.events_waits_history_long;
END IF;
DROP TEMPORARY TABLE IF EXISTS tmp_events;
CREATE TEMPORARY TABLE tmp_events (
event_id bigint unsigned NOT NULL,
event longblob,
PRIMARY KEY (event_id)
);
INSERT INTO tmp_events VALUES (0, CONCAT('digraph events { rankdir=LR; nodesep=0.10;\n',
'// Stack created .....: ', NOW(), '\n',
'// MySQL version .....: ', VERSION(), '\n',
'// MySQL hostname ....: ', @@hostname, '\n',
'// MySQL port ........: ', @@port, '\n',
'// MySQL socket ......: ', @@socket, '\n',
'// MySQL user ........: ', CURRENT_USER(), '\n'));
SELECT CONCAT('Data collection starting for THREAD_ID = ', in_thread_id) AS 'Info';
SET v_min_event_id = 0,
v_start = UNIX_TIMESTAMP(),
in_interval = IFNULL(in_interval, 1.00),
in_max_runtime = IFNULL(in_max_runtime, 60.00);
WHILE (v_runtime < in_max_runtime
AND (SELECT INSTRUMENTED FROM performance_schema.threads WHERE THREAD_ID = in_thread_id) = 'YES') DO
SET v_done = FALSE;
OPEN c_stack;
c_stack_loop: LOOP
FETCH c_stack INTO v_event, v_min_event_id;
IF v_done THEN
LEAVE c_stack_loop;
END IF;
IF (LENGTH(v_event) > 0) THEN
INSERT INTO tmp_events VALUES (v_min_event_id, v_event);
END IF;
END LOOP;
CLOSE c_stack;
SELECT SLEEP(in_interval) INTO @sleep;
SET v_runtime = (UNIX_TIMESTAMP() - v_start);
END WHILE;
INSERT INTO tmp_events VALUES (v_min_event_id+1, '}');
SET @query = CONCAT('SELECT event FROM tmp_events ORDER BY event_id INTO OUTFILE ''', in_outfile, ''' FIELDS ESCAPED BY '''' LINES TERMINATED BY ''''');
PREPARE stmt_output FROM @query;
EXECUTE stmt_output;
DEALLOCATE PREPARE stmt_output;
SELECT CONCAT('Stack trace written to ', in_outfile) AS 'Info';
SELECT CONCAT('dot -Tpdf -o /tmp/stack_', in_thread_id, '.pdf ', in_outfile) AS 'Convert to PDF';
SELECT CONCAT('dot -Tpng -o /tmp/stack_', in_thread_id, '.png ', in_outfile) AS 'Convert to PNG';
DROP TEMPORARY TABLE tmp_events;
IF (in_auto_setup) THEN
CALL sys.ps_setup_reload_saved();
END IF;
IF (v_this_thread_enabed = 'YES') THEN
CALL sys.ps_setup_enable_thread(CONNECTION_ID());
END IF;
SET sql_log_bin = @log_bin;
END
|
NONE |
|
|
Edit
|
Copy
|
Delete
DELETE FROM proc WHERE `proc`.`db` = 'sys' AND `proc`.`name` = 'format_path' AND `proc`.`type` = 'FUNCTION'
|
sys |
format_path |
FUNCTION |
format_path |
SQL |
NO_SQL |
YES |
INVOKER |
in_path VARCHAR(512)
|
varchar(512) CHARSET utf8mb3 COLLATE utf8mb3_general_ci
|
BEGIN
DECLARE v_dir VARCHAR(1024);
DECLARE v_path VARCHAR(512);
DECLARE path_separator CHAR(1) DEFAULT '/';
IF @@global.version_compile_os LIKE 'win%' THEN
SET path_separator = '\\';
END IF;
IF in_path LIKE '/private/%' THEN
SET v_path = REPLACE(in_path, '/private', '');
ELSE
SET v_path = in_path;
END IF;
SET v_dir= IFNULL((SELECT VARIABLE_VALUE FROM information_schema.global_variables WHERE VARIABLE_NAME = 'innodb_data_home_dir'), '');
IF v_path IS NULL THEN
RETURN NULL;
END IF;
IF v_path LIKE CONCAT(@@global.datadir, IF(SUBSTRING(@@global.datadir, -1) = path_separator, '%', CONCAT(path_separator, '%'))) ESCAPE '|' THEN
SET v_path = REPLACE(v_path, @@global.datadir, CONCAT('@@datadir', IF(SUBSTRING(@@global.datadir, -1) = path_separator, path_separator, '')));
RETURN v_path;
END IF;
IF v_path LIKE CONCAT(@@global.tmpdir, IF(SUBSTRING(@@global.tmpdir, -1) = path_separator, '%', CONCAT(path_separator, '%'))) ESCAPE '|' THEN
SET v_path = REPLACE(v_path, @@global.tmpdir, CONCAT('@@tmpdir', IF(SUBSTRING(@@global.tmpdir, -1) = path_separator, path_separator, '')));
RETURN v_path;
END IF;
SET v_dir= IFNULL((SELECT VARIABLE_VALUE FROM information_schema.global_variables WHERE VARIABLE_NAME = 'innodb_data_home_dir'), '');
IF v_path LIKE CONCAT(v_dir, IF(SUBSTRING(v_dir, -1) = path_separator, '%', CONCAT(path_separator, '%'))) ESCAPE '|' THEN
SET v_path = REPLACE(v_path, v_dir, CONCAT('@@innodb_data_home_dir', IF(SUBSTRING(v_dir, -1) = path_separator, path_separator, '')));
RETURN v_path;
END IF;
SET v_dir= IFNULL((SELECT VARIABLE_VALUE FROM information_schema.global_variables WHERE VARIABLE_NAME = 'innodb_log_group_home_dir'), '');
IF v_path LIKE CONCAT(v_dir, IF(SUBSTRING(v_dir, -1) = path_separator, '%', CONCAT(path_separator, '%'))) ESCAPE '|' THEN
SET v_path = REPLACE(v_path, v_dir, CONCAT('@@innodb_log_group_home_dir', IF(SUBSTRING(v_dir, -1) = path_separator, path_separator, '')));
RETURN v_path;
END IF;
SET v_dir= IFNULL((SELECT VARIABLE_VALUE FROM information_schema.global_variables WHERE VARIABLE_NAME = 'slave_load_tmpdir'), '');
IF v_path LIKE CONCAT(v_dir, IF(SUBSTRING(v_dir, -1) = path_separator, '%', CONCAT(path_separator, '%'))) ESCAPE '|' THEN
SET v_path = REPLACE(v_path, v_dir, CONCAT('@@slave_load_tmpdir', IF(SUBSTRING(v_dir, -1) = path_separator, path_separator, '')));
RETURN v_path;
END IF;
SET v_dir = IFNULL((SELECT VARIABLE_VALUE FROM information_schema.global_variables WHERE VARIABLE_NAME = 'innodb_undo_directory'), '');
IF v_path LIKE CONCAT(v_dir, IF(SUBSTRING(v_dir, -1) = path_separator, '%', CONCAT(path_separator, '%'))) ESCAPE '|' THEN
SET v_path = REPLACE(v_path, v_dir, CONCAT('@@innodb_undo_directory', IF(SUBSTRING(v_dir, -1) = path_separator, path_separator, '')));
RETURN v_path;
END IF;
IF v_path LIKE CONCAT(@@global.basedir, IF(SUBSTRING(@@global.basedir, -1) = path_separator, '%', CONCAT(path_separator, '%'))) ESCAPE '|' THEN
SET v_path = REPLACE(v_path, @@global.basedir, CONCAT('@@basedir', IF(SUBSTRING(@@global.basedir, -1) = path_separator, path_separator, '')));
RETURN v_path;
END IF;
RETURN v_path;
END
|
mariadb.sys@localhost |
2026-04-10 15:41:07 |
2026-04-10 15:41:07 |
|
Description
Takes a raw... |
utf8mb3 |
utf8mb3_general_ci |
utf8mb3_general_ci |
BEGIN
DECLARE v_dir VARCHAR(1024);
DECLARE v_path VARCHAR(512);
DECLARE path_separator CHAR(1) DEFAULT '/';
IF @@global.version_compile_os LIKE 'win%' THEN
SET path_separator = '\';
END IF;
IF in_path LIKE '/private/%' THEN
SET v_path = REPLACE(in_path, '/private', '');
ELSE
SET v_path = in_path;
END IF;
SET v_dir= IFNULL((SELECT VARIABLE_VALUE FROM information_schema.global_variables WHERE VARIABLE_NAME = 'innodb_data_home_dir'), '');
IF v_path IS NULL THEN
RETURN NULL;
END IF;
IF v_path LIKE CONCAT(@@global.datadir, IF(SUBSTRING(@@global.datadir, -1) = path_separator, '%', CONCAT(path_separator, '%'))) ESCAPE '|' THEN
SET v_path = REPLACE(v_path, @@global.datadir, CONCAT('@@datadir', IF(SUBSTRING(@@global.datadir, -1) = path_separator, path_separator, '')));
RETURN v_path;
END IF;
IF v_path LIKE CONCAT(@@global.tmpdir, IF(SUBSTRING(@@global.tmpdir, -1) = path_separator, '%', CONCAT(path_separator, '%'))) ESCAPE '|' THEN
SET v_path = REPLACE(v_path, @@global.tmpdir, CONCAT('@@tmpdir', IF(SUBSTRING(@@global.tmpdir, -1) = path_separator, path_separator, '')));
RETURN v_path;
END IF;
SET v_dir= IFNULL((SELECT VARIABLE_VALUE FROM information_schema.global_variables WHERE VARIABLE_NAME = 'innodb_data_home_dir'), '');
IF v_path LIKE CONCAT(v_dir, IF(SUBSTRING(v_dir, -1) = path_separator, '%', CONCAT(path_separator, '%'))) ESCAPE '|' THEN
SET v_path = REPLACE(v_path, v_dir, CONCAT('@@innodb_data_home_dir', IF(SUBSTRING(v_dir, -1) = path_separator, path_separator, '')));
RETURN v_path;
END IF;
SET v_dir= IFNULL((SELECT VARIABLE_VALUE FROM information_schema.global_variables WHERE VARIABLE_NAME = 'innodb_log_group_home_dir'), '');
IF v_path LIKE CONCAT(v_dir, IF(SUBSTRING(v_dir, -1) = path_separator, '%', CONCAT(path_separator, '%'))) ESCAPE '|' THEN
SET v_path = REPLACE(v_path, v_dir, CONCAT('@@innodb_log_group_home_dir', IF(SUBSTRING(v_dir, -1) = path_separator, path_separator, '')));
RETURN v_path;
END IF;
SET v_dir= IFNULL((SELECT VARIABLE_VALUE FROM information_schema.global_variables WHERE VARIABLE_NAME = 'slave_load_tmpdir'), '');
IF v_path LIKE CONCAT(v_dir, IF(SUBSTRING(v_dir, -1) = path_separator, '%', CONCAT(path_separator, '%'))) ESCAPE '|' THEN
SET v_path = REPLACE(v_path, v_dir, CONCAT('@@slave_load_tmpdir', IF(SUBSTRING(v_dir, -1) = path_separator, path_separator, '')));
RETURN v_path;
END IF;
SET v_dir = IFNULL((SELECT VARIABLE_VALUE FROM information_schema.global_variables WHERE VARIABLE_NAME = 'innodb_undo_directory'), '');
IF v_path LIKE CONCAT(v_dir, IF(SUBSTRING(v_dir, -1) = path_separator, '%', CONCAT(path_separator, '%'))) ESCAPE '|' THEN
SET v_path = REPLACE(v_path, v_dir, CONCAT('@@innodb_undo_directory', IF(SUBSTRING(v_dir, -1) = path_separator, path_separator, '')));
RETURN v_path;
END IF;
IF v_path LIKE CONCAT(@@global.basedir, IF(SUBSTRING(@@global.basedir, -1) = path_separator, '%', CONCAT(path_separator, '%'))) ESCAPE '|' THEN
SET v_path = REPLACE(v_path, @@global.basedir, CONCAT('@@basedir', IF(SUBSTRING(@@global.basedir, -1) = path_separator, path_separator, '')));
RETURN v_path;
END IF;
RETURN v_path;
END
|
NONE |
|
|
Edit
|
Copy
|
Delete
DELETE FROM proc WHERE `proc`.`db` = 'sys' AND `proc`.`name` = 'format_statement' AND `proc`.`type` = 'FUNCTION'
|
sys |
format_statement |
FUNCTION |
format_statement |
SQL |
NO_SQL |
YES |
INVOKER |
statement LONGTEXT
|
longtext CHARSET utf8mb3 COLLATE utf8mb3_general_ci
|
BEGIN
IF @sys.statement_truncate_len IS NULL THEN
SET @sys.statement_truncate_len = sys_get_config('statement_truncate_len', 64);
END IF;
IF CHAR_LENGTH(statement) > @sys.statement_truncate_len THEN
RETURN REPLACE(CONCAT(LEFT(statement, (@sys.statement_truncate_len/2)-2), ' ... ', RIGHT(statement, (@sys.statement_truncate_len/2)-2)), '\n', ' ');
ELSE
RETURN REPLACE(statement, '\n', ' ');
END IF;
END
|
mariadb.sys@localhost |
2026-04-10 15:41:07 |
2026-04-10 15:41:07 |
|
Description
Formats a n... |
utf8mb3 |
utf8mb3_general_ci |
utf8mb3_general_ci |
BEGIN
IF @sys.statement_truncate_len IS NULL THEN
SET @sys.statement_truncate_len = sys_get_config('statement_truncate_len', 64);
END IF;
IF CHAR_LENGTH(statement) > @sys.statement_truncate_len THEN
RETURN REPLACE(CONCAT(LEFT(statement, (@sys.statement_truncate_len/2)-2), ' ... ', RIGHT(statement, (@sys.statement_truncate_len/2)-2)), '\n', ' ');
ELSE
RETURN REPLACE(statement, '\n', ' ');
END IF;
END
|
NONE |
|
|
Edit
|
Copy
|
Delete
DELETE FROM proc WHERE `proc`.`db` = 'sys' AND `proc`.`name` = 'list_add' AND `proc`.`type` = 'FUNCTION'
|
sys |
list_add |
FUNCTION |
list_add |
SQL |
CONTAINS_SQL |
YES |
INVOKER |
in_list TEXT,
in_add_value TEXT
|
text CHARSET utf8mb3 COLLATE utf8mb3_general_ci
|
BEGIN
IF (in_add_value IS NULL) THEN
SIGNAL SQLSTATE '02200'
SET MESSAGE_TEXT = 'Function sys.list_add: in_add_value input variable should not be NULL',
MYSQL_ERRNO = 1138;
END IF;
IF (in_list IS NULL OR LENGTH(in_list) = 0) THEN
RETURN in_add_value;
END IF;
RETURN (SELECT CONCAT(TRIM(BOTH ',' FROM TRIM(in_list)), ',', in_add_value));
END
|
mariadb.sys@localhost |
2026-04-10 15:41:07 |
2026-04-10 15:41:07 |
|
Description
Takes a lis... |
utf8mb3 |
utf8mb3_general_ci |
utf8mb3_general_ci |
BEGIN
IF (in_add_value IS NULL) THEN
SIGNAL SQLSTATE '02200'
SET MESSAGE_TEXT = 'Function sys.list_add: in_add_value input variable should not be NULL',
MYSQL_ERRNO = 1138;
END IF;
IF (in_list IS NULL OR LENGTH(in_list) = 0) THEN
RETURN in_add_value;
END IF;
RETURN (SELECT CONCAT(TRIM(BOTH ',' FROM TRIM(in_list)), ',', in_add_value));
END
|
NONE |
|
|
Edit
|
Copy
|
Delete
DELETE FROM proc WHERE `proc`.`db` = 'sys' AND `proc`.`name` = 'ps_setup_reset_to_default' AND `proc`.`type` = 'PROCEDURE'
|
sys |
ps_setup_reset_to_default |
PROCEDURE |
ps_setup_reset_to_default |
SQL |
MODIFIES_SQL_DATA |
NO |
INVOKER |
IN in_verbose BOOLEAN
|
|
BEGIN
SET @query = 'DELETE
FROM performance_schema.setup_actors
WHERE NOT (HOST = ''%'' AND USER = ''%'' AND ROLE = ''%'')';
IF (in_verbose) THEN
SELECT CONCAT('Resetting: setup_actors\n', REPLACE(@query, ' ', '')) AS status;
END IF;
PREPARE reset_stmt FROM @query;
EXECUTE reset_stmt;
DEALLOCATE PREPARE reset_stmt;
SET @query = 'INSERT IGNORE INTO performance_schema.setup_actors
VALUES (''%'', ''%'', ''%'', ''YES'', ''YES'')';
IF (in_verbose) THEN
SELECT CONCAT('Resetting: setup_actors\n', REPLACE(@query, ' ', '')) AS status;
END IF;
PREPARE reset_stmt FROM @query;
EXECUTE reset_stmt;
DEALLOCATE PREPARE reset_stmt;
SET @query = 'UPDATE performance_schema.setup_instruments
SET ENABLED = sys.ps_is_instrument_default_enabled(NAME),
TIMED = sys.ps_is_instrument_default_timed(NAME)';
IF (in_verbose) THEN
SELECT CONCAT('Resetting: setup_instruments\n', REPLACE(@query, ' ', '')) AS status;
END IF;
PREPARE reset_stmt FROM @query;
EXECUTE reset_stmt;
DEALLOCATE PREPARE reset_stmt;
SET @query = 'UPDATE performance_schema.setup_consumers
SET ENABLED = IF(NAME IN (''events_statements_current'', ''events_transactions_current'', ''global_instrumentation'', ''thread_instrumentation'', ''statements_digest''), ''YES'', ''NO'')';
IF (in_verbose) THEN
SELECT CONCAT('Resetting: setup_consumers\n', REPLACE(@query, ' ', '')) AS status;
END IF;
PREPARE reset_stmt FROM @query;
EXECUTE reset_stmt;
DEALLOCATE PREPARE reset_stmt;
SET @query = 'DELETE
FROM performance_schema.setup_objects
WHERE NOT (OBJECT_TYPE IN (''EVENT'', ''FUNCTION'', ''PROCEDURE'', ''TABLE'', ''TRIGGER'') AND OBJECT_NAME = ''%''
AND (OBJECT_SCHEMA = ''mysql'' AND ENABLED = ''NO'' AND TIMED = ''NO'' )
OR (OBJECT_SCHEMA = ''performance_schema'' AND ENABLED = ''NO'' AND TIMED = ''NO'' )
OR (OBJECT_SCHEMA = ''information_schema'' AND ENABLED = ''NO'' AND TIMED = ''NO'' )
OR (OBJECT_SCHEMA = ''%'' AND ENABLED = ''YES'' AND TIMED = ''YES''))';
IF (in_verbose) THEN
SELECT CONCAT('Resetting: setup_objects\n', REPLACE(@query, ' ', '')) AS status;
END IF;
PREPARE reset_stmt FROM @query;
EXECUTE reset_stmt;
DEALLOCATE PREPARE reset_stmt;
SET @query = 'INSERT IGNORE INTO performance_schema.setup_objects
VALUES (''EVENT'' , ''mysql'' , ''%'', ''NO'' , ''NO'' ),
(''EVENT'' , ''performance_schema'', ''%'', ''NO'' , ''NO'' ),
(''EVENT'' , ''information_schema'', ''%'', ''NO'' , ''NO'' ),
(''EVENT'' , ''%'' , ''%'', ''YES'', ''YES''),
(''FUNCTION'' , ''mysql'' , ''%'', ''NO'' , ''NO'' ),
(''FUNCTION'' , ''performance_schema'', ''%'', ''NO'' , ''NO'' ),
(''FUNCTION'' , ''information_schema'', ''%'', ''NO'' , ''NO'' ),
(''FUNCTION'' , ''%'' , ''%'', ''YES'', ''YES''),
(''PROCEDURE'', ''mysql'' , ''%'', ''NO'' , ''NO'' ),
(''PROCEDURE'', ''performance_schema'', ''%'', ''NO'' , ''NO'' ),
(''PROCEDURE'', ''information_schema'', ''%'', ''NO'' , ''NO'' ),
(''PROCEDURE'', ''%'' , ''%'', ''YES'', ''YES''),
(''TABLE'' , ''mysql'' , ''%'', ''NO'' , ''NO'' ),
(''TABLE'' , ''performance_schema'', ''%'', ''NO'' , ''NO'' ),
(''TABLE'' , ''information_schema'', ''%'', ''NO'' , ''NO'' ),
(''TABLE'' , ''%'' , ''%'', ''YES'', ''YES''),
(''TRIGGER'' , ''mysql'' , ''%'', ''NO'' , ''NO'' ),
(''TRIGGER'' , ''performance_schema'', ''%'', ''NO'' , ''NO'' ),
(''TRIGGER'' , ''information_schema'', ''%'', ''NO'' , ''NO'' ),
(''TRIGGER'' , ''%'' , ''%'', ''YES'', ''YES'')';
IF (in_verbose) THEN
SELECT CONCAT('Resetting: setup_objects\n', REPLACE(@query, ' ', '')) AS status;
END IF;
PREPARE reset_stmt FROM @query;
EXECUTE reset_stmt;
DEALLOCATE PREPARE reset_stmt;
SET @query = 'UPDATE performance_schema.threads
SET INSTRUMENTED = ''YES''';
IF (in_verbose) THEN
SELECT CONCAT('Resetting: threads\n', REPLACE(@query, ' ', '')) AS status;
END IF;
PREPARE reset_stmt FROM @query;
EXECUTE reset_stmt;
DEALLOCATE PREPARE reset_stmt;
END
|
mariadb.sys@localhost |
2026-04-10 15:41:08 |
2026-04-10 15:41:08 |
|
Description
Resets the ... |
utf8mb3 |
utf8mb3_general_ci |
utf8mb3_general_ci |
BEGIN
SET @query = 'DELETE\n FROM performance_schema.setup_actors\n WHERE NOT (HOST = ''%'' AND USER = ''%'' AND ROLE = ''%'')';
IF (in_verbose) THEN
SELECT CONCAT('Resetting: setup_actors\n', REPLACE(@query, ' ', '')) AS status;
END IF;
PREPARE reset_stmt FROM @query;
EXECUTE reset_stmt;
DEALLOCATE PREPARE reset_stmt;
SET @query = 'INSERT IGNORE INTO performance_schema.setup_actors\n VALUES (''%'', ''%'', ''%'', ''YES'', ''YES'')';
IF (in_verbose) THEN
SELECT CONCAT('Resetting: setup_actors\n', REPLACE(@query, ' ', '')) AS status;
END IF;
PREPARE reset_stmt FROM @query;
EXECUTE reset_stmt;
DEALLOCATE PREPARE reset_stmt;
SET @query = 'UPDATE performance_schema.setup_instruments\n SET ENABLED = sys.ps_is_instrument_default_enabled(NAME),\n TIMED = sys.ps_is_instrument_default_timed(NAME)';
IF (in_verbose) THEN
SELECT CONCAT('Resetting: setup_instruments\n', REPLACE(@query, ' ', '')) AS status;
END IF;
PREPARE reset_stmt FROM @query;
EXECUTE reset_stmt;
DEALLOCATE PREPARE reset_stmt;
SET @query = 'UPDATE performance_schema.setup_consumers\n SET ENABLED = IF(NAME IN (''events_statements_current'', ''events_transactions_current'', ''global_instrumentation'', ''thread_instrumentation'', ''statements_digest''), ''YES'', ''NO'')';
IF (in_verbose) THEN
SELECT CONCAT('Resetting: setup_consumers\n', REPLACE(@query, ' ', '')) AS status;
END IF;
PREPARE reset_stmt FROM @query;
EXECUTE reset_stmt;
DEALLOCATE PREPARE reset_stmt;
SET @query = 'DELETE\n FROM performance_schema.setup_objects\n WHERE NOT (OBJECT_TYPE IN (''EVENT'', ''FUNCTION'', ''PROCEDURE'', ''TABLE'', ''TRIGGER'') AND OBJECT_NAME = ''%''\n AND (OBJECT_SCHEMA = ''mysql'' AND ENABLED = ''NO'' AND TIMED = ''NO'' )\n OR (OBJECT_SCHEMA = ''performance_schema'' AND ENABLED = ''NO'' AND TIMED = ''NO'' )\n OR (OBJECT_SCHEMA = ''information_schema'' AND ENABLED = ''NO'' AND TIMED = ''NO'' )\n OR (OBJECT_SCHEMA = ''%'' AND ENABLED = ''YES'' AND TIMED = ''YES''))';
IF (in_verbose) THEN
SELECT CONCAT('Resetting: setup_objects\n', REPLACE(@query, ' ', '')) AS status;
END IF;
PREPARE reset_stmt FROM @query;
EXECUTE reset_stmt;
DEALLOCATE PREPARE reset_stmt;
SET @query = 'INSERT IGNORE INTO performance_schema.setup_objects\n VALUES (''EVENT'' , ''mysql'' , ''%'', ''NO'' , ''NO'' ),\n (''EVENT'' , ''performance_schema'', ''%'', ''NO'' , ''NO'' ),\n (''EVENT'' , ''information_schema'', ''%'', ''NO'' , ''NO'' ),\n (''EVENT'' , ''%'' , ''%'', ''YES'', ''YES''),\n (''FUNCTION'' , ''mysql'' , ''%'', ''NO'' , ''NO'' ),\n (''FUNCTION'' , ''performance_schema'', ''%'', ''NO'' , ''NO'' ),\n (''FUNCTION'' , ''information_schema'', ''%'', ''NO'' , ''NO'' ),\n (''FUNCTION'' , ''%'' , ''%'', ''YES'', ''YES''),\n (''PROCEDURE'', ''mysql'' , ''%'', ''NO'' , ''NO'' ),\n (''PROCEDURE'', ''performance_schema'', ''%'', ''NO'' , ''NO'' ),\n (''PROCEDURE'', ''information_schema'', ''%'', ''NO'' , ''NO'' ),\n (''PROCEDURE'', ''%'' , ''%'', ''YES'', ''YES''),\n (''TABLE'' , ''mysql'' , ''%'', ''NO'' , ''NO'' ),\n (''TABLE'' , ''performance_schema'', ''%'', ''NO'' , ''NO'' ),\n (''TABLE'' , ''information_schema'', ''%'', ''NO'' , ''NO'' ),\n (''TABLE'' , ''%'' , ''%'', ''YES'', ''YES''),\n (''TRIGGER'' , ''mysql'' , ''%'', ''NO'' , ''NO'' ),\n (''TRIGGER'' , ''performance_schema'', ''%'', ''NO'' , ''NO'' ),\n (''TRIGGER'' , ''information_schema'', ''%'', ''NO'' , ''NO'' ),\n (''TRIGGER'' , ''%'' , ''%'', ''YES'', ''YES'')';
IF (in_verbose) THEN
SELECT CONCAT('Resetting: setup_objects\n', REPLACE(@query, ' ', '')) AS status;
END IF;
PREPARE reset_stmt FROM @query;
EXECUTE reset_stmt;
DEALLOCATE PREPARE reset_stmt;
SET @query = 'UPDATE performance_schema.threads\n SET INSTRUMENTED = ''YES''';
IF (in_verbose) THEN
SELECT CONCAT('Resetting: threads\n', REPLACE(@query, ' ', '')) AS status;
END IF;
PREPARE reset_stmt FROM @query;
EXECUTE reset_stmt;
DEALLOCATE PREPARE reset_stmt;
END
|
NONE |
|
|
Edit
|
Copy
|
Delete
DELETE FROM proc WHERE `proc`.`db` = 'sys' AND `proc`.`name` = 'ps_setup_show_disabled_instruments' AND `proc`.`type` = 'PROCEDURE'
|
sys |
ps_setup_show_disabled_instruments |
PROCEDURE |
ps_setup_show_disabled_instruments |
SQL |
READS_SQL_DATA |
YES |
INVOKER |
|
|
BEGIN
SELECT name AS disabled_instruments, timed
FROM performance_schema.setup_instruments
WHERE enabled = 'NO'
ORDER BY disabled_instruments;
END
|
mariadb.sys@localhost |
2026-04-10 15:41:08 |
2026-04-10 15:41:08 |
|
Description
Shows all c... |
utf8mb3 |
utf8mb3_general_ci |
utf8mb3_general_ci |
BEGIN
SELECT name AS disabled_instruments, timed
FROM performance_schema.setup_instruments
WHERE enabled = 'NO'
ORDER BY disabled_instruments;
END
|
NONE |
|
|
Edit
|
Copy
|
Delete
DELETE FROM proc WHERE `proc`.`db` = 'sys' AND `proc`.`name` = 'ps_setup_show_enabled_instruments' AND `proc`.`type` = 'PROCEDURE'
|
sys |
ps_setup_show_enabled_instruments |
PROCEDURE |
ps_setup_show_enabled_instruments |
SQL |
READS_SQL_DATA |
YES |
INVOKER |
|
|
BEGIN
SELECT name AS enabled_instruments, timed
FROM performance_schema.setup_instruments
WHERE enabled = 'YES'
ORDER BY enabled_instruments;
END
|
mariadb.sys@localhost |
2026-04-10 15:41:08 |
2026-04-10 15:41:08 |
|
Description
Shows all c... |
utf8mb3 |
utf8mb3_general_ci |
utf8mb3_general_ci |
BEGIN
SELECT name AS enabled_instruments, timed
FROM performance_schema.setup_instruments
WHERE enabled = 'YES'
ORDER BY enabled_instruments;
END
|
NONE |
|
|
Edit
|
Copy
|
Delete
DELETE FROM proc WHERE `proc`.`db` = 'sys' AND `proc`.`name` = 'statement_performance_analyzer' AND `proc`.`type` = 'PROCEDURE'
|
sys |
statement_performance_analyzer |
PROCEDURE |
statement_performance_analyzer |
SQL |
CONTAINS_SQL |
NO |
INVOKER |
IN in_action ENUM('snapshot', 'overall', 'delta', 'create_table', 'create_tmp', 'save', 'cleanup'),
IN in_table VARCHAR(129),
IN in_views SET ('with_runtimes_in_95th_percentile', 'analysis', 'with_errors_or_warnings', 'with_full_table_scans', 'with_sorting', 'with_temp_tables', 'custom')
|
|
BEGIN
DECLARE v_table_exists, v_tmp_digests_table_exists, v_custom_view_exists ENUM('', 'BASE TABLE', 'VIEW', 'TEMPORARY') DEFAULT '';
DECLARE v_this_thread_enabled ENUM('YES', 'NO');
DECLARE v_force_new_snapshot BOOLEAN DEFAULT FALSE;
DECLARE v_digests_table VARCHAR(133);
DECLARE v_quoted_table, v_quoted_custom_view VARCHAR(133) DEFAULT '';
DECLARE v_table_db, v_table_name, v_custom_db, v_custom_name VARCHAR(64);
DECLARE v_digest_table_template, v_checksum_ref, v_checksum_table text;
DECLARE v_sql longtext;
DECLARE v_error_msg VARCHAR(128);
SELECT INSTRUMENTED INTO v_this_thread_enabled FROM performance_schema.threads WHERE PROCESSLIST_ID = CONNECTION_ID();
IF (v_this_thread_enabled = 'YES') THEN
CALL sys.ps_setup_disable_thread(CONNECTION_ID());
END IF;
SET @log_bin := @@sql_log_bin;
IF (@log_bin = 1) THEN
SET sql_log_bin = 0;
END IF;
IF (@sys.statement_performance_analyzer.limit IS NULL) THEN
SET @sys.statement_performance_analyzer.limit = sys.sys_get_config('statement_performance_analyzer.limit', '100');
END IF;
IF (@sys.debug IS NULL) THEN
SET @sys.debug = sys.sys_get_config('debug' , 'OFF');
END IF;
IF (in_table = 'NOW()') THEN
SET v_force_new_snapshot = TRUE,
in_table = NULL;
ELSEIF (in_table IS NOT NULL) THEN
IF (NOT INSTR(in_table, '.')) THEN
SET v_table_db = DATABASE(),
v_table_name = in_table;
ELSE
SET v_table_db = SUBSTRING_INDEX(in_table, '.', 1);
SET v_table_name = SUBSTRING(in_table, CHAR_LENGTH(v_table_db)+2);
END IF;
SET v_quoted_table = CONCAT('`', v_table_db, '`.`', v_table_name, '`');
IF (@sys.debug = 'ON') THEN
SELECT CONCAT('in_table is: db = ''', v_table_db, ''', table = ''', v_table_name, '''') AS 'Debug';
END IF;
IF (v_table_db = DATABASE() AND (v_table_name = 'tmp_digests' OR v_table_name = 'tmp_digests_delta')) THEN
SET v_error_msg = CONCAT('Invalid value for in_table: ', v_quoted_table, ' is reserved table name.');
SIGNAL SQLSTATE '45000'
SET MESSAGE_TEXT = v_error_msg;
END IF;
CALL sys.table_exists(v_table_db, v_table_name, v_table_exists);
IF (@sys.debug = 'ON') THEN
SELECT CONCAT('v_table_exists = ', v_table_exists) AS 'Debug';
END IF;
IF (v_table_exists = 'BASE TABLE') THEN
SET v_checksum_ref = (
SELECT GROUP_CONCAT(CONCAT(COLUMN_NAME, COLUMN_TYPE) ORDER BY ORDINAL_POSITION) AS Checksum
FROM information_schema.COLUMNS
WHERE TABLE_SCHEMA = 'performance_schema' AND TABLE_NAME = 'events_statements_summary_by_digest'
),
v_checksum_table = (
SELECT GROUP_CONCAT(CONCAT(COLUMN_NAME, COLUMN_TYPE) ORDER BY ORDINAL_POSITION) AS Checksum
FROM information_schema.COLUMNS
WHERE TABLE_SCHEMA = v_table_db AND TABLE_NAME = v_table_name
);
IF (v_checksum_ref <> v_checksum_table) THEN
SET v_error_msg = CONCAT('The table ',
IF(CHAR_LENGTH(v_quoted_table) > 93, CONCAT('...', SUBSTRING(v_quoted_table, -90)), v_quoted_table),
' has the wrong definition.');
SIGNAL SQLSTATE '45000'
SET MESSAGE_TEXT = v_error_msg;
END IF;
END IF;
END IF;
IF (in_views IS NULL OR in_views = '') THEN
SET in_views = 'with_runtimes_in_95th_percentile,analysis,with_errors_or_warnings,with_full_table_scans,with_sorting,with_temp_tables';
END IF;
CALL sys.table_exists(DATABASE(), 'tmp_digests', v_tmp_digests_table_exists);
IF (@sys.debug = 'ON') THEN
SELECT CONCAT('v_tmp_digests_table_exists = ', v_tmp_digests_table_exists) AS 'Debug';
END IF;
CASE
WHEN in_action IN ('snapshot', 'overall') THEN
IF (in_table IS NOT NULL) THEN
IF (NOT v_table_exists IN ('TEMPORARY', 'BASE TABLE')) THEN
SET v_error_msg = CONCAT('The ', in_action, ' action requires in_table to be NULL, NOW() or specify an existing table.',
' The table ',
IF(CHAR_LENGTH(v_quoted_table) > 16, CONCAT('...', SUBSTRING(v_quoted_table, -13)), v_quoted_table),
' does not exist.');
SIGNAL SQLSTATE '45000'
SET MESSAGE_TEXT = v_error_msg;
END IF;
END IF;
WHEN in_action IN ('delta', 'save') THEN
IF (v_table_exists NOT IN ('TEMPORARY', 'BASE TABLE')) THEN
SET v_error_msg = CONCAT('The ', in_action, ' action requires in_table to be an existing table.',
IF(in_table IS NOT NULL, CONCAT(' The table ',
IF(CHAR_LENGTH(v_quoted_table) > 39, CONCAT('...', SUBSTRING(v_quoted_table, -36)), v_quoted_table),
' does not exist.'), ''));
SIGNAL SQLSTATE '45000'
SET MESSAGE_TEXT = v_error_msg;
END IF;
IF (in_action = 'delta' AND v_tmp_digests_table_exists <> 'TEMPORARY') THEN
SIGNAL SQLSTATE '45000'
SET MESSAGE_TEXT = 'An existing snapshot generated with the statement_performance_analyzer() must exist.';
END IF;
WHEN in_action = 'create_tmp' THEN
IF (v_table_exists = 'TEMPORARY') THEN
SET v_error_msg = CONCAT('Cannot create the table ',
IF(CHAR_LENGTH(v_quoted_table) > 72, CONCAT('...', SUBSTRING(v_quoted_table, -69)), v_quoted_table),
' as it already exists.');
SIGNAL SQLSTATE '45000'
SET MESSAGE_TEXT = v_error_msg;
END IF;
WHEN in_action = 'create_table' THEN
IF (v_table_exists <> '') THEN
SET v_error_msg = CONCAT('Cannot create the table ',
IF(CHAR_LENGTH(v_quoted_table) > 52, CONCAT('...', SUBSTRING(v_quoted_table, -49)), v_quoted_table),
' as it already exists',
IF(v_table_exists = 'TEMPORARY', ' as a temporary table.', '.'));
SIGNAL SQLSTATE '45000'
SET MESSAGE_TEXT = v_error_msg;
END IF;
WHEN in_action = 'cleanup' THEN
DO (SELECT 1);
ELSE
SIGNAL SQLSTATE '45000'
SET MESSAGE_TEXT = 'Unknown action. Supported actions are: cleanup, create_table, create_tmp, delta, overall, save, snapshot';
END CASE;
SET v_digest_table_template = 'CREATE %{TEMPORARY}TABLE %{TABLE_NAME} (
`SCHEMA_NAME` varchar(64) DEFAULT NULL,
`DIGEST` varchar(32) DEFAULT NULL,
`DIGEST_TEXT` longtext,
`COUNT_STAR` bigint(20) unsigned NOT NULL,
`SUM_TIMER_WAIT` bigint(20) unsigned NOT NULL,
`MIN_TIMER_WAIT` bigint(20) unsigned NOT NULL,
`AVG_TIMER_WAIT` bigint(20) unsigned NOT NULL,
`MAX_TIMER_WAIT` bigint(20) unsigned NOT NULL,
`SUM_LOCK_TIME` bigint(20) unsigned NOT NULL,
`SUM_ERRORS` bigint(20) unsigned NOT NULL,
`SUM_WARNINGS` bigint(20) unsigned NOT NULL,
`SUM_ROWS_AFFECTED` bigint(20) unsigned NOT NULL,
`SUM_ROWS_SENT` bigint(20) unsigned NOT NULL,
`SUM_ROWS_EXAMINED` bigint(20) unsigned NOT NULL,
`SUM_CREATED_TMP_DISK_TABLES` bigint(20) unsigned NOT NULL,
`SUM_CREATED_TMP_TABLES` bigint(20) unsigned NOT NULL,
`SUM_SELECT_FULL_JOIN` bigint(20) unsigned NOT NULL,
`SUM_SELECT_FULL_RANGE_JOIN` bigint(20) unsigned NOT NULL,
`SUM_SELECT_RANGE` bigint(20) unsigned NOT NULL,
`SUM_SELECT_RANGE_CHECK` bigint(20) unsigned NOT NULL,
`SUM_SELECT_SCAN` bigint(20) unsigned NOT NULL,
`SUM_SORT_MERGE_PASSES` bigint(20) unsigned NOT NULL,
`SUM_SORT_RANGE` bigint(20) unsigned NOT NULL,
`SUM_SORT_ROWS` bigint(20) unsigned NOT NULL,
`SUM_SORT_SCAN` bigint(20) unsigned NOT NULL,
`SUM_NO_INDEX_USED` bigint(20) unsigned NOT NULL,
`SUM_NO_GOOD_INDEX_USED` bigint(20) unsigned NOT NULL,
`FIRST_SEEN` timestamp NULL DEFAULT NULL,
`LAST_SEEN` timestamp NULL DEFAULT NULL,
INDEX (SCHEMA_NAME, DIGEST)
) DEFAULT CHARSET=utf8';
IF (v_force_new_snapshot
OR in_action = 'snapshot'
OR (in_action = 'overall' AND in_table IS NULL)
OR (in_action = 'save' AND v_tmp_digests_table_exists <> 'TEMPORARY')
) THEN
IF (v_tmp_digests_table_exists = 'TEMPORARY') THEN
IF (@sys.debug = 'ON') THEN
SELECT 'DROP TEMPORARY TABLE IF EXISTS tmp_digests' AS 'Debug';
END IF;
DROP TEMPORARY TABLE IF EXISTS tmp_digests;
END IF;
CALL sys.execute_prepared_stmt(REPLACE(REPLACE(v_digest_table_template, '%{TEMPORARY}', 'TEMPORARY '), '%{TABLE_NAME}', 'tmp_digests'));
SET v_sql = CONCAT('INSERT INTO tmp_digests SELECT * FROM ',
IF(in_table IS NULL OR in_action = 'save', 'performance_schema.events_statements_summary_by_digest', v_quoted_table));
CALL sys.execute_prepared_stmt(v_sql);
END IF;
IF (in_action IN ('create_table', 'create_tmp')) THEN
IF (in_action = 'create_table') THEN
CALL sys.execute_prepared_stmt(REPLACE(REPLACE(v_digest_table_template, '%{TEMPORARY}', ''), '%{TABLE_NAME}', v_quoted_table));
ELSE
CALL sys.execute_prepared_stmt(REPLACE(REPLACE(v_digest_table_template, '%{TEMPORARY}', 'TEMPORARY '), '%{TABLE_NAME}', v_quoted_table));
END IF;
ELSEIF (in_action = 'save') THEN
CALL sys.execute_prepared_stmt(CONCAT('DELETE FROM ', v_quoted_table));
CALL sys.execute_prepared_stmt(CONCAT('INSERT INTO ', v_quoted_table, ' SELECT * FROM tmp_digests'));
ELSEIF (in_action = 'cleanup') THEN
DROP TEMPORARY TABLE IF EXISTS sys.tmp_digests;
DROP TEMPORARY TABLE IF EXISTS sys.tmp_digests_delta;
ELSEIF (in_action IN ('overall', 'delta')) THEN
IF (in_action = 'overall') THEN
IF (in_table IS NULL) THEN
SET v_digests_table = 'tmp_digests';
ELSE
SET v_digests_table = v_quoted_table;
END IF;
ELSE
SET v_digests_table = 'tmp_digests_delta';
DROP TEMPORARY TABLE IF EXISTS tmp_digests_delta;
CREATE TEMPORARY TABLE tmp_digests_delta LIKE tmp_digests;
SET v_sql = CONCAT('INSERT INTO tmp_digests_delta
SELECT `d_end`.`SCHEMA_NAME`,
`d_end`.`DIGEST`,
`d_end`.`DIGEST_TEXT`,
`d_end`.`COUNT_STAR`-IFNULL(`d_start`.`COUNT_STAR`, 0) AS ''COUNT_STAR'',
`d_end`.`SUM_TIMER_WAIT`-IFNULL(`d_start`.`SUM_TIMER_WAIT`, 0) AS ''SUM_TIMER_WAIT'',
`d_end`.`MIN_TIMER_WAIT` AS ''MIN_TIMER_WAIT'',
IFNULL((`d_end`.`SUM_TIMER_WAIT`-IFNULL(`d_start`.`SUM_TIMER_WAIT`, 0))/NULLIF(`d_end`.`COUNT_STAR`-IFNULL(`d_start`.`COUNT_STAR`, 0), 0), 0) AS ''AVG_TIMER_WAIT'',
`d_end`.`MAX_TIMER_WAIT` AS ''MAX_TIMER_WAIT'',
`d_end`.`SUM_LOCK_TIME`-IFNULL(`d_start`.`SUM_LOCK_TIME`, 0) AS ''SUM_LOCK_TIME'',
`d_end`.`SUM_ERRORS`-IFNULL(`d_start`.`SUM_ERRORS`, 0) AS ''SUM_ERRORS'',
`d_end`.`SUM_WARNINGS`-IFNULL(`d_start`.`SUM_WARNINGS`, 0) AS ''SUM_WARNINGS'',
`d_end`.`SUM_ROWS_AFFECTED`-IFNULL(`d_start`.`SUM_ROWS_AFFECTED`, 0) AS ''SUM_ROWS_AFFECTED'',
`d_end`.`SUM_ROWS_SENT`-IFNULL(`d_start`.`SUM_ROWS_SENT`, 0) AS ''SUM_ROWS_SENT'',
`d_end`.`SUM_ROWS_EXAMINED`-IFNULL(`d_start`.`SUM_ROWS_EXAMINED`, 0) AS ''SUM_ROWS_EXAMINED'',
`d_end`.`SUM_CREATED_TMP_DISK_TABLES`-IFNULL(`d_start`.`SUM_CREATED_TMP_DISK_TABLES`, 0) AS ''SUM_CREATED_TMP_DISK_TABLES'',
`d_end`.`SUM_CREATED_TMP_TABLES`-IFNULL(`d_start`.`SUM_CREATED_TMP_TABLES`, 0) AS ''SUM_CREATED_TMP_TABLES'',
`d_end`.`SUM_SELECT_FULL_JOIN`-IFNULL(`d_start`.`SUM_SELECT_FULL_JOIN`, 0) AS ''SUM_SELECT_FULL_JOIN'',
`d_end`.`SUM_SELECT_FULL_RANGE_JOIN`-IFNULL(`d_start`.`SUM_SELECT_FULL_RANGE_JOIN`, 0) AS ''SUM_SELECT_FULL_RANGE_JOIN'',
`d_end`.`SUM_SELECT_RANGE`-IFNULL(`d_start`.`SUM_SELECT_RANGE`, 0) AS ''SUM_SELECT_RANGE'',
`d_end`.`SUM_SELECT_RANGE_CHECK`-IFNULL(`d_start`.`SUM_SELECT_RANGE_CHECK`, 0) AS ''SUM_SELECT_RANGE_CHECK'',
`d_end`.`SUM_SELECT_SCAN`-IFNULL(`d_start`.`SUM_SELECT_SCAN`, 0) AS ''SUM_SELECT_SCAN'',
`d_end`.`SUM_SORT_MERGE_PASSES`-IFNULL(`d_start`.`SUM_SORT_MERGE_PASSES`, 0) AS ''SUM_SORT_MERGE_PASSES'',
`d_end`.`SUM_SORT_RANGE`-IFNULL(`d_start`.`SUM_SORT_RANGE`, 0) AS ''SUM_SORT_RANGE'',
`d_end`.`SUM_SORT_ROWS`-IFNULL(`d_start`.`SUM_SORT_ROWS`, 0) AS ''SUM_SORT_ROWS'',
`d_end`.`SUM_SORT_SCAN`-IFNULL(`d_start`.`SUM_SORT_SCAN`, 0) AS ''SUM_SORT_SCAN'',
`d_end`.`SUM_NO_INDEX_USED`-IFNULL(`d_start`.`SUM_NO_INDEX_USED`, 0) AS ''SUM_NO_INDEX_USED'',
`d_end`.`SUM_NO_GOOD_INDEX_USED`-IFNULL(`d_start`.`SUM_NO_GOOD_INDEX_USED`, 0) AS ''SUM_NO_GOOD_INDEX_USED'',
`d_end`.`FIRST_SEEN`,
`d_end`.`LAST_SEEN`
FROM tmp_digests d_end
LEFT OUTER JOIN ', v_quoted_table, ' d_start ON `d_start`.`DIGEST` = `d_end`.`DIGEST`
AND (`d_start`.`SCHEMA_NAME` = `d_end`.`SCHEMA_NAME`
OR (`d_start`.`SCHEMA_NAME` IS NULL AND `d_end`.`SCHEMA_NAME` IS NULL)
)
WHERE `d_end`.`COUNT_STAR`-IFNULL(`d_start`.`COUNT_STAR`, 0) > 0');
CALL sys.execute_prepared_stmt(v_sql);
END IF;
IF (FIND_IN_SET('with_runtimes_in_95th_percentile', in_views)) THEN
SELECT 'Queries with Runtime in 95th Percentile' AS 'Next Output';
DROP TEMPORARY TABLE IF EXISTS tmp_digest_avg_latency_distribution1;
DROP TEMPORARY TABLE IF EXISTS tmp_digest_avg_latency_distribution2;
DROP TEMPORARY TABLE IF EXISTS tmp_digest_95th_percentile_by_avg_us;
CREATE TEMPORARY TABLE tmp_digest_avg_latency_distribution1 (
cnt bigint unsigned NOT NULL,
avg_us decimal(21,0) NOT NULL,
PRIMARY KEY (avg_us)
) ENGINE=InnoDB;
SET v_sql = CONCAT('INSERT INTO tmp_digest_avg_latency_distribution1
SELECT COUNT(*) cnt,
ROUND(avg_timer_wait/1000000) AS avg_us
FROM ', v_digests_table, '
GROUP BY avg_us');
CALL sys.execute_prepared_stmt(v_sql);
CREATE TEMPORARY TABLE tmp_digest_avg_latency_distribution2 LIKE tmp_digest_avg_latency_distribution1;
INSERT INTO tmp_digest_avg_latency_distribution2 SELECT * FROM tmp_digest_avg_latency_distribution1;
CREATE TEMPORARY TABLE tmp_digest_95th_percentile_by_avg_us (
avg_us decimal(21,0) NOT NULL,
percentile decimal(46,4) NOT NULL,
PRIMARY KEY (avg_us)
) ENGINE=InnoDB;
SET v_sql = CONCAT('INSERT INTO tmp_digest_95th_percentile_by_avg_us
SELECT s2.avg_us avg_us,
IFNULL(SUM(s1.cnt)/NULLIF((SELECT COUNT(*) FROM ', v_digests_table, '), 0), 0) percentile
FROM tmp_digest_avg_latency_distribution1 AS s1
JOIN tmp_digest_avg_latency_distribution2 AS s2 ON s1.avg_us <= s2.avg_us
GROUP BY s2.avg_us
HAVING percentile > 0.95
ORDER BY percentile
LIMIT 1');
CALL sys.execute_prepared_stmt(v_sql);
SET v_sql =
REPLACE(
REPLACE(
(SELECT VIEW_DEFINITION
FROM information_schema.VIEWS
WHERE TABLE_SCHEMA = DATABASE() AND TABLE_NAME = 'statements_with_runtimes_in_95th_percentile'
),
'`performance_schema`.`events_statements_summary_by_digest`',
v_digests_table
),
'sys.x$ps_digest_95th_percentile_by_avg_us',
'`sys`.`x$ps_digest_95th_percentile_by_avg_us`'
);
CALL sys.execute_prepared_stmt(v_sql);
DROP TEMPORARY TABLE tmp_digest_avg_latency_distribution1;
DROP TEMPORARY TABLE tmp_digest_avg_latency_distribution2;
DROP TEMPORARY TABLE tmp_digest_95th_percentile_by_avg_us;
END IF;
IF (FIND_IN_SET('analysis', in_views)) THEN
SELECT CONCAT('Top ', @sys.statement_performance_analyzer.limit, ' Queries Ordered by Total Latency') AS 'Next Output';
SET v_sql =
REPLACE(
(SELECT VIEW_DEFINITION
FROM information_schema.VIEWS
WHERE TABLE_SCHEMA = DATABASE() AND TABLE_NAME = 'statement_analysis'
),
'`performance_schema`.`events_statements_summary_by_digest`',
v_digests_table
);
IF (@sys.statement_performance_analyzer.limit > 0) THEN
SET v_sql = CONCAT(v_sql, ' LIMIT ', @sys.statement_performance_analyzer.limit);
END IF;
CALL sys.execute_prepared_stmt(v_sql);
END IF;
IF (FIND_IN_SET('with_errors_or_warnings', in_views)) THEN
SELECT CONCAT('Top ', @sys.statement_performance_analyzer.limit, ' Queries with Errors') AS 'Next Output';
SET v_sql =
REPLACE(
(SELECT VIEW_DEFINITION
FROM information_schema.VIEWS
WHERE TABLE_SCHEMA = DATABASE() AND TABLE_NAME = 'statements_with_errors_or_warnings'
),
'`performance_schema`.`events_statements_summary_by_digest`',
v_digests_table
);
IF (@sys.statement_performance_analyzer.limit > 0) THEN
SET v_sql = CONCAT(v_sql, ' LIMIT ', @sys.statement_performance_analyzer.limit);
END IF;
CALL sys.execute_prepared_stmt(v_sql);
END IF;
IF (FIND_IN_SET('with_full_table_scans', in_views)) THEN
SELECT CONCAT('Top ', @sys.statement_performance_analyzer.limit, ' Queries with Full Table Scan') AS 'Next Output';
SET v_sql =
REPLACE(
(SELECT VIEW_DEFINITION
FROM information_schema.VIEWS
WHERE TABLE_SCHEMA = DATABASE() AND TABLE_NAME = 'statements_with_full_table_scans'
),
'`performance_schema`.`events_statements_summary_by_digest`',
v_digests_table
);
IF (@sys.statement_performance_analyzer.limit > 0) THEN
SET v_sql = CONCAT(v_sql, ' LIMIT ', @sys.statement_performance_analyzer.limit);
END IF;
CALL sys.execute_prepared_stmt(v_sql);
END IF;
IF (FIND_IN_SET('with_sorting', in_views)) THEN
SELECT CONCAT('Top ', @sys.statement_performance_analyzer.limit, ' Queries with Sorting') AS 'Next Output';
SET v_sql =
REPLACE(
(SELECT VIEW_DEFINITION
FROM information_schema.VIEWS
WHERE TABLE_SCHEMA = DATABASE() AND TABLE_NAME = 'statements_with_sorting'
),
'`performance_schema`.`events_statements_summary_by_digest`',
v_digests_table
);
IF (@sys.statement_performance_analyzer.limit > 0) THEN
SET v_sql = CONCAT(v_sql, ' LIMIT ', @sys.statement_performance_analyzer.limit);
END IF;
CALL sys.execute_prepared_stmt(v_sql);
END IF;
IF (FIND_IN_SET('with_temp_tables', in_views)) THEN
SELECT CONCAT('Top ', @sys.statement_performance_analyzer.limit, ' Queries with Internal Temporary Tables') AS 'Next Output';
SET v_sql =
REPLACE(
(SELECT VIEW_DEFINITION
FROM information_schema.VIEWS
WHERE TABLE_SCHEMA = DATABASE() AND TABLE_NAME = 'statements_with_temp_tables'
),
'`performance_schema`.`events_statements_summary_by_digest`',
v_digests_table
);
IF (@sys.statement_performance_analyzer.limit > 0) THEN
SET v_sql = CONCAT(v_sql, ' LIMIT ', @sys.statement_performance_analyzer.limit);
END IF;
CALL sys.execute_prepared_stmt(v_sql);
END IF;
IF (FIND_IN_SET('custom', in_views)) THEN
SELECT CONCAT('Top ', @sys.statement_performance_analyzer.limit, ' Queries Using Custom View') AS 'Next Output';
IF (@sys.statement_performance_analyzer.view IS NULL) THEN
SET @sys.statement_performance_analyzer.view = sys.sys_get_config('statement_performance_analyzer.view', NULL);
END IF;
IF (@sys.statement_performance_analyzer.view IS NULL) THEN
SIGNAL SQLSTATE '45000'
SET MESSAGE_TEXT = 'The @sys.statement_performance_analyzer.view user variable must be set with the view or query to use.';
END IF;
IF (NOT INSTR(@sys.statement_performance_analyzer.view, ' ')) THEN
IF (NOT INSTR(@sys.statement_performance_analyzer.view, '.')) THEN
SET v_custom_db = DATABASE(),
v_custom_name = @sys.statement_performance_analyzer.view;
ELSE
SET v_custom_db = SUBSTRING_INDEX(@sys.statement_performance_analyzer.view, '.', 1);
SET v_custom_name = SUBSTRING(@sys.statement_performance_analyzer.view, CHAR_LENGTH(v_custom_db)+2);
END IF;
CALL sys.table_exists(v_custom_db, v_custom_name, v_custom_view_exists);
IF (v_custom_view_exists <> 'VIEW') THEN
SIGNAL SQLSTATE '45000'
SET MESSAGE_TEXT = 'The @sys.statement_performance_analyzer.view user variable is set but specified neither an existing view nor a query.';
END IF;
SET v_sql =
REPLACE(
(SELECT VIEW_DEFINITION
FROM information_schema.VIEWS
WHERE TABLE_SCHEMA = v_custom_db AND TABLE_NAME = v_custom_name
),
'`performance_schema`.`events_statements_summary_by_digest`',
v_digests_table
);
ELSE
SET v_sql = REPLACE(@sys.statement_performance_analyzer.view, '`performance_schema`.`events_statements_summary_by_digest`', v_digests_table);
END IF;
IF (@sys.statement_performance_analyzer.limit > 0) THEN
SET v_sql = CONCAT(v_sql, ' LIMIT ', @sys.statement_performance_analyzer.limit);
END IF;
CALL sys.execute_prepared_stmt(v_sql);
END IF;
END IF;
IF (v_this_thread_enabled = 'YES') THEN
CALL sys.ps_setup_enable_thread(CONNECTION_ID());
END IF;
IF (@log_bin = 1) THEN
SET sql_log_bin = @log_bin;
END IF;
END
|
mariadb.sys@localhost |
2026-04-10 15:41:08 |
2026-04-10 15:41:08 |
|
Description
Create a re... |
utf8mb3 |
utf8mb3_general_ci |
utf8mb3_general_ci |
BEGIN
DECLARE v_table_exists, v_tmp_digests_table_exists, v_custom_view_exists ENUM('', 'BASE TABLE', 'VIEW', 'TEMPORARY') DEFAULT '';
DECLARE v_this_thread_enabled ENUM('YES', 'NO');
DECLARE v_force_new_snapshot BOOLEAN DEFAULT FALSE;
DECLARE v_digests_table VARCHAR(133);
DECLARE v_quoted_table, v_quoted_custom_view VARCHAR(133) DEFAULT '';
DECLARE v_table_db, v_table_name, v_custom_db, v_custom_name VARCHAR(64);
DECLARE v_digest_table_template, v_checksum_ref, v_checksum_table text;
DECLARE v_sql longtext;
DECLARE v_error_msg VARCHAR(128);
SELECT INSTRUMENTED INTO v_this_thread_enabled FROM performance_schema.threads WHERE PROCESSLIST_ID = CONNECTION_ID();
IF (v_this_thread_enabled = 'YES') THEN
CALL sys.ps_setup_disable_thread(CONNECTION_ID());
END IF;
SET @log_bin := @@sql_log_bin;
IF (@log_bin = 1) THEN
SET sql_log_bin = 0;
END IF;
IF (@sys.statement_performance_analyzer.limit IS NULL) THEN
SET @sys.statement_performance_analyzer.limit = sys.sys_get_config('statement_performance_analyzer.limit', '100');
END IF;
IF (@sys.debug IS NULL) THEN
SET @sys.debug = sys.sys_get_config('debug' , 'OFF');
END IF;
IF (in_table = 'NOW()') THEN
SET v_force_new_snapshot = TRUE,
in_table = NULL;
ELSEIF (in_table IS NOT NULL) THEN
IF (NOT INSTR(in_table, '.')) THEN
SET v_table_db = DATABASE(),
v_table_name = in_table;
ELSE
SET v_table_db = SUBSTRING_INDEX(in_table, '.', 1);
SET v_table_name = SUBSTRING(in_table, CHAR_LENGTH(v_table_db)+2);
END IF;
SET v_quoted_table = CONCAT('`', v_table_db, '`.`', v_table_name, '`');
IF (@sys.debug = 'ON') THEN
SELECT CONCAT('in_table is: db = ''', v_table_db, ''', table = ''', v_table_name, '''') AS 'Debug';
END IF;
IF (v_table_db = DATABASE() AND (v_table_name = 'tmp_digests' OR v_table_name = 'tmp_digests_delta')) THEN
SET v_error_msg = CONCAT('Invalid value for in_table: ', v_quoted_table, ' is reserved table name.');
SIGNAL SQLSTATE '45000'
SET MESSAGE_TEXT = v_error_msg;
END IF;
CALL sys.table_exists(v_table_db, v_table_name, v_table_exists);
IF (@sys.debug = 'ON') THEN
SELECT CONCAT('v_table_exists = ', v_table_exists) AS 'Debug';
END IF;
IF (v_table_exists = 'BASE TABLE') THEN
SET v_checksum_ref = (
SELECT GROUP_CONCAT(CONCAT(COLUMN_NAME, COLUMN_TYPE) ORDER BY ORDINAL_POSITION) AS Checksum
FROM information_schema.COLUMNS
WHERE TABLE_SCHEMA = 'performance_schema' AND TABLE_NAME = 'events_statements_summary_by_digest'
),
v_checksum_table = (
SELECT GROUP_CONCAT(CONCAT(COLUMN_NAME, COLUMN_TYPE) ORDER BY ORDINAL_POSITION) AS Checksum
FROM information_schema.COLUMNS
WHERE TABLE_SCHEMA = v_table_db AND TABLE_NAME = v_table_name
);
IF (v_checksum_ref <> v_checksum_table) THEN
SET v_error_msg = CONCAT('The table ',
IF(CHAR_LENGTH(v_quoted_table) > 93, CONCAT('...', SUBSTRING(v_quoted_table, -90)), v_quoted_table),
' has the wrong definition.');
SIGNAL SQLSTATE '45000'
SET MESSAGE_TEXT = v_error_msg;
END IF;
END IF;
END IF;
IF (in_views IS NULL OR in_views = '') THEN
SET in_views = 'with_runtimes_in_95th_percentile,analysis,with_errors_or_warnings,with_full_table_scans,with_sorting,with_temp_tables';
END IF;
CALL sys.table_exists(DATABASE(), 'tmp_digests', v_tmp_digests_table_exists);
IF (@sys.debug = 'ON') THEN
SELECT CONCAT('v_tmp_digests_table_exists = ', v_tmp_digests_table_exists) AS 'Debug';
END IF;
CASE
WHEN in_action IN ('snapshot', 'overall') THEN
IF (in_table IS NOT NULL) THEN
IF (NOT v_table_exists IN ('TEMPORARY', 'BASE TABLE')) THEN
SET v_error_msg = CONCAT('The ', in_action, ' action requires in_table to be NULL, NOW() or specify an existing table.',
' The table ',
IF(CHAR_LENGTH(v_quoted_table) > 16, CONCAT('...', SUBSTRING(v_quoted_table, -13)), v_quoted_table),
' does not exist.');
SIGNAL SQLSTATE '45000'
SET MESSAGE_TEXT = v_error_msg;
END IF;
END IF;
WHEN in_action IN ('delta', 'save') THEN
IF (v_table_exists NOT IN ('TEMPORARY', 'BASE TABLE')) THEN
SET v_error_msg = CONCAT('The ', in_action, ' action requires in_table to be an existing table.',
IF(in_table IS NOT NULL, CONCAT(' The table ',
IF(CHAR_LENGTH(v_quoted_table) > 39, CONCAT('...', SUBSTRING(v_quoted_table, -36)), v_quoted_table),
' does not exist.'), ''));
SIGNAL SQLSTATE '45000'
SET MESSAGE_TEXT = v_error_msg;
END IF;
IF (in_action = 'delta' AND v_tmp_digests_table_exists <> 'TEMPORARY') THEN
SIGNAL SQLSTATE '45000'
SET MESSAGE_TEXT = 'An existing snapshot generated with the statement_performance_analyzer() must exist.';
END IF;
WHEN in_action = 'create_tmp' THEN
IF (v_table_exists = 'TEMPORARY') THEN
SET v_error_msg = CONCAT('Cannot create the table ',
IF(CHAR_LENGTH(v_quoted_table) > 72, CONCAT('...', SUBSTRING(v_quoted_table, -69)), v_quoted_table),
' as it already exists.');
SIGNAL SQLSTATE '45000'
SET MESSAGE_TEXT = v_error_msg;
END IF;
WHEN in_action = 'create_table' THEN
IF (v_table_exists <> '') THEN
SET v_error_msg = CONCAT('Cannot create the table ',
IF(CHAR_LENGTH(v_quoted_table) > 52, CONCAT('...', SUBSTRING(v_quoted_table, -49)), v_quoted_table),
' as it already exists',
IF(v_table_exists = 'TEMPORARY', ' as a temporary table.', '.'));
SIGNAL SQLSTATE '45000'
SET MESSAGE_TEXT = v_error_msg;
END IF;
WHEN in_action = 'cleanup' THEN
DO (SELECT 1);
ELSE
SIGNAL SQLSTATE '45000'
SET MESSAGE_TEXT = 'Unknown action. Supported actions are: cleanup, create_table, create_tmp, delta, overall, save, snapshot';
END CASE;
SET v_digest_table_template = 'CREATE %{TEMPORARY}TABLE %{TABLE_NAME} (\n `SCHEMA_NAME` varchar(64) DEFAULT NULL,\n `DIGEST` varchar(32) DEFAULT NULL,\n `DIGEST_TEXT` longtext,\n `COUNT_STAR` bigint(20) unsigned NOT NULL,\n `SUM_TIMER_WAIT` bigint(20) unsigned NOT NULL,\n `MIN_TIMER_WAIT` bigint(20) unsigned NOT NULL,\n `AVG_TIMER_WAIT` bigint(20) unsigned NOT NULL,\n `MAX_TIMER_WAIT` bigint(20) unsigned NOT NULL,\n `SUM_LOCK_TIME` bigint(20) unsigned NOT NULL,\n `SUM_ERRORS` bigint(20) unsigned NOT NULL,\n `SUM_WARNINGS` bigint(20) unsigned NOT NULL,\n `SUM_ROWS_AFFECTED` bigint(20) unsigned NOT NULL,\n `SUM_ROWS_SENT` bigint(20) unsigned NOT NULL,\n `SUM_ROWS_EXAMINED` bigint(20) unsigned NOT NULL,\n `SUM_CREATED_TMP_DISK_TABLES` bigint(20) unsigned NOT NULL,\n `SUM_CREATED_TMP_TABLES` bigint(20) unsigned NOT NULL,\n `SUM_SELECT_FULL_JOIN` bigint(20) unsigned NOT NULL,\n `SUM_SELECT_FULL_RANGE_JOIN` bigint(20) unsigned NOT NULL,\n `SUM_SELECT_RANGE` bigint(20) unsigned NOT NULL,\n `SUM_SELECT_RANGE_CHECK` bigint(20) unsigned NOT NULL,\n `SUM_SELECT_SCAN` bigint(20) unsigned NOT NULL,\n `SUM_SORT_MERGE_PASSES` bigint(20) unsigned NOT NULL,\n `SUM_SORT_RANGE` bigint(20) unsigned NOT NULL,\n `SUM_SORT_ROWS` bigint(20) unsigned NOT NULL,\n `SUM_SORT_SCAN` bigint(20) unsigned NOT NULL,\n `SUM_NO_INDEX_USED` bigint(20) unsigned NOT NULL,\n `SUM_NO_GOOD_INDEX_USED` bigint(20) unsigned NOT NULL,\n `FIRST_SEEN` timestamp NULL DEFAULT NULL,\n `LAST_SEEN` timestamp NULL DEFAULT NULL,\n INDEX (SCHEMA_NAME, DIGEST)\n) DEFAULT CHARSET=utf8';
IF (v_force_new_snapshot
OR in_action = 'snapshot'
OR (in_action = 'overall' AND in_table IS NULL)
OR (in_action = 'save' AND v_tmp_digests_table_exists <> 'TEMPORARY')
) THEN
IF (v_tmp_digests_table_exists = 'TEMPORARY') THEN
IF (@sys.debug = 'ON') THEN
SELECT 'DROP TEMPORARY TABLE IF EXISTS tmp_digests' AS 'Debug';
END IF;
DROP TEMPORARY TABLE IF EXISTS tmp_digests;
END IF;
CALL sys.execute_prepared_stmt(REPLACE(REPLACE(v_digest_table_template, '%{TEMPORARY}', 'TEMPORARY '), '%{TABLE_NAME}', 'tmp_digests'));
SET v_sql = CONCAT('INSERT INTO tmp_digests SELECT * FROM ',
IF(in_table IS NULL OR in_action = 'save', 'performance_schema.events_statements_summary_by_digest', v_quoted_table));
CALL sys.execute_prepared_stmt(v_sql);
END IF;
IF (in_action IN ('create_table', 'create_tmp')) THEN
IF (in_action = 'create_table') THEN
CALL sys.execute_prepared_stmt(REPLACE(REPLACE(v_digest_table_template, '%{TEMPORARY}', ''), '%{TABLE_NAME}', v_quoted_table));
ELSE
CALL sys.execute_prepared_stmt(REPLACE(REPLACE(v_digest_table_template, '%{TEMPORARY}', 'TEMPORARY '), '%{TABLE_NAME}', v_quoted_table));
END IF;
ELSEIF (in_action = 'save') THEN
CALL sys.execute_prepared_stmt(CONCAT('DELETE FROM ', v_quoted_table));
CALL sys.execute_prepared_stmt(CONCAT('INSERT INTO ', v_quoted_table, ' SELECT * FROM tmp_digests'));
ELSEIF (in_action = 'cleanup') THEN
DROP TEMPORARY TABLE IF EXISTS sys.tmp_digests;
DROP TEMPORARY TABLE IF EXISTS sys.tmp_digests_delta;
ELSEIF (in_action IN ('overall', 'delta')) THEN
IF (in_action = 'overall') THEN
IF (in_table IS NULL) THEN
SET v_digests_table = 'tmp_digests';
ELSE
SET v_digests_table = v_quoted_table;
END IF;
ELSE
SET v_digests_table = 'tmp_digests_delta';
DROP TEMPORARY TABLE IF EXISTS tmp_digests_delta;
CREATE TEMPORARY TABLE tmp_digests_delta LIKE tmp_digests;
SET v_sql = CONCAT('INSERT INTO tmp_digests_delta\nSELECT `d_end`.`SCHEMA_NAME`,\n `d_end`.`DIGEST`,\n `d_end`.`DIGEST_TEXT`,\n `d_end`.`COUNT_STAR`-IFNULL(`d_start`.`COUNT_STAR`, 0) AS ''COUNT_STAR'',\n `d_end`.`SUM_TIMER_WAIT`-IFNULL(`d_start`.`SUM_TIMER_WAIT`, 0) AS ''SUM_TIMER_WAIT'',\n `d_end`.`MIN_TIMER_WAIT` AS ''MIN_TIMER_WAIT'',\n IFNULL((`d_end`.`SUM_TIMER_WAIT`-IFNULL(`d_start`.`SUM_TIMER_WAIT`, 0))/NULLIF(`d_end`.`COUNT_STAR`-IFNULL(`d_start`.`COUNT_STAR`, 0), 0), 0) AS ''AVG_TIMER_WAIT'',\n `d_end`.`MAX_TIMER_WAIT` AS ''MAX_TIMER_WAIT'',\n `d_end`.`SUM_LOCK_TIME`-IFNULL(`d_start`.`SUM_LOCK_TIME`, 0) AS ''SUM_LOCK_TIME'',\n `d_end`.`SUM_ERRORS`-IFNULL(`d_start`.`SUM_ERRORS`, 0) AS ''SUM_ERRORS'',\n `d_end`.`SUM_WARNINGS`-IFNULL(`d_start`.`SUM_WARNINGS`, 0) AS ''SUM_WARNINGS'',\n `d_end`.`SUM_ROWS_AFFECTED`-IFNULL(`d_start`.`SUM_ROWS_AFFECTED`, 0) AS ''SUM_ROWS_AFFECTED'',\n `d_end`.`SUM_ROWS_SENT`-IFNULL(`d_start`.`SUM_ROWS_SENT`, 0) AS ''SUM_ROWS_SENT'',\n `d_end`.`SUM_ROWS_EXAMINED`-IFNULL(`d_start`.`SUM_ROWS_EXAMINED`, 0) AS ''SUM_ROWS_EXAMINED'',\n `d_end`.`SUM_CREATED_TMP_DISK_TABLES`-IFNULL(`d_start`.`SUM_CREATED_TMP_DISK_TABLES`, 0) AS ''SUM_CREATED_TMP_DISK_TABLES'',\n `d_end`.`SUM_CREATED_TMP_TABLES`-IFNULL(`d_start`.`SUM_CREATED_TMP_TABLES`, 0) AS ''SUM_CREATED_TMP_TABLES'',\n `d_end`.`SUM_SELECT_FULL_JOIN`-IFNULL(`d_start`.`SUM_SELECT_FULL_JOIN`, 0) AS ''SUM_SELECT_FULL_JOIN'',\n `d_end`.`SUM_SELECT_FULL_RANGE_JOIN`-IFNULL(`d_start`.`SUM_SELECT_FULL_RANGE_JOIN`, 0) AS ''SUM_SELECT_FULL_RANGE_JOIN'',\n `d_end`.`SUM_SELECT_RANGE`-IFNULL(`d_start`.`SUM_SELECT_RANGE`, 0) AS ''SUM_SELECT_RANGE'',\n `d_end`.`SUM_SELECT_RANGE_CHECK`-IFNULL(`d_start`.`SUM_SELECT_RANGE_CHECK`, 0) AS ''SUM_SELECT_RANGE_CHECK'',\n `d_end`.`SUM_SELECT_SCAN`-IFNULL(`d_start`.`SUM_SELECT_SCAN`, 0) AS ''SUM_SELECT_SCAN'',\n `d_end`.`SUM_SORT_MERGE_PASSES`-IFNULL(`d_start`.`SUM_SORT_MERGE_PASSES`, 0) AS ''SUM_SORT_MERGE_PASSES'',\n `d_end`.`SUM_SORT_RANGE`-IFNULL(`d_start`.`SUM_SORT_RANGE`, 0) AS ''SUM_SORT_RANGE'',\n `d_end`.`SUM_SORT_ROWS`-IFNULL(`d_start`.`SUM_SORT_ROWS`, 0) AS ''SUM_SORT_ROWS'',\n `d_end`.`SUM_SORT_SCAN`-IFNULL(`d_start`.`SUM_SORT_SCAN`, 0) AS ''SUM_SORT_SCAN'',\n `d_end`.`SUM_NO_INDEX_USED`-IFNULL(`d_start`.`SUM_NO_INDEX_USED`, 0) AS ''SUM_NO_INDEX_USED'',\n `d_end`.`SUM_NO_GOOD_INDEX_USED`-IFNULL(`d_start`.`SUM_NO_GOOD_INDEX_USED`, 0) AS ''SUM_NO_GOOD_INDEX_USED'',\n `d_end`.`FIRST_SEEN`,\n `d_end`.`LAST_SEEN`\n FROM tmp_digests d_end\n LEFT OUTER JOIN ', v_quoted_table, ' d_start ON `d_start`.`DIGEST` = `d_end`.`DIGEST`\n AND (`d_start`.`SCHEMA_NAME` = `d_end`.`SCHEMA_NAME`\n OR (`d_start`.`SCHEMA_NAME` IS NULL AND `d_end`.`SCHEMA_NAME` IS NULL)\n )\n WHERE `d_end`.`COUNT_STAR`-IFNULL(`d_start`.`COUNT_STAR`, 0) > 0');
CALL sys.execute_prepared_stmt(v_sql);
END IF;
IF (FIND_IN_SET('with_runtimes_in_95th_percentile', in_views)) THEN
SELECT 'Queries with Runtime in 95th Percentile' AS 'Next Output';
DROP TEMPORARY TABLE IF EXISTS tmp_digest_avg_latency_distribution1;
DROP TEMPORARY TABLE IF EXISTS tmp_digest_avg_latency_distribution2;
DROP TEMPORARY TABLE IF EXISTS tmp_digest_95th_percentile_by_avg_us;
CREATE TEMPORARY TABLE tmp_digest_avg_latency_distribution1 (
cnt bigint unsigned NOT NULL,
avg_us decimal(21,0) NOT NULL,
PRIMARY KEY (avg_us)
) ENGINE=InnoDB;
SET v_sql = CONCAT('INSERT INTO tmp_digest_avg_latency_distribution1\nSELECT COUNT(*) cnt,\n ROUND(avg_timer_wait/1000000) AS avg_us\n FROM ', v_digests_table, '\n GROUP BY avg_us');
CALL sys.execute_prepared_stmt(v_sql);
CREATE TEMPORARY TABLE tmp_digest_avg_latency_distribution2 LIKE tmp_digest_avg_latency_distribution1;
INSERT INTO tmp_digest_avg_latency_distribution2 SELECT * FROM tmp_digest_avg_latency_distribution1;
CREATE TEMPORARY TABLE tmp_digest_95th_percentile_by_avg_us (
avg_us decimal(21,0) NOT NULL,
percentile decimal(46,4) NOT NULL,
PRIMARY KEY (avg_us)
) ENGINE=InnoDB;
SET v_sql = CONCAT('INSERT INTO tmp_digest_95th_percentile_by_avg_us\nSELECT s2.avg_us avg_us,\n IFNULL(SUM(s1.cnt)/NULLIF((SELECT COUNT(*) FROM ', v_digests_table, '), 0), 0) percentile\n FROM tmp_digest_avg_latency_distribution1 AS s1\n JOIN tmp_digest_avg_latency_distribution2 AS s2 ON s1.avg_us <= s2.avg_us\n GROUP BY s2.avg_us\nHAVING percentile > 0.95\n ORDER BY percentile\n LIMIT 1');
CALL sys.execute_prepared_stmt(v_sql);
SET v_sql =
REPLACE(
REPLACE(
(SELECT VIEW_DEFINITION
FROM information_schema.VIEWS
WHERE TABLE_SCHEMA = DATABASE() AND TABLE_NAME = 'statements_with_runtimes_in_95th_percentile'
),
'`performance_schema`.`events_statements_summary_by_digest`',
v_digests_table
),
'sys.x$ps_digest_95th_percentile_by_avg_us',
'`sys`.`x$ps_digest_95th_percentile_by_avg_us`'
);
CALL sys.execute_prepared_stmt(v_sql);
DROP TEMPORARY TABLE tmp_digest_avg_latency_distribution1;
DROP TEMPORARY TABLE tmp_digest_avg_latency_distribution2;
DROP TEMPORARY TABLE tmp_digest_95th_percentile_by_avg_us;
END IF;
IF (FIND_IN_SET('analysis', in_views)) THEN
SELECT CONCAT('Top ', @sys.statement_performance_analyzer.limit, ' Queries Ordered by Total Latency') AS 'Next Output';
SET v_sql =
REPLACE(
(SELECT VIEW_DEFINITION
FROM information_schema.VIEWS
WHERE TABLE_SCHEMA = DATABASE() AND TABLE_NAME = 'statement_analysis'
),
'`performance_schema`.`events_statements_summary_by_digest`',
v_digests_table
);
IF (@sys.statement_performance_analyzer.limit > 0) THEN
SET v_sql = CONCAT(v_sql, ' LIMIT ', @sys.statement_performance_analyzer.limit);
END IF;
CALL sys.execute_prepared_stmt(v_sql);
END IF;
IF (FIND_IN_SET('with_errors_or_warnings', in_views)) THEN
SELECT CONCAT('Top ', @sys.statement_performance_analyzer.limit, ' Queries with Errors') AS 'Next Output';
SET v_sql =
REPLACE(
(SELECT VIEW_DEFINITION
FROM information_schema.VIEWS
WHERE TABLE_SCHEMA = DATABASE() AND TABLE_NAME = 'statements_with_errors_or_warnings'
),
'`performance_schema`.`events_statements_summary_by_digest`',
v_digests_table
);
IF (@sys.statement_performance_analyzer.limit > 0) THEN
SET v_sql = CONCAT(v_sql, ' LIMIT ', @sys.statement_performance_analyzer.limit);
END IF;
CALL sys.execute_prepared_stmt(v_sql);
END IF;
IF (FIND_IN_SET('with_full_table_scans', in_views)) THEN
SELECT CONCAT('Top ', @sys.statement_performance_analyzer.limit, ' Queries with Full Table Scan') AS 'Next Output';
SET v_sql =
REPLACE(
(SELECT VIEW_DEFINITION
FROM information_schema.VIEWS
WHERE TABLE_SCHEMA = DATABASE() AND TABLE_NAME = 'statements_with_full_table_scans'
),
'`performance_schema`.`events_statements_summary_by_digest`',
v_digests_table
);
IF (@sys.statement_performance_analyzer.limit > 0) THEN
SET v_sql = CONCAT(v_sql, ' LIMIT ', @sys.statement_performance_analyzer.limit);
END IF;
CALL sys.execute_prepared_stmt(v_sql);
END IF;
IF (FIND_IN_SET('with_sorting', in_views)) THEN
SELECT CONCAT('Top ', @sys.statement_performance_analyzer.limit, ' Queries with Sorting') AS 'Next Output';
SET v_sql =
REPLACE(
(SELECT VIEW_DEFINITION
FROM information_schema.VIEWS
WHERE TABLE_SCHEMA = DATABASE() AND TABLE_NAME = 'statements_with_sorting'
),
'`performance_schema`.`events_statements_summary_by_digest`',
v_digests_table
);
IF (@sys.statement_performance_analyzer.limit > 0) THEN
SET v_sql = CONCAT(v_sql, ' LIMIT ', @sys.statement_performance_analyzer.limit);
END IF;
CALL sys.execute_prepared_stmt(v_sql);
END IF;
IF (FIND_IN_SET('with_temp_tables', in_views)) THEN
SELECT CONCAT('Top ', @sys.statement_performance_analyzer.limit, ' Queries with Internal Temporary Tables') AS 'Next Output';
SET v_sql =
REPLACE(
(SELECT VIEW_DEFINITION
FROM information_schema.VIEWS
WHERE TABLE_SCHEMA = DATABASE() AND TABLE_NAME = 'statements_with_temp_tables'
),
'`performance_schema`.`events_statements_summary_by_digest`',
v_digests_table
);
IF (@sys.statement_performance_analyzer.limit > 0) THEN
SET v_sql = CONCAT(v_sql, ' LIMIT ', @sys.statement_performance_analyzer.limit);
END IF;
CALL sys.execute_prepared_stmt(v_sql);
END IF;
IF (FIND_IN_SET('custom', in_views)) THEN
SELECT CONCAT('Top ', @sys.statement_performance_analyzer.limit, ' Queries Using Custom View') AS 'Next Output';
IF (@sys.statement_performance_analyzer.view IS NULL) THEN
SET @sys.statement_performance_analyzer.view = sys.sys_get_config('statement_performance_analyzer.view', NULL);
END IF;
IF (@sys.statement_performance_analyzer.view IS NULL) THEN
SIGNAL SQLSTATE '45000'
SET MESSAGE_TEXT = 'The @sys.statement_performance_analyzer.view user variable must be set with the view or query to use.';
END IF;
IF (NOT INSTR(@sys.statement_performance_analyzer.view, ' ')) THEN
IF (NOT INSTR(@sys.statement_performance_analyzer.view, '.')) THEN
SET v_custom_db = DATABASE(),
v_custom_name = @sys.statement_performance_analyzer.view;
ELSE
SET v_custom_db = SUBSTRING_INDEX(@sys.statement_performance_analyzer.view, '.', 1);
SET v_custom_name = SUBSTRING(@sys.statement_performance_analyzer.view, CHAR_LENGTH(v_custom_db)+2);
END IF;
CALL sys.table_exists(v_custom_db, v_custom_name, v_custom_view_exists);
IF (v_custom_view_exists <> 'VIEW') THEN
SIGNAL SQLSTATE '45000'
SET MESSAGE_TEXT = 'The @sys.statement_performance_analyzer.view user variable is set but specified neither an existing view nor a query.';
END IF;
SET v_sql =
REPLACE(
(SELECT VIEW_DEFINITION
FROM information_schema.VIEWS
WHERE TABLE_SCHEMA = v_custom_db AND TABLE_NAME = v_custom_name
),
'`performance_schema`.`events_statements_summary_by_digest`',
v_digests_table
);
ELSE
SET v_sql = REPLACE(@sys.statement_performance_analyzer.view, '`performance_schema`.`events_statements_summary_by_digest`', v_digests_table);
END IF;
IF (@sys.statement_performance_analyzer.limit > 0) THEN
SET v_sql = CONCAT(v_sql, ' LIMIT ', @sys.statement_performance_analyzer.limit);
END IF;
CALL sys.execute_prepared_stmt(v_sql);
END IF;
END IF;
IF (v_this_thread_enabled = 'YES') THEN
CALL sys.ps_setup_enable_thread(CONNECTION_ID());
END IF;
IF (@log_bin = 1) THEN
SET sql_log_bin = @log_bin;
END IF;
END
|
NONE |
|
|
Edit
|
Copy
|
Delete
DELETE FROM proc WHERE `proc`.`db` = 'sys' AND `proc`.`name` = 'format_time' AND `proc`.`type` = 'FUNCTION'
|
sys |
format_time |
FUNCTION |
format_time |
SQL |
NO_SQL |
YES |
INVOKER |
picoseconds TEXT
|
text CHARSET utf8mb3 COLLATE utf8mb3_general_ci
|
BEGIN
IF picoseconds IS NULL THEN RETURN NULL;
ELSEIF picoseconds >= 604800000000000000 THEN RETURN CONCAT(ROUND(picoseconds / 604800000000000000, 2), ' w');
ELSEIF picoseconds >= 86400000000000000 THEN RETURN CONCAT(ROUND(picoseconds / 86400000000000000, 2), ' d');
ELSEIF picoseconds >= 3600000000000000 THEN RETURN CONCAT(ROUND(picoseconds / 3600000000000000, 2), ' h');
ELSEIF picoseconds >= 60000000000000 THEN RETURN CONCAT(ROUND(picoseconds / 60000000000000, 2), ' m');
ELSEIF picoseconds >= 1000000000000 THEN RETURN CONCAT(ROUND(picoseconds / 1000000000000, 2), ' s');
ELSEIF picoseconds >= 1000000000 THEN RETURN CONCAT(ROUND(picoseconds / 1000000000, 2), ' ms');
ELSEIF picoseconds >= 1000000 THEN RETURN CONCAT(ROUND(picoseconds / 1000000, 2), ' us');
ELSEIF picoseconds >= 1000 THEN RETURN CONCAT(ROUND(picoseconds / 1000, 2), ' ns');
ELSE RETURN CONCAT(picoseconds, ' ps');
END IF;
END
|
mariadb.sys@localhost |
2026-04-10 15:41:07 |
2026-04-10 15:41:07 |
|
Description
Takes a raw... |
utf8mb3 |
utf8mb3_general_ci |
utf8mb3_general_ci |
BEGIN
IF picoseconds IS NULL THEN RETURN NULL;
ELSEIF picoseconds >= 604800000000000000 THEN RETURN CONCAT(ROUND(picoseconds / 604800000000000000, 2), ' w');
ELSEIF picoseconds >= 86400000000000000 THEN RETURN CONCAT(ROUND(picoseconds / 86400000000000000, 2), ' d');
ELSEIF picoseconds >= 3600000000000000 THEN RETURN CONCAT(ROUND(picoseconds / 3600000000000000, 2), ' h');
ELSEIF picoseconds >= 60000000000000 THEN RETURN CONCAT(ROUND(picoseconds / 60000000000000, 2), ' m');
ELSEIF picoseconds >= 1000000000000 THEN RETURN CONCAT(ROUND(picoseconds / 1000000000000, 2), ' s');
ELSEIF picoseconds >= 1000000000 THEN RETURN CONCAT(ROUND(picoseconds / 1000000000, 2), ' ms');
ELSEIF picoseconds >= 1000000 THEN RETURN CONCAT(ROUND(picoseconds / 1000000, 2), ' us');
ELSEIF picoseconds >= 1000 THEN RETURN CONCAT(ROUND(picoseconds / 1000, 2), ' ns');
ELSE RETURN CONCAT(picoseconds, ' ps');
END IF;
END
|
NONE |
|
|
Edit
|
Copy
|
Delete
DELETE FROM proc WHERE `proc`.`db` = 'sys' AND `proc`.`name` = 'list_drop' AND `proc`.`type` = 'FUNCTION'
|
sys |
list_drop |
FUNCTION |
list_drop |
SQL |
CONTAINS_SQL |
YES |
INVOKER |
in_list TEXT,
in_drop_value TEXT
|
text CHARSET utf8mb3 COLLATE utf8mb3_general_ci
|
BEGIN
IF (in_drop_value IS NULL) THEN
SIGNAL SQLSTATE '02200'
SET MESSAGE_TEXT = 'Function sys.list_drop: in_drop_value input variable should not be NULL',
MYSQL_ERRNO = 1138;
END IF;
IF (in_list IS NULL OR LENGTH(in_list) = 0) THEN
RETURN in_list;
END IF;
RETURN (SELECT TRIM(BOTH ',' FROM REPLACE(REPLACE(CONCAT(',', in_list), CONCAT(',', in_drop_value), ''), CONCAT(', ', in_drop_value), '')));
END
|
mariadb.sys@localhost |
2026-04-10 15:41:07 |
2026-04-10 15:41:07 |
|
Description
Takes a lis... |
utf8mb3 |
utf8mb3_general_ci |
utf8mb3_general_ci |
BEGIN
IF (in_drop_value IS NULL) THEN
SIGNAL SQLSTATE '02200'
SET MESSAGE_TEXT = 'Function sys.list_drop: in_drop_value input variable should not be NULL',
MYSQL_ERRNO = 1138;
END IF;
IF (in_list IS NULL OR LENGTH(in_list) = 0) THEN
RETURN in_list;
END IF;
RETURN (SELECT TRIM(BOTH ',' FROM REPLACE(REPLACE(CONCAT(',', in_list), CONCAT(',', in_drop_value), ''), CONCAT(', ', in_drop_value), '')));
END
|
NONE |
|
|
Edit
|
Copy
|
Delete
DELETE FROM proc WHERE `proc`.`db` = 'sys' AND `proc`.`name` = 'table_exists' AND `proc`.`type` = 'PROCEDURE'
|
sys |
table_exists |
PROCEDURE |
table_exists |
SQL |
CONTAINS_SQL |
NO |
INVOKER |
IN in_db VARCHAR(64), IN in_table VARCHAR(64),
OUT out_exists ENUM('', 'BASE TABLE', 'VIEW', 'TEMPORARY', 'SEQUENCE', 'SYSTEM VIEW')
|
|
BEGIN
DECLARE v_error BOOLEAN DEFAULT FALSE;
DECLARE db_quoted VARCHAR(64);
DECLARE table_quoted VARCHAR(64);
DECLARE v_table_type VARCHAR(16) DEFAULT '';
DECLARE v_system_db BOOLEAN
DEFAULT LOWER(in_db) IN ('information_schema', 'performance_schema');
DECLARE CONTINUE HANDLER FOR 1050 SET v_error = TRUE;
DECLARE CONTINUE HANDLER FOR 1146 SET v_error = TRUE;
SET out_exists = '';
SET db_quoted = sys.quote_identifier(in_db);
SET table_quoted = sys.quote_identifier(in_table);
IF (EXISTS(SELECT 1 FROM information_schema.TABLES WHERE TABLE_SCHEMA = in_db AND TABLE_NAME = in_table)) THEN
IF v_system_db = FALSE THEN
SET @sys.tmp.table_exists.SQL = CONCAT('CREATE TEMPORARY TABLE ',
db_quoted,
'.',
table_quoted,
'(id INT PRIMARY KEY)');
PREPARE stmt_create_table FROM @sys.tmp.table_exists.SQL;
EXECUTE stmt_create_table;
DEALLOCATE PREPARE stmt_create_table;
SET @sys.tmp.table_exists.SQL = CONCAT('DROP TEMPORARY TABLE ',
db_quoted,
'.',
table_quoted);
PREPARE stmt_drop_table FROM @sys.tmp.table_exists.SQL;
EXECUTE stmt_drop_table;
DEALLOCATE PREPARE stmt_drop_table;
END IF;
IF (v_error) THEN
SET out_exists = 'TEMPORARY';
ELSE
SET v_table_type = (SELECT TABLE_TYPE FROM information_schema.TABLES WHERE TABLE_SCHEMA = in_db AND TABLE_NAME = in_table);
IF v_table_type = 'SYSTEM VERSIONED' THEN
SET out_exists = 'BASE TABLE';
ELSE
SET out_exists = v_table_type;
END IF;
END IF;
ELSE
IF v_system_db = FALSE THEN
SET @sys.tmp.table_exists.SQL = CONCAT('SELECT COUNT(*) FROM ',
db_quoted,
'.',
table_quoted);
PREPARE stmt_select FROM @sys.tmp.table_exists.SQL;
IF (NOT v_error) THEN
DEALLOCATE PREPARE stmt_select;
SET out_exists = 'TEMPORARY';
END IF;
END IF;
END IF;
END
|
mariadb.sys@localhost |
2026-04-10 15:41:08 |
2026-04-10 15:41:08 |
|
Description
Tests wheth... |
utf8mb3 |
utf8mb3_general_ci |
utf8mb3_general_ci |
BEGIN
DECLARE v_error BOOLEAN DEFAULT FALSE;
DECLARE db_quoted VARCHAR(64);
DECLARE table_quoted VARCHAR(64);
DECLARE v_table_type VARCHAR(16) DEFAULT '';
DECLARE v_system_db BOOLEAN
DEFAULT LOWER(in_db) IN ('information_schema', 'performance_schema');
DECLARE CONTINUE HANDLER FOR 1050 SET v_error = TRUE;
DECLARE CONTINUE HANDLER FOR 1146 SET v_error = TRUE;
SET out_exists = '';
SET db_quoted = sys.quote_identifier(in_db);
SET table_quoted = sys.quote_identifier(in_table);
IF (EXISTS(SELECT 1 FROM information_schema.TABLES WHERE TABLE_SCHEMA = in_db AND TABLE_NAME = in_table)) THEN
IF v_system_db = FALSE THEN
SET @sys.tmp.table_exists.SQL = CONCAT('CREATE TEMPORARY TABLE ',
db_quoted,
'.',
table_quoted,
'(id INT PRIMARY KEY)');
PREPARE stmt_create_table FROM @sys.tmp.table_exists.SQL;
EXECUTE stmt_create_table;
DEALLOCATE PREPARE stmt_create_table;
SET @sys.tmp.table_exists.SQL = CONCAT('DROP TEMPORARY TABLE ',
db_quoted,
'.',
table_quoted);
PREPARE stmt_drop_table FROM @sys.tmp.table_exists.SQL;
EXECUTE stmt_drop_table;
DEALLOCATE PREPARE stmt_drop_table;
END IF;
IF (v_error) THEN
SET out_exists = 'TEMPORARY';
ELSE
SET v_table_type = (SELECT TABLE_TYPE FROM information_schema.TABLES WHERE TABLE_SCHEMA = in_db AND TABLE_NAME = in_table);
IF v_table_type = 'SYSTEM VERSIONED' THEN
SET out_exists = 'BASE TABLE';
ELSE
SET out_exists = v_table_type;
END IF;
END IF;
ELSE
IF v_system_db = FALSE THEN
SET @sys.tmp.table_exists.SQL = CONCAT('SELECT COUNT(*) FROM ',
db_quoted,
'.',
table_quoted);
PREPARE stmt_select FROM @sys.tmp.table_exists.SQL;
IF (NOT v_error) THEN
DEALLOCATE PREPARE stmt_select;
SET out_exists = 'TEMPORARY';
END IF;
END IF;
END IF;
END
|
NONE |
|
|
Edit
|
Copy
|
Delete
DELETE FROM proc WHERE `proc`.`db` = 'sys' AND `proc`.`name` = 'ps_is_account_enabled' AND `proc`.`type` = 'FUNCTION'
|
sys |
ps_is_account_enabled |
FUNCTION |
ps_is_account_enabled |
SQL |
READS_SQL_DATA |
YES |
INVOKER |
in_host VARCHAR(60),
in_user VARCHAR(16)
|
enum('YES','NO') CHARSET utf8mb3 COLLATE utf8mb3_general_ci
|
BEGIN
RETURN IF(EXISTS(SELECT 1
FROM performance_schema.setup_actors
WHERE (`HOST` = '%' OR in_host LIKE `HOST`)
AND (`USER` = '%' OR `USER` = in_user)
),
'YES', 'NO'
);
END
|
mariadb.sys@localhost |
2026-04-10 15:41:07 |
2026-04-10 15:41:07 |
|
Description
Determines ... |
utf8mb3 |
utf8mb3_general_ci |
utf8mb3_general_ci |
BEGIN
RETURN IF(EXISTS(SELECT 1
FROM performance_schema.setup_actors
WHERE (`HOST` = '%' OR in_host LIKE `HOST`)
AND (`USER` = '%' OR `USER` = in_user)
),
'YES', 'NO'
);
END
|
NONE |
|
|
Edit
|
Copy
|
Delete
DELETE FROM proc WHERE `proc`.`db` = 'sys' AND `proc`.`name` = 'ps_is_consumer_enabled' AND `proc`.`type` = 'FUNCTION'
|
sys |
ps_is_consumer_enabled |
FUNCTION |
ps_is_consumer_enabled |
SQL |
READS_SQL_DATA |
YES |
INVOKER |
in_consumer varchar(64)
|
enum('YES','NO') CHARSET utf8mb3 COLLATE utf8mb3_general_ci
|
BEGIN
RETURN (
SELECT (CASE
WHEN c.NAME = 'global_instrumentation' THEN c.ENABLED
WHEN c.NAME = 'thread_instrumentation' THEN IF(cg.ENABLED = 'YES' AND c.ENABLED = 'YES', 'YES', 'NO')
WHEN c.NAME LIKE '%\_digest' THEN IF(cg.ENABLED = 'YES' AND c.ENABLED = 'YES', 'YES', 'NO')
WHEN c.NAME LIKE '%\_current' THEN IF(cg.ENABLED = 'YES' AND ct.ENABLED = 'YES' AND c.ENABLED = 'YES', 'YES', 'NO')
ELSE IF(cg.ENABLED = 'YES' AND ct.ENABLED = 'YES' AND c.ENABLED = 'YES'
AND ( SELECT cc.ENABLED FROM performance_schema.setup_consumers cc WHERE NAME = CONCAT(SUBSTRING_INDEX(c.NAME, '_', 2), '_current')
) = 'YES', 'YES', 'NO')
END) AS IsEnabled
FROM performance_schema.setup_consumers c
INNER JOIN performance_schema.setup_consumers cg
INNER JOIN performance_schema.setup_consumers ct
WHERE cg.NAME = 'global_instrumentation'
AND ct.NAME = 'thread_instrumentation'
AND c.NAME = in_consumer
);
END
|
mariadb.sys@localhost |
2026-04-10 15:41:07 |
2026-04-10 15:41:07 |
|
Description
Determines ... |
utf8mb3 |
utf8mb3_general_ci |
utf8mb3_general_ci |
BEGIN
RETURN (
SELECT (CASE
WHEN c.NAME = 'global_instrumentation' THEN c.ENABLED
WHEN c.NAME = 'thread_instrumentation' THEN IF(cg.ENABLED = 'YES' AND c.ENABLED = 'YES', 'YES', 'NO')
WHEN c.NAME LIKE '%\_digest' THEN IF(cg.ENABLED = 'YES' AND c.ENABLED = 'YES', 'YES', 'NO')
WHEN c.NAME LIKE '%\_current' THEN IF(cg.ENABLED = 'YES' AND ct.ENABLED = 'YES' AND c.ENABLED = 'YES', 'YES', 'NO')
ELSE IF(cg.ENABLED = 'YES' AND ct.ENABLED = 'YES' AND c.ENABLED = 'YES'
AND ( SELECT cc.ENABLED FROM performance_schema.setup_consumers cc WHERE NAME = CONCAT(SUBSTRING_INDEX(c.NAME, '_', 2), '_current')
) = 'YES', 'YES', 'NO')
END) AS IsEnabled
FROM performance_schema.setup_consumers c
INNER JOIN performance_schema.setup_consumers cg
INNER JOIN performance_schema.setup_consumers ct
WHERE cg.NAME = 'global_instrumentation'
AND ct.NAME = 'thread_instrumentation'
AND c.NAME = in_consumer
);
END
|
NONE |
|
|
Edit
|
Copy
|
Delete
DELETE FROM proc WHERE `proc`.`db` = 'sys' AND `proc`.`name` = 'ps_is_instrument_default_enabled' AND `proc`.`type` = 'FUNCTION'
|
sys |
ps_is_instrument_default_enabled |
FUNCTION |
ps_is_instrument_default_enabled |
SQL |
READS_SQL_DATA |
YES |
INVOKER |
in_instrument VARCHAR(128)
|
enum('YES','NO') CHARSET utf8mb3 COLLATE utf8mb3_general_ci
|
BEGIN
DECLARE v_enabled ENUM('YES', 'NO');
SET v_enabled = IF(in_instrument LIKE 'wait/io/file/%'
OR in_instrument LIKE 'wait/io/table/%'
OR in_instrument LIKE 'statement/%'
OR in_instrument LIKE 'memory/performance_schema/%'
OR in_instrument IN ('wait/lock/table/sql/handler', 'idle')
,
'YES',
'NO'
);
RETURN v_enabled;
END
|
mariadb.sys@localhost |
2026-04-10 15:41:07 |
2026-04-10 15:41:07 |
|
Description
Returns whe... |
utf8mb3 |
utf8mb3_general_ci |
utf8mb3_general_ci |
BEGIN
DECLARE v_enabled ENUM('YES', 'NO');
SET v_enabled = IF(in_instrument LIKE 'wait/io/file/%'
OR in_instrument LIKE 'wait/io/table/%'
OR in_instrument LIKE 'statement/%'
OR in_instrument LIKE 'memory/performance_schema/%'
OR in_instrument IN ('wait/lock/table/sql/handler', 'idle')
,
'YES',
'NO'
);
RETURN v_enabled;
END
|
NONE |
|
|
Edit
|
Copy
|
Delete
DELETE FROM proc WHERE `proc`.`db` = 'sys' AND `proc`.`name` = 'ps_is_instrument_default_timed' AND `proc`.`type` = 'FUNCTION'
|
sys |
ps_is_instrument_default_timed |
FUNCTION |
ps_is_instrument_default_timed |
SQL |
READS_SQL_DATA |
YES |
INVOKER |
in_instrument VARCHAR(128)
|
enum('YES','NO') CHARSET utf8mb3 COLLATE utf8mb3_general_ci
|
BEGIN
DECLARE v_timed ENUM('YES', 'NO');
SET v_timed = IF(in_instrument LIKE 'wait/io/file/%'
OR in_instrument LIKE 'wait/io/table/%'
OR in_instrument LIKE 'statement/%'
OR in_instrument IN ('wait/lock/table/sql/handler', 'idle')
,
'YES',
'NO'
);
RETURN v_timed;
END
|
mariadb.sys@localhost |
2026-04-10 15:41:07 |
2026-04-10 15:41:07 |
|
Description
Returns whe... |
utf8mb3 |
utf8mb3_general_ci |
utf8mb3_general_ci |
BEGIN
DECLARE v_timed ENUM('YES', 'NO');
SET v_timed = IF(in_instrument LIKE 'wait/io/file/%'
OR in_instrument LIKE 'wait/io/table/%'
OR in_instrument LIKE 'statement/%'
OR in_instrument IN ('wait/lock/table/sql/handler', 'idle')
,
'YES',
'NO'
);
RETURN v_timed;
END
|
NONE |
|
|
Edit
|
Copy
|
Delete
DELETE FROM proc WHERE `proc`.`db` = 'sys' AND `proc`.`name` = 'ps_is_thread_instrumented' AND `proc`.`type` = 'FUNCTION'
|
sys |
ps_is_thread_instrumented |
FUNCTION |
ps_is_thread_instrumented |
SQL |
READS_SQL_DATA |
NO |
INVOKER |
in_connection_id BIGINT UNSIGNED
|
enum('YES','NO','UNKNOWN') CHARSET utf8mb3 COLLATE utf8mb3_general_ci
|
BEGIN
DECLARE v_enabled ENUM('YES', 'NO', 'UNKNOWN');
IF (in_connection_id IS NULL) THEN
RETURN NULL;
END IF;
SELECT INSTRUMENTED INTO v_enabled
FROM performance_schema.threads
WHERE PROCESSLIST_ID = in_connection_id;
IF (v_enabled IS NULL) THEN
RETURN 'UNKNOWN';
ELSE
RETURN v_enabled;
END IF;
END
|
mariadb.sys@localhost |
2026-04-10 15:41:07 |
2026-04-10 15:41:07 |
|
Description
Checks whet... |
utf8mb3 |
utf8mb3_general_ci |
utf8mb3_general_ci |
BEGIN
DECLARE v_enabled ENUM('YES', 'NO', 'UNKNOWN');
IF (in_connection_id IS NULL) THEN
RETURN NULL;
END IF;
SELECT INSTRUMENTED INTO v_enabled
FROM performance_schema.threads
WHERE PROCESSLIST_ID = in_connection_id;
IF (v_enabled IS NULL) THEN
RETURN 'UNKNOWN';
ELSE
RETURN v_enabled;
END IF;
END
|
NONE |