SHOW EXPLAIN

MariaDB starting with 10.0

The SHOW EXPLAIN command is a new feature in MariaDB 10.0.

Spiegazione del comando

Il comando SHOW EXPLAIN consente di ottenere l'EXPLAIN (cioé il resoconto del piano di esecuzione) della query che un certo thread sta eseguendo.

La sintassi è:

SHOW EXPLAIN FOR <id_thread>;

Il comando produce un output come quello di EXPLAIN per la query che il thread identificato da thread_id sta eseguendo:

MariaDB [test]> show explain for 1;
+------+-------------+-------+-------+---------------+------+---------+------+---------+-------------+
| id   | select_type | table | type  | possible_keys | key  | key_len | ref  | rows    | Extra       |
+------+-------------+-------+-------+---------------+------+---------+------+---------+-------------+
|    1 | SIMPLE      | tbl   | index | NULL          | a    | 5       | NULL | 1000107 | Using index |
+------+-------------+-------+-------+---------------+------+---------+------+---------+-------------+
1 row in set, 1 warning (0.00 sec)

L'output è sempre accompagnato da un warning che contiene la query in esecuzione nel thread indicato (quindi chiarisce a cosa si riferisce l'EXPLAIN):

MariaDB [test]> show warnings;
+-------+------+------------------------+
| Level | Code | Message                |
+-------+------+------------------------+
| Note  | 1003 | select sum(a) from tbl |
+-------+------+------------------------+
1 row in set (0.00 sec)

Possibili errori

L'output può essere creato solo se il thread specificato sta attualmente eseguendo una query, che ha un piano già pronto. Se non è così, l'output è il seguente:

MariaDB [test]> show explain for 2;
ERROR 1932 (HY000): Target is not running an EXPLAINable command

Si ottiene questo errore se:

  • il thread non sta eseguendo un comando per il quale è possibile eseguire EXPLAIN
  • il thread sta eseguendo un comando per il quale è possibile eseguire EXPLAIN, ma:
    • non c'è ancora il piano di esecuzione (per esempio, le tabelle sono aperte e i lock sono stati acquisiti prima che il piano fosse pronto)
    • non c'è più il piano di esecuzione (per esempio, la query è stata scritta nei log slow/binary quando il piano era già stato cancellato).

Piani di esecuzione parziali

L'ottimizzatore di MySQL/MariaDB:

  • ottimizza parti della query in modo pigro
  • appena possibile cancella le parti del piano che non sono più necessarie

SHOW EXPLAIN scrive solo le parti del piano che sono attualmente disponibili. Se una parte non è presente, nel campo Extra si vedrà "Not yet optimized" o "Query plan already deleted".

Per esempio, con questa query:

MariaDB [test]> EXPLAIN SELECT column1 + 1 FROM temp_table_view;
+------+-------------+------------+------+---------------+------+---------+------+------+-------+
| id   | select_type | table      | type | possible_keys | key  | key_len | ref  | rows | Extra |
+------+-------------+------------+------+---------------+------+---------+------+------+-------+
|    1 | PRIMARY     | <derived2> | ALL  | NULL          | NULL | NULL    | NULL |    2 |       |
|    2 | DERIVED     | t1         | ALL  | NULL          | NULL | NULL    | NULL |    2 |       |
+------+-------------+------------+------+---------------+------+---------+------+------+-------+
2 rows in set (0.00 sec)

si potrebbe ottenere il seguente output:

MariaDB [test]> show explain for 1;
+------+-------------+------------+------+---------------+------+---------+------+------+----------------------------+
| id   | select_type | table      | type | possible_keys | key  | key_len | ref  | rows | Extra                      |
+------+-------------+------------+------+---------------+------+---------+------+------+----------------------------+
|    1 | PRIMARY     | <derived2> | ALL  | NULL          | NULL | NULL    | NULL |    2 |                            |
|    2 | DERIVED     | NULL       | NULL | NULL          | NULL | NULL    | NULL | NULL | Query plan already deleted |
+------+-------------+------------+------+---------------+------+---------+------+------+----------------------------+
2 rows in set, 1 warning (0.01 sec)

Dove ottenerlo

Attualmente, questa funzionalità è presente solo nel repository di bazaar, a questo indirizzo: https://code.launchpad.net/~maria-captains/maria/5.5-show-explain

Il repository è tracciato nel buildbot di MariaDB: http://buildbot.askmonty.org/buildbot/grid?branch=5.5-show-explain

Differenze tra gli output di SHOW EXPLAIN e di EXPLAIN

Background

In MySQL, l'esecuzione di EXPLAIN segue nel codice un percorso leggermente diverso rispetto alle query effettive (tipicamente le SELECT). Questo è un problema, e ha causato diversi bug in EXPLAIN. Per esempio, si vedano MDEV-326, MDEV-410 e lp:1013343. lp:992942 non riguarda direttamente EXPLAIN, ma non sarebbe esistito se MySQL non cercasse di cancellare parti del piano nel mezzo di una query.

SHOW EXPLAIN esamina una SELECT in esecuzione, perciò il suo output potrebbe differire leggermente da quello di EXPLAIN SELECT. E' stato fatto il possibile per far sì che la differenza sia lieve, o l'output di SHOW EXPLAIN sia più fedele alla realtà rispetto a quello di EXPLAIN.

Elenco delle differenze note

  • In SHOW EXPLAIN potrebbe esserci Extra='no matching row in const table', dove in EXPLAIN ci sarebbe Extra='Impossible WHERE ...'
  • Se ci sono delle subquery, SHOW EXPLAIN potrebbe scrivere select_type==PRIMARY, dove un normale EXPLAIN scriverebbe select_type==SIMPLE, o viceversa.

Permessi necessari

Per eseguire SHOW EXPLAIN occorrono gli stessi privilegi che sono necessari per eseguire SHOW PROCESSLIST.

Commenti

Sto caricando i commenti......
Content reproduced on this site is the property of its respective owners, and this content is not reviewed in advance by MariaDB. The views, information and opinions expressed by this content do not necessarily represent those of MariaDB or any other party.