Maison base de données tutoriel mysql Oracle递归查询的原理

Oracle递归查询的原理

Jun 07, 2016 pm 04:49 PM
o 数据库

以start with ename =

在Oracle 10g下,来到scott用户下,分别以层次 1,2,3,4上的节点做实验:
 
当start with是根节点(level=1),要查其子节点,connect by pump和emp都是被扫描4次(总的层次)。
 
当start with是根节点(level=2),要查其子节点,,connect by pump和emp被扫描3次。
 
当start with是根节点(level=3),要查其子节点,connect by pump和emp被扫描2次。

当start with是根节点(level=4),要查其子节点,connect by pump和emp被扫描1次。

注意的是:leve=2,level=3不是叶子节点,如果是叶子节点,那connect by pump和emp只扫描一次。
 
  Operation            Name    Starts
 
  FILTER             
    TABLE ACCESS FULL    EMP        1
  HASH JOIN         
    CONNECT BY PUMP                  4
    TABLE ACCESS FULL    EMP        4

我来解读上面的执行计划,以start with ename = 'KING'为例,显示对EMP通过"ENAME"='KING'过滤找到节点作为根节点(集合A),通过集合A到下一级所有满足条件的节点(集合B),通过集合B再到下一级所有满足条件的节点(集合C),树有几级就CONNECT BY PUMP几次。

Oracle 函数中游标及递归的应用

Oracle递归函数

Oracle 递归查询

Oracle递归START WITH...CONNECT BY PRIOR子句用法

Oracle 使用递归的性能提示

Oracle递归查询(start with)
 
SQL> set pagesize 100
 SQL> --根节点 level=1
 SQL> select e.empno, e.ename, e.mgr, e.deptno,level
      from emp e
      start with ename = 'KING'
    connect by prior empno = mgr;
 
    EMPNO ENAME            MGR    DEPTNO      LEVEL
 ---------- ---------- ---------- ---------- ----------
      7839 KING                          10          1
      7566 JONES            7839        20          2
      7788 SCOTT            7566        20          3
      7876 ADAMS            7788        20          4
      7902 FORD            7566        20          3
      7369 SMITH            7902        20          4
      7698 BLAKE            7839        30          2
      7499 ALLEN            7698        30          3
      7521 WARD            7698        30          3
      7654 MARTIN          7698        30          3
      7844 TURNER          7698        30          3
      7900 JAMES            7698        30          3
      7782 CLARK            7839        10          2
      7934 MILLER          7782        10          3
 已选择14行。
 SQL> select * from table(dbms_xplan.display_cursor(null,null,'allstats last'));
 PLAN_TABLE_OUTPUT
 -----------------------------------------------------------------------------------------------------------------------
 ----------------------------------------------------------------------------------------------------
 SQL_ID  6as71p9t5arg3, child number 0
 -------------------------------------
 select e.empno, e.ename, e.mgr, e.deptno,level  from emp e  start with ename = 'KING' connect by prior empno
 = mgr
 Plan hash value: 3364448299
 -----------------------------------------------------------------------------------------------------------------------
 | Id  | Operation                | Name | Starts | E-Rows | A-Rows |  A-Time  | Buffers |  OMem |  1Mem | Used-Mem |
 -----------------------------------------------------------------------------------------------------------------------
 |*  1 |  CONNECT BY WITH FILTERING|      |      1 |        |    14 |00:00:00.01 |      35 |  9216 |  9216 | 8192  (0)|
 |*  2 |  FILTER                  |      |      1 |        |      1 |00:00:00.01 |      7 |      |    |            |
 |  3 |    TABLE ACCESS FULL      | EMP  |      1 |    14 |    14 |00:00:00.01 |      7 |      |    |            |
 |*  4 |  HASH JOIN              |      |      4 |        |    13 |00:00:00.01 |      28 |  1036K|  1036K|  776K (0)|
 |  5 |    CONNECT BY PUMP        |      |      4 |        |    14 |00:00:00.01 |      0 |      |    |            |
 |  6 |    TABLE ACCESS FULL      | EMP  |      4 |    14 |    56 |00:00:00.01 |      28 |      |    |            |
 |  7 |  TABLE ACCESS FULL      | EMP  |      0 |    14 |      0 |00:00:00.01 |      0 |      |    |            |
 -----------------------------------------------------------------------------------------------------------------------
 Predicate Information (identified by operation id):
 ---------------------------------------------------
    1 - filter("ENAME"='KING')
    2 - filter("ENAME"='KING')
    4 - access("MGR"=NULL)
 
SQL> --level=2
 SQL> select e.empno, e.ename, e.mgr, e.deptno,level
      from emp e
      start with ename = 'JONES'
    connect by prior empno = mgr;
      EMPNO ENAME            MGR    DEPTNO      LEVEL
 ---------- ---------- ---------- ---------- ----------
      7566 JONES            7839        20          1
      7788 SCOTT            7566        20          2
      7876 ADAMS            7788        20          3
      7902 FORD            7566        20          2
      7369 SMITH            7902        20          3
 SQL> select * from table(dbms_xplan.display_cursor(null,null,'allstats last'));
 PLAN_TABLE_OUTPUT
 ------------------------------------------------------------------------------------------------------------------------
 SQL_ID  2bcjwvmbyg7a5, child number 1
 -------------------------------------
 select e.empno, e.ename, e.mgr, e.deptno,level  from emp e  start with ename = 'JONES' connect by prior empno
 = mgr
 Plan hash value: 3364448299
 -----------------------------------------------------------------------------------------------------------------------
 | Id  | Operation                | Name | Starts | E-Rows | A-Rows |  A-Time  | Buffers |  OMem |  1Mem | Used-Mem |
 -----------------------------------------------------------------------------------------------------------------------
 |*  1 |  CONNECT BY WITH FILTERING|      |      1 |        |      5 |00:00:00.01 |      28 |  9216 |  9216 | 8192  (0)|
 |*  2 |  FILTER                  |      |      1 |        |      1 |00:00:00.01 |      7 |      |    |            |
 |  3 |    TABLE ACCESS FULL      | EMP  |      1 |    14 |    14 |00:00:00.01 |      7 |      |    |            |
 |*  4 |  HASH JOIN              |      |      3 |        |      4 |00:00:00.01 |      21 |  1036K|  1036K|  404K (0)|
 |  5 |    CONNECT BY PUMP        |      |      3 |        |      5 |00:00:00.01 |      0 |      |    |            |
 |  6 |    TABLE ACCESS FULL      | EMP  |      3 |    14 |    42 |00:00:00.01 |      21 |      |    |            |
 |  7 |  TABLE ACCESS FULL      | EMP  |      0 |    14 |      0 |00:00:00.01 |      0 |      |    |            |
 -----------------------------------------------------------------------------------------------------------------------
 Predicate Information (identified by operation id):
 ---------------------------------------------------
    1 - filter("ENAME"='JONES')
    2 - filter("ENAME"='JONES')
    4 - access("MGR"=NULL)
 
SQL> --level=3
 SQL> select e.empno, e.ename, e.mgr, e.deptno,level
      from emp e
      start with ename = 'SCOTT'
    connect by prior empno = mgr;
      EMPNO ENAME            MGR    DEPTNO      LEVEL
 ---------- ---------- ---------- ---------- ----------
      7788 SCOTT            7566        20          1
      7876 ADAMS            7788        20          2
 
SQL> select * from table(dbms_xplan.display_cursor(null,null,'allstats last'));
 
PLAN_TABLE_OUTPUT
 -----------------------------------------------------------------------------------------------------------------------
 SQL_ID  fqf7r75c9atqv, child number 0
 -------------------------------------
 select e.empno, e.ename, e.mgr, e.deptno,level  from emp e  start with ename = 'SCOTT' connect by prior empno
 = mgr
 Plan hash value: 3364448299
 -----------------------------------------------------------------------------------------------------------------------
 | Id  | Operation                | Name | Starts | E-Rows | A-Rows |  A-Time  | Buffers |  OMem |  1Mem | Used-Mem |
 -----------------------------------------------------------------------------------------------------------------------
 |*  1 |  CONNECT BY WITH FILTERING|      |      1 |        |      2 |00:00:00.01 |      21 |  9216 |  9216 | 8192  (0)|
 |*  2 |  FILTER                  |      |      1 |        |      1 |00:00:00.01 |      7 |      |    |            |
 |  3 |    TABLE ACCESS FULL      | EMP  |      1 |    14 |    14 |00:00:00.01 |      7 |      |    |            |
 |*  4 |  HASH JOIN              |      |      2 |        |      1 |00:00:00.01 |      14 |  1036K|  1036K|  282K (0)|
 |  5 |    CONNECT BY PUMP        |      |      2 |        |      2 |00:00:00.01 |      0 |      |    |            |
 |  6 |    TABLE ACCESS FULL      | EMP  |      2 |    14 |    28 |00:00:00.01 |      14 |      |    |            |
 |  7 |  TABLE ACCESS FULL      | EMP  |      0 |    14 |      0 |00:00:00.01 |      0 |      |    |            |
 -----------------------------------------------------------------------------------------------------------------------
 Predicate Information (identified by operation id):
 ---------------------------------------------------
    1 - filter("ENAME"='SCOTT')
    2 - filter("ENAME"='SCOTT')
    4 - access("MGR"=NULL)
 

Déclaration de ce site Web
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn

Outils d'IA chauds

Undresser.AI Undress

Undresser.AI Undress

Application basée sur l'IA pour créer des photos de nu réalistes

AI Clothes Remover

AI Clothes Remover

Outil d'IA en ligne pour supprimer les vêtements des photos.

Undress AI Tool

Undress AI Tool

Images de déshabillage gratuites

Clothoff.io

Clothoff.io

Dissolvant de vêtements AI

AI Hentai Generator

AI Hentai Generator

Générez AI Hentai gratuitement.

Article chaud

R.E.P.O. Crystals d'énergie expliqués et ce qu'ils font (cristal jaune)
3 Il y a quelques semaines By 尊渡假赌尊渡假赌尊渡假赌
R.E.P.O. Meilleurs paramètres graphiques
3 Il y a quelques semaines By 尊渡假赌尊渡假赌尊渡假赌
R.E.P.O. Comment réparer l'audio si vous n'entendez personne
3 Il y a quelques semaines By 尊渡假赌尊渡假赌尊渡假赌
WWE 2K25: Comment déverrouiller tout dans Myrise
4 Il y a quelques semaines By 尊渡假赌尊渡假赌尊渡假赌

Outils chauds

Bloc-notes++7.3.1

Bloc-notes++7.3.1

Éditeur de code facile à utiliser et gratuit

SublimeText3 version chinoise

SublimeText3 version chinoise

Version chinoise, très simple à utiliser

Envoyer Studio 13.0.1

Envoyer Studio 13.0.1

Puissant environnement de développement intégré PHP

Dreamweaver CS6

Dreamweaver CS6

Outils de développement Web visuel

SublimeText3 version Mac

SublimeText3 version Mac

Logiciel d'édition de code au niveau de Dieu (SublimeText3)

iOS 18 ajoute une nouvelle fonction d'album 'Récupéré' pour récupérer les photos perdues ou endommagées iOS 18 ajoute une nouvelle fonction d'album 'Récupéré' pour récupérer les photos perdues ou endommagées Jul 18, 2024 am 05:48 AM

Les dernières versions d'Apple des systèmes iOS18, iPadOS18 et macOS Sequoia ont ajouté une fonctionnalité importante à l'application Photos, conçue pour aider les utilisateurs à récupérer facilement des photos et des vidéos perdues ou endommagées pour diverses raisons. La nouvelle fonctionnalité introduit un album appelé "Récupéré" dans la section Outils de l'application Photos qui apparaîtra automatiquement lorsqu'un utilisateur a des photos ou des vidéos sur son appareil qui ne font pas partie de sa photothèque. L'émergence de l'album « Récupéré » offre une solution aux photos et vidéos perdues en raison d'une corruption de la base de données, d'une application d'appareil photo qui n'enregistre pas correctement dans la photothèque ou d'une application tierce gérant la photothèque. Les utilisateurs n'ont besoin que de quelques étapes simples

Comment gérer les erreurs de connexion à la base de données en PHP Comment gérer les erreurs de connexion à la base de données en PHP Jun 05, 2024 pm 02:16 PM

Pour gérer les erreurs de connexion à la base de données en PHP, vous pouvez utiliser les étapes suivantes : Utilisez mysqli_connect_errno() pour obtenir le code d'erreur. Utilisez mysqli_connect_error() pour obtenir le message d'erreur. En capturant et en enregistrant ces messages d'erreur, les problèmes de connexion à la base de données peuvent être facilement identifiés et résolus, garantissant ainsi le bon fonctionnement de votre application.

Tutoriel détaillé sur l'établissement d'une connexion à une base de données à l'aide de MySQLi en PHP Tutoriel détaillé sur l'établissement d'une connexion à une base de données à l'aide de MySQLi en PHP Jun 04, 2024 pm 01:42 PM

Comment utiliser MySQLi pour établir une connexion à une base de données en PHP : Inclure l'extension MySQLi (require_once) Créer une fonction de connexion (functionconnect_to_db) Appeler la fonction de connexion ($conn=connect_to_db()) Exécuter une requête ($result=$conn->query()) Fermer connexion ( $conn->close())

Comment utiliser les fonctions de rappel de base de données dans Golang ? Comment utiliser les fonctions de rappel de base de données dans Golang ? Jun 03, 2024 pm 02:20 PM

L'utilisation de la fonction de rappel de base de données dans Golang peut permettre : d'exécuter du code personnalisé une fois l'opération de base de données spécifiée terminée. Ajoutez un comportement personnalisé via des fonctions distinctes sans écrire de code supplémentaire. Des fonctions de rappel sont disponibles pour les opérations d'insertion, de mise à jour, de suppression et de requête. Vous devez utiliser la fonction sql.Exec, sql.QueryRow ou sql.Query pour utiliser la fonction de rappel.

Comment installer et enregistrer l'application BTC Trading? Comment installer et enregistrer l'application BTC Trading? Feb 21, 2025 pm 07:09 PM

Cet article fournira une introduction détaillée sur la façon d'installer et d'enregistrer une application de trading Bitcoin. L'application Bitcoin Trading permet aux utilisateurs de gérer et d'échanger des crypto-monnaies telles que Bitcoin. L'article guide les utilisateurs dans le processus d'installation et d'enregistrement étape par étape, y compris le téléchargement des applications, la création de comptes, la réalisation d'identité et le premier dépôt. L'objectif de l'article est de fournir aux débutants des directives claires et faciles à comprendre pour les aider à entrer facilement dans le monde du trading Bitcoin.

Comment Go WebSocket s'intègre-t-il aux bases de données ? Comment Go WebSocket s'intègre-t-il aux bases de données ? Jun 05, 2024 pm 03:18 PM

Comment intégrer GoWebSocket à une base de données : Configurer une connexion à la base de données : Utilisez le package database/sql pour vous connecter à la base de données. Stocker les messages WebSocket dans la base de données : utilisez l'instruction INSERT pour insérer le message dans la base de données. Récupérer les messages WebSocket de la base de données : utilisez l'instruction SELECT pour récupérer les messages de la base de données.

Comment enregistrer les données JSON dans la base de données dans Golang ? Comment enregistrer les données JSON dans la base de données dans Golang ? Jun 06, 2024 am 11:24 AM

Les données JSON peuvent être enregistrées dans une base de données MySQL à l'aide de la bibliothèque gjson ou de la fonction json.Unmarshal. La bibliothèque gjson fournit des méthodes pratiques pour analyser les champs JSON, et la fonction json.Unmarshal nécessite un pointeur de type cible pour désorganiser les données JSON. Les deux méthodes nécessitent la préparation d'instructions SQL et l'exécution d'opérations d'insertion pour conserver les données dans la base de données.

OUYI Exchange Télécharger le portail officiel OUYI Exchange Télécharger le portail officiel Feb 21, 2025 pm 07:51 PM

Ouyi, également connu sous le nom d'OKX, est une plate-forme de trading de crypto-monnaie de pointe. L'article fournit un portail de téléchargement pour le package d'installation officiel d'Ouyi, qui facilite les utilisateurs pour installer le client Ouyi sur différents appareils. Ce package d'installation prend en charge les systèmes Windows, Mac, Android et iOS. Une fois l'installation terminée, les utilisateurs peuvent s'inscrire ou se connecter au compte OUYI, commencer à négocier des crypto-monnaies et profiter d'autres services fournis par la plate-forme.

See all articles