Current server:
(Servers) ...
phpMyAdmin demo - MariaDB (root)
phpMyAdmin demo - MySQL (root)
Recent
There are no recent tables.
Favorites
There are no favorite tables.
X
New
Huda
information_schema
jewelry_workshop
library
mysql
performance_schema
Portfolio_Marcus
PRUEBA
pw
sakila
serveruwebcoBressolia
shoe_db
sklepSerohenko
sku
StdMdDB
Stefano
students
students 2020
superpos
sys
table
Table_insertion
taobao
tb
test19
teste_teste
TlapaleriaMalfoy
Trickysolo
vedettfak
victory 2020
wisedb
world
ОБЛІК ТЕЛЕФОННИХ ПЕРЕГОВОРІВ
аа
Navigation panel
Navigation tree
Servers
Databases
Tables
Navigation panel
Customize appearance of the navigation panel.
Navigation panel
Show databases navigation as tree
In the navigation panel, replaces the database tree with a selector
Link with main panel
Link with main panel by highlighting the current database or table.
Display logo
Show logo in navigation panel.
Logo link URL
URL where logo in the navigation panel will point to.
Logo link target
Open the linked page in the main window (
main
) or in a new one (
new
).
main
new
Enable highlighting
Highlight server under the mouse cursor.
Maximum items on first level
The number of items that can be displayed on each page on the first level of the navigation tree.
Minimum number of items to display the filter box
Defines the minimum number of items (tables, views, routines and events) to display a filter box.
Recently used tables
Maximum number of recently used tables; set 0 to disable.
Favorite tables
Maximum number of favorite tables; set 0 to disable.
Navigation panel width
Set to 0 to collapse navigation panel.
Navigation tree
Customize the navigation tree.
Navigation tree
Maximum items in branch
The number of items that can be displayed on each page of the navigation tree.
Group items in the tree
Group items in the navigation tree (determined by the separator defined in the Databases and Tables tabs above).
Enable navigation tree expansion
Whether to offer the possibility of tree expansion in the navigation panel.
Show tables in tree
Whether to show tables under database in the navigation tree
Show views in tree
Whether to show views under database in the navigation tree
Show functions in tree
Whether to show functions under database in the navigation tree
Show procedures in tree
Whether to show procedures under database in the navigation tree
Show events in tree
Whether to show events under database in the navigation tree
Expand single database
Whether to expand single database in the navigation tree automatically.
Servers
Servers display options.
Servers
Display servers selection
Display server choice at the top of the navigation panel.
Display servers as a list
Show server listing as a list instead of a drop down.
Databases
Databases display options.
Databases
Minimum number of databases to display the database filter box
Database tree separator
String that separates databases into different tree levels.
Tables
Tables display options.
Tables
Target for quick access icon
Structure
SQL
Search
Insert
Browse
Target for second quick access icon
Structure
SQL
Search
Insert
Browse
Table tree separator
String that separates tables into different tree levels.
Maximum table tree depth
Drop files here
SQL upload (
0
)
x
-
Show hidden navigation tree items.
Create view
Your browser has phpMyAdmin configuration for this domain. Would you like to import it for current session?
Yes
/
No
/
Delete settings
Javascript must be enabled past this point!
Server: phpMyAdmin demo - MySQL
Database: sys
Structure
SQL
Search
Query
Export
root@192.168.30.%
phpMyAdmin documentation
MySQL documentation
Settings
Log out
Console
Clear
History
Options
Press Ctrl+Enter to execute query
Press Enter to execute query
ascending
descending
Order:
Debug SQL
Count
Execution order
Time taken
Order by:
Group queries
Ungroup queries
Collapse
Expand
Show trace
Hide trace
Count:
Time taken:
Options
Restore default values
Always expand query messages
Show query history at start
Show current browsing query
Execute queries on Enter and insert new line with Shift+Enter. To make this permanent, view settings.
Switch to dark theme
Collapse
Expand
Requery
Edit
Explain
Profiling
Query failed
Database:
Queried time:
Loading
ENUM/SET editor
Create view
Export of routine `statement_performance_analyzer`
DELIMITER $$ CREATE DEFINER=`mysql.sys`@`localhost` PROCEDURE `statement_performance_analyzer`( 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') ) SQL SECURITY INVOKER COMMENT '\nDescription\n-----------\n\nCreate a report of the statements running on the server.\n\nThe views are calculated based on the overall and/or delta activity.\n\nRequires the SUPER privilege for "SET sql_log_bin = 0;".\n\nParameters\n-----------\n\nin_action (ENUM(''snapshot'', ''overall'', ''delta'', ''create_tmp'', ''create_table'', ''save'', ''cleanup'')):\n The action to take. Supported actions are:\n * snapshot Store a snapshot. The default is to make a snapshot of the current content of\n performance_schema.events_statements_summary_by_digest, but by setting in_table\n this can be overwritten to copy the content of the specified table.\n The snapshot is stored in the sys.tmp_digests temporary table.\n * overall Generate analyzis based on the content specified by in_table. For the overall analyzis,\n in_table can be NOW() to use a fresh snapshot. This will overwrite an existing snapshot.\n Use NULL for in_table to use the existing snapshot. If in_table IS NULL and no snapshot\n exists, a new will be created.\n See also in_views and @sys.statement_performance_analyzer.limit.\n * delta Generate a delta analysis. The delta will be calculated between the reference table in\n in_table and the snapshot. An existing snapshot must exist.\n The action uses the sys.tmp_digests_delta temporary table.\n See also in_views and @sys.statement_performance_analyzer.limit.\n * create_table Create a regular table suitable for storing the snapshot for later use, e.g. for\n calculating deltas.\n * create_tmp Create a temporary table suitable for storing the snapshot for later use, e.g. for\n calculating deltas.\n * save Save the snapshot in the table specified by in_table. The table must exists and have\n the correct structure.\n If no snapshot exists, a new is created.\n * cleanup Remove the temporary tables used for the snapshot and delta.\n\nin_table (VARCHAR(129)):\n The table argument used for some actions. Use the format ''db1.t1'' or ''t1'' without using any backticks (`)\n for quoting. Periods (.) are not supported in the database and table names.\n\n The meaning of the table for each action supporting the argument is:\n\n * snapshot The snapshot is created based on the specified table. Set to NULL or NOW() to use\n the current content of performance_schema.events_statements_summary_by_digest.\n * overall The table with the content to create the overall analyzis for. The following values\n can be used:\n - A table name - use the content of that table.\n - NOW() - create a fresh snapshot and overwrite the existing snapshot.\n - NULL - use the last stored snapshot.\n * delta The table name is mandatory and specified the reference view to compare the currently\n stored snapshot against. If no snapshot exists, a new will be created.\n * create_table The name of the regular table to create.\n * create_tmp The name of the temporary table to create.\n * save The name of the table to save the currently stored snapshot into.\n\nin_views (SET (''with_runtimes_in_95th_percentile'', ''analysis'', ''with_errors_or_warnings'',\n ''with_full_table_scans'', ''with_sorting'', ''with_temp_tables'', ''custom''))\n Which views to include:\n\n * with_runtimes_in_95th_percentile Based on the sys.statements_with_runtimes_in_95th_percentile view\n * analysis Based on the sys.statement_analysis view\n * with_errors_or_warnings Based on the sys.statements_with_errors_or_warnings view\n * with_full_table_scans Based on the sys.statements_with_full_table_scans view\n * with_sorting Based on the sys.statements_with_sorting view\n * with_temp_tables Based on the sys.statements_with_temp_tables view\n * custom Use a custom view. This view must be specified in @sys.statement_performance_analyzer.view to an existing view or a query\n\nDefault is to include all except ''custom''.\n\n\nConfiguration Options\n----------------------\n\nsys.statement_performance_analyzer.limit\n The maximum number of rows to include for the views that does not have a built-in limit (e.g. the 95th percentile view).\n If not set the limit is 100.\n\nsys.statement_performance_analyzer.view\n Used together with the ''custom'' view. If the value contains a space, it is considered a query, otherwise it must be\n an existing view querying the performance_schema.events_statements_summary_by_digest table. There cannot be any limit\n clause including in the query or view definition if @sys.statement_performance_analyzer.limit > 0.\n If specifying a view, use the same format as for in_table.\n\nsys.debug\n Whether to provide debugging output.\n Default is ''OFF''. Set to ''ON'' to include.\n\n\nExample\n--------\n\nTo create a report with the queries in the 95th percentile since last truncate of performance_schema.events_statements_summary_by_digest\nand the delta for a 1 minute period:\n\n 1. Create a temporary table to store the initial snapshot.\n 2. Create the initial snapshot.\n 3. Save the initial snapshot in the temporary table.\n 4. Wait one minute.\n 5. Create a new snapshot.\n 6. Perform analyzis based on the new snapshot.\n 7. Perform analyzis based on the delta between the initial and new snapshots.\n\nmysql> CALL sys.statement_performance_analyzer(''create_tmp'', ''mydb.tmp_digests_ini'', NULL);\nQuery OK, 0 rows affected (0.08 sec)\n\nmysql> CALL sys.statement_performance_analyzer(''snapshot'', NULL, NULL);\nQuery OK, 0 rows affected (0.02 sec)\n\nmysql> CALL sys.statement_performance_analyzer(''save'', ''mydb.tmp_digests_ini'', NULL);\nQuery OK, 0 rows affected (0.00 sec)\n\nmysql> DO SLEEP(60);\nQuery OK, 0 rows affected (1 min 0.00 sec)\n\nmysql> CALL sys.statement_performance_analyzer(''snapshot'', NULL, NULL);\nQuery OK, 0 rows affected (0.02 sec)\n\nmysql> CALL sys.statement_performance_analyzer(''overall'', NULL, ''with_runtimes_in_95th_percentile'');\n+-----------------------------------------+\n| Next Output |\n+-----------------------------------------+\n| Queries with Runtime in 95th Percentile |\n+-----------------------------------------+\n1 row in set (0.05 sec)\n\n...\n\nmysql> CALL sys.statement_performance_analyzer(''delta'', ''mydb.tmp_digests_ini'', ''with_runtimes_in_95th_percentile'');\n+-----------------------------------------+\n| Next Output |\n+-----------------------------------------+\n| Queries with Runtime in 95th Percentile |\n+-----------------------------------------+\n1 row in set (0.03 sec)\n\n...\n\n\nTo create an overall report of the 95th percentile queries and the top 10 queries with full table scans:\n\nmysql> CALL sys.statement_performance_analyzer(''snapshot'', NULL, NULL);\nQuery OK, 0 rows affected (0.01 sec)\n\nmysql> SET @sys.statement_performance_analyzer.limit = 10;\nQuery OK, 0 rows affected (0.00 sec)\n\nmysql> CALL sys.statement_performance_analyzer(''overall'', NULL, ''with_runtimes_in_95th_percentile,with_full_table_scans'');\n+-----------------------------------------+\n| Next Output |\n+-----------------------------------------+\n| Queries with Runtime in 95th Percentile |\n+-----------------------------------------+\n1 row in set (0.01 sec)\n\n...\n\n+-------------------------------------+\n| Next Output |\n+-------------------------------------+\n| Top 10 Queries with Full Table Scan |\n+-------------------------------------+\n1 row in set (0.09 sec)\n\n...\n\n\nUse a custom view showing the top 10 query sorted by total execution time refreshing the view every minute using\nthe watch command in Linux.\n\nmysql> CREATE OR REPLACE VIEW mydb.my_statements AS\n -> SELECT sys.format_statement(DIGEST_TEXT) AS query,\n -> SCHEMA_NAME AS db,\n -> COUNT_STAR AS exec_count,\n -> sys.format_time(SUM_TIMER_WAIT) AS total_latency,\n -> sys.format_time(AVG_TIMER_WAIT) AS avg_latency,\n -> ROUND(IFNULL(SUM_ROWS_SENT / NULLIF(COUNT_STAR, 0), 0)) AS rows_sent_avg,\n -> ROUND(IFNULL(SUM_ROWS_EXAMINED / NULLIF(COUNT_STAR, 0), 0)) AS rows_examined_avg,\n -> ROUND(IFNULL(SUM_ROWS_AFFECTED / NULLIF(COUNT_STAR, 0), 0)) AS rows_affected_avg,\n -> DIGEST AS digest\n -> FROM performance_schema.events_statements_summary_by_digest\n -> ORDER BY SUM_TIMER_WAIT DESC;\nQuery OK, 0 rows affected (0.01 sec)\n\nmysql> CALL sys.statement_performance_analyzer(''create_table'', ''mydb.digests_prev'', NULL);\nQuery OK, 0 rows affected (0.10 sec)\n\nshell$ watch -n 60 "mysql sys --table -e "\n> SET @sys.statement_performance_analyzer.view = ''mydb.my_statements'';\n> SET @sys.statement_performance_analyzer.limit = 10;\n> CALL statement_performance_analyzer(''snapshot'', NULL, NULL);\n> CALL statement_performance_analyzer(''delta'', ''mydb.digests_prev'', ''custom'');\n> CALL statement_performance_analyzer(''save'', ''mydb.digests_prev'', NULL);\n> ""\n\nEvery 60.0s: mysql sys --table -e " ... Mon Dec 22 10:58:51 2014\n\n+----------------------------------+\n| Next Output |\n+----------------------------------+\n| Top 10 Queries Using Custom View |\n+----------------------------------+\n+-------------------+-------+------------+---------------+-------------+---------------+-------------------+-------------------+----------------------------------+\n| query | db | exec_count | total_latency | avg_latency | rows_sent_avg | rows_examined_avg | rows_affected_avg | digest |\n+-------------------+-------+------------+---------------+-------------+---------------+-------------------+-------------------+----------------------------------+\n...\n' 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; -- Maximum supported length for MESSAGE_TEXT with the SIGNAL command is 128 chars. DECLARE v_error_msg VARCHAR(128); DECLARE v_old_group_concat_max_len INT UNSIGNED DEFAULT 0; -- Don't instrument this thread 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; -- Temporary table are used - disable sql_log_bin if necessary to prevent them replicating SET @log_bin := @@sql_log_bin; IF (@log_bin = 1) THEN SET sql_log_bin = 0; END IF; -- Set configuration options 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 is set, break in_table into a db and table component and check whether it exists -- in_table = NOW() is considered like it's not set. 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 -- No . in the table name - use current database -- DATABASE() will be the database of the procedure 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_old_group_concat_max_len = @@session.group_concat_max_len; SET @@session.group_concat_max_len = 2048; -- Verify that the table has the correct table definition -- This can only be done for base tables as temporary aren't in information_schema.COLUMNS. -- This also minimises the risk of using a production table. 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 ); SET @@session.group_concat_max_len = v_old_group_concat_max_len; IF (v_checksum_ref <> v_checksum_table) THEN -- The table does not have the correct definition, so abandon 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 to default SET in_views = 'with_runtimes_in_95th_percentile,analysis,with_errors_or_warnings,with_full_table_scans,with_sorting,with_temp_tables'; END IF; -- Validate settings 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 -- in_table must be NULL, NOW(), or an existing table 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 -- in_table must be an existing table 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 -- in_table must not exists as a temporary table 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 -- in_table must not exists at all 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 -- doesn't use any of the arguments 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(64) 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(6) NULL DEFAULT NULL, `LAST_SEEN` timestamp(6) NULL DEFAULT NULL, `QUANTILE_95` bigint(20) unsigned NOT NULL, `QUANTILE_99` bigint(20) unsigned NOT NULL, `QUANTILE_999` bigint(20) unsigned NOT NULL, `QUERY_SAMPLE_TEXT` longtext, `QUERY_SAMPLE_SEEN` timestamp(6) NULL DEFAULT NULL, `QUERY_SAMPLE_TIMER_WAIT` bigint(20) unsigned NOT NULL, INDEX (SCHEMA_NAME, DIGEST) ) DEFAULT CHARSET=utf8mb4'; -- Do the action -- The actions snapshot, ... requires a fresh snapshot - create it now 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; -- Go through the remaining actions 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 -- These are almost the same - for delta calculate the delta in tmp_digests_delta and use that instead of tmp_digests. -- And overall allows overriding the table to use. 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`, `d_end`.`QUANTILE_95`, `d_end`.`QUANTILE_99`, `d_end`.`QUANTILE_999`, `d_end`.`QUERY_SAMPLE_TEXT`, `d_end`.`QUERY_SAMPLE_SEEN`, `d_end`.`QUERY_SAMPLE_TIMER_WAIT` 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 -- No spaces, so can't be a query IF (NOT INSTR(@sys.statement_performance_analyzer.view, '.')) THEN -- No . in the table name - use current database -- DATABASE() will be the database of the procedure 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; -- Restore INSTRUMENTED for this thread 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$$ DELIMITER ;
Routines
Check all
Export
Drop
Create new routine
There are no routines to display.
Name
Type
Returns
DROP PROCEDURE IF EXISTS `create_synonym_db`
create_synonym_db
PROCEDURE
Edit
Execute
Export
Drop
DROP PROCEDURE IF EXISTS `diagnostics`
diagnostics
PROCEDURE
Edit
Execute
Export
Drop
DROP PROCEDURE IF EXISTS `execute_prepared_stmt`
execute_prepared_stmt
PROCEDURE
Edit
Execute
Export
Drop
DROP FUNCTION IF EXISTS `extract_schema_from_file_name`
extract_schema_from_file_name
FUNCTION
varchar(64)
Edit
Execute
Export
Drop
DROP FUNCTION IF EXISTS `extract_table_from_file_name`
extract_table_from_file_name
FUNCTION
varchar(64)
Edit
Execute
Export
Drop
DROP FUNCTION IF EXISTS `format_bytes`
format_bytes
FUNCTION
text
Edit
Execute
Export
Drop
DROP FUNCTION IF EXISTS `format_path`
format_path
FUNCTION
varchar(512)
Edit
Execute
Export
Drop
DROP FUNCTION IF EXISTS `format_statement`
format_statement
FUNCTION
longtext
Edit
Execute
Export
Drop
DROP FUNCTION IF EXISTS `format_time`
format_time
FUNCTION
text
Edit
Execute
Export
Drop
DROP FUNCTION IF EXISTS `list_add`
list_add
FUNCTION
text
Edit
Execute
Export
Drop
DROP FUNCTION IF EXISTS `list_drop`
list_drop
FUNCTION
text
Edit
Execute
Export
Drop
DROP FUNCTION IF EXISTS `ps_is_account_enabled`
ps_is_account_enabled
FUNCTION
enum('YES','NO')
Edit
Execute
Export
Drop
DROP FUNCTION IF EXISTS `ps_is_consumer_enabled`
ps_is_consumer_enabled
FUNCTION
enum('YES','NO')
Edit
Execute
Export
Drop
DROP FUNCTION IF EXISTS `ps_is_instrument_default_enabled`
ps_is_instrument_default_enabled
FUNCTION
enum('YES','NO')
Edit
Execute
Export
Drop
DROP FUNCTION IF EXISTS `ps_is_instrument_default_timed`
ps_is_instrument_default_timed
FUNCTION
enum('YES','NO')
Edit
Execute
Export
Drop
DROP FUNCTION IF EXISTS `ps_is_thread_instrumented`
ps_is_thread_instrumented
FUNCTION
enum('YES','NO','UNKNOWN')
Edit
Execute
Export
Drop
DROP PROCEDURE IF EXISTS `ps_setup_disable_background_threads`
ps_setup_disable_background_threads
PROCEDURE
Edit
Execute
Export
Drop
DROP PROCEDURE IF EXISTS `ps_setup_disable_consumer`
ps_setup_disable_consumer
PROCEDURE
Edit
Execute
Export
Drop
DROP PROCEDURE IF EXISTS `ps_setup_disable_instrument`
ps_setup_disable_instrument
PROCEDURE
Edit
Execute
Export
Drop
DROP PROCEDURE IF EXISTS `ps_setup_disable_thread`
ps_setup_disable_thread
PROCEDURE
Edit
Execute
Export
Drop
DROP PROCEDURE IF EXISTS `ps_setup_enable_background_threads`
ps_setup_enable_background_threads
PROCEDURE
Edit
Execute
Export
Drop
DROP PROCEDURE IF EXISTS `ps_setup_enable_consumer`
ps_setup_enable_consumer
PROCEDURE
Edit
Execute
Export
Drop
DROP PROCEDURE IF EXISTS `ps_setup_enable_instrument`
ps_setup_enable_instrument
PROCEDURE
Edit
Execute
Export
Drop
DROP PROCEDURE IF EXISTS `ps_setup_enable_thread`
ps_setup_enable_thread
PROCEDURE
Edit
Execute
Export
Drop
DROP PROCEDURE IF EXISTS `ps_setup_reload_saved`
ps_setup_reload_saved
PROCEDURE
Edit
Execute
Export
Drop
DROP PROCEDURE IF EXISTS `ps_setup_reset_to_default`
ps_setup_reset_to_default
PROCEDURE
Edit
Execute
Export
Drop
DROP PROCEDURE IF EXISTS `ps_setup_save`
ps_setup_save
PROCEDURE
Edit
Execute
Export
Drop
DROP PROCEDURE IF EXISTS `ps_setup_show_disabled`
ps_setup_show_disabled
PROCEDURE
Edit
Execute
Export
Drop
DROP PROCEDURE IF EXISTS `ps_setup_show_disabled_consumers`
ps_setup_show_disabled_consumers
PROCEDURE
Edit
Execute
Export
Drop
DROP PROCEDURE IF EXISTS `ps_setup_show_disabled_instruments`
ps_setup_show_disabled_instruments
PROCEDURE
Edit
Execute
Export
Drop
DROP PROCEDURE IF EXISTS `ps_setup_show_enabled`
ps_setup_show_enabled
PROCEDURE
Edit
Execute
Export
Drop
DROP PROCEDURE IF EXISTS `ps_setup_show_enabled_consumers`
ps_setup_show_enabled_consumers
PROCEDURE
Edit
Execute
Export
Drop
DROP PROCEDURE IF EXISTS `ps_setup_show_enabled_instruments`
ps_setup_show_enabled_instruments
PROCEDURE
Edit
Execute
Export
Drop
DROP PROCEDURE IF EXISTS `ps_statement_avg_latency_histogram`
ps_statement_avg_latency_histogram
PROCEDURE
Edit
Execute
Export
Drop
DROP FUNCTION IF EXISTS `ps_thread_account`
ps_thread_account
FUNCTION
text
Edit
Execute
Export
Drop
DROP FUNCTION IF EXISTS `ps_thread_id`
ps_thread_id
FUNCTION
bigint(20) unsigned
Edit
Execute
Export
Drop
DROP FUNCTION IF EXISTS `ps_thread_stack`
ps_thread_stack
FUNCTION
longtext
Edit
Execute
Export
Drop
DROP FUNCTION IF EXISTS `ps_thread_trx_info`
ps_thread_trx_info
FUNCTION
longtext
Edit
Execute
Export
Drop
DROP PROCEDURE IF EXISTS `ps_trace_statement_digest`
ps_trace_statement_digest
PROCEDURE
Edit
Execute
Export
Drop
DROP PROCEDURE IF EXISTS `ps_trace_thread`
ps_trace_thread
PROCEDURE
Edit
Execute
Export
Drop
DROP PROCEDURE IF EXISTS `ps_truncate_all_tables`
ps_truncate_all_tables
PROCEDURE
Edit
Execute
Export
Drop
DROP FUNCTION IF EXISTS `quote_identifier`
quote_identifier
FUNCTION
text
Edit
Execute
Export
Drop
DROP PROCEDURE IF EXISTS `statement_performance_analyzer`
statement_performance_analyzer
PROCEDURE
Edit
Execute
Export
Drop
DROP FUNCTION IF EXISTS `sys_get_config`
sys_get_config
FUNCTION
varchar(128)
Edit
Execute
Export
Drop
DROP PROCEDURE IF EXISTS `table_exists`
table_exists
PROCEDURE
Edit
Execute
Export
Drop
DROP FUNCTION IF EXISTS `version_major`
version_major
FUNCTION
tinyint(3) unsigned
Edit
Execute
Export
Drop
DROP FUNCTION IF EXISTS `version_minor`
version_minor
FUNCTION
tinyint(3) unsigned
Edit
Execute
Export
Drop
DROP FUNCTION IF EXISTS `version_patch`
version_patch
FUNCTION
tinyint(3) unsigned
Edit
Execute
Export
Drop
phpMyAdmin Demo Server:
Git information missing!