Catégories :

Fonctions système

SYSTEM$EXPLAIN_PLAN_JSON

Étant donné le texte d’une instruction SQL, cette fonction génère le plan EXPLAIN au format JSON.

Voir aussi :

SYSTEM$EXPLAIN_JSON_TO_TEXT , EXPLAIN_JSON

Syntaxe

SYSTEM$EXPLAIN_PLAN_JSON( { <sql_statement_expression> | <sql_query_id_expression> } )

Arguments

expression_instruction_sql

Chaîne ou expression dont le résultat est une chaîne, contenant l’instruction SQL pour laquelle vous souhaitez le plan EXPLAIN . Si une chaîne littérale est utilisée, elle doit être entourée de guillemets simples '.

expression_id_requête_sql

Chaîne ou expression dont le résultat est une chaîne, contenant l’ID de requête pour lequel vous souhaitez le plan EXPLAIN . Si une chaîne littérale est utilisée, elle doit être entourée de guillemets simples '.

Renvoie

La fonction renvoie un VARCHAR contenant la sortie EXPLAIN dans un format compatible avec JSON.

Notes sur l’utilisation

  • Si un littéral de chaîne est validé en entrée, le délimiteur autour de la chaîne peut être soit un guillemet simple ' soit un double signe dollar $$ . Si le littéral de chaîne contient des guillemets simples (et ne contient pas de signes dollar double), la délimitation de la chaîne avec des signes dollar double évite d’avoir à échapper les caractères de guillemet simple incorporés à l’intérieur de la chaîne.

  • Pour post-traiter la sortie de cette commande, vous pouvez :

    • Utiliser la fonction RESULT_SCAN , qui traite la sortie comme une table qui peut être interrogée.

    • Insérez la sortie au format JSON dans une table pour une analyse ultérieure. Si vous stockez la sortie au format JSON, vous pouvez utiliser la fonction SYSTEM$EXPLAIN_JSON_TO_TEXT ou EXPLAIN_JSON pour convertir le JSON dans un format plus lisible par l’homme (texte tabulaire ou formaté).

Exemples

Ces exemples utilisent les tables ci-dessous :

CREATE TABLE Z1 (ID INTEGER);
CREATE TABLE Z2 (ID INTEGER);
CREATE TABLE Z3 (ID INTEGER);

Cet exemple utilise une chaîne littérale contenant une instruction n SQL comme paramètre d’entrée :

SELECT SYSTEM$EXPLAIN_PLAN_JSON(
    'SELECT Z1.ID, Z2.ID FROM Z1, Z2 WHERE Z2.ID = Z1.ID'
    ) AS explain_plan;
+-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
| EXPLAIN_PLAN                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                          |
|-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------|
| {"GlobalStats":{"partitionsTotal":2,"partitionsAssigned":2,"bytesAssigned":1024},"Operations":[[{"id":0,"operation":"Result","expressions":["Z1.ID","Z2.ID"]},{"id":1,"parent":0,"operation":"InnerJoin","expressions":["joinKey: (Z2.ID = Z1.ID)"]},{"id":2,"parent":1,"operation":"TableScan","objects":["TESTDB.TEMPORARY_DOC_TEST.Z2"],"expressions":["ID"],"partitionsAssigned":1,"partitionsTotal":1,"bytesAssigned":512},{"id":3,"parent":1,"operation":"JoinFilter","expressions":["joinKey: (Z2.ID = Z1.ID)"]},{"id":4,"parent":3,"operation":"TableScan","objects":["TESTDB.TEMPORARY_DOC_TEST.Z1"],"expressions":["ID"],"partitionsAssigned":1,"partitionsTotal":1,"bytesAssigned":512}]]} |
+-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+

Utilisez $$ pour délimiter les requêtes contenant des guillemets simples :

SELECT SYSTEM$EXPLAIN_PLAN_JSON(
    $$ SELECT symptom, IFNULL(diagnosis, '(not yet diagnosed)') FROM medical $$
    );

Le code ci-dessous montre comment consulter le plan EXPLAIN pour une requête que vous avez déjà exécutée :

Exécutez la requête :

SELECT Z1.ID, Z2.ID FROM Z1, Z2 WHERE Z2.ID = Z1.ID;

Exécutez EXPLAIN sur la requête, en appelant LAST_QUERY_ID() pour rechercher l’ID de requête :

SELECT SYSTEM$EXPLAIN_PLAN_JSON(LAST_QUERY_ID()) AS explain_plan;