In diesem Artikel geht es um die Optimierungsmethode der Oracle-Tabellenverbindung (mit Beispielen). Freunde in Not können sich darauf beziehen.
In der Oracle-Datenbank gibt es vier Tabellenverbindungsmethoden zwischen zwei Tabellen: Sortier-Merge-Join, Nested-Loop-Join, Hash-Join und kartesischer Join
1 🎜>
Sort-Merge-Join ist eine Tabellenverbindungsmethode, die den Sortiervorgang (SORT) und den Zusammenführungsvorgang (MERGE) verwendet, um den Verbindungsergebnissatz zu erhalten, wenn zwei Tabellen verbunden sind Wenn die T2-Tabelle beim Herstellen von Tabellenverbindungen eine Sortier-Zusammenführungs-Verbindung verwendet, führt Oracle die folgenden Schritte nacheinander aus: a Greifen Sie mit der im Ziel-SQL angegebenen Prädikatbedingung zu und greifen Sie dann auf die Ergebnisse zu Sortiert nach der Verbindungsspalte der t1-Tabelle, und der sortierte Ergebnissatz wird als s1 aufgezeichnetb Greifen Sie mit der im Ziel-SQL angegebenen Prädikatbedingung auf die t2-Tabelle zu und sortieren Sie dann die Zugriffsergebnisse danach In der Verbindungsspalte der T2-Tabelle wird die sortierte Ergebnismenge als s2 aufgezeichnet Die Vorteile, Nachteile und Anwendung des Sortier-Merge-Verbindungsszenarios: a. Normalerweise ist der Effekt des Hash-Joins besser als der des Sortier-Merge-Joins. Wenn die Zeilenquelle jedoch sortiert wurde, ist keine erneute Sortierung erforderlich Beim Ausführen eines Sortier-Merge-Joins ist die Leistung des Sortier-Merge-Joins besser als der eines Hash-Joins.b >1) RBO-Modus 2) Ungleichwert-Join (>,<,>=,<=)3) Wenn Hash-Join deaktiviert ist (_HASH_JOIN_ENABLED=false)Beispiel
SQL> select * from scott.emp t1,scott.emp t2 where t1.empno > t2.mgr; 89 rows selected. Execution Plan ---------------------------------------------------------- Plan hash value: 3950110903 ---------------------------------------------------------------------------------------- | Id | Operation | Name | Rows | Bytes | Cost (%CPU)| Time | ---------------------------------------------------------------------------------------- | 0 | SELECT STATEMENT | | 62 | 4712 | 6 (17)| 00:00:01 | | 1 | MERGE JOIN | | 62 | 4712 | 6 (17)| 00:00:01 | | 2 | SORT JOIN | | 14 | 532 | 2 (0)| 00:00:01 | | 3 | TABLE ACCESS BY INDEX ROWID| EMP | 14 | 532 | 2 (0)| 00:00:01 | | 4 | INDEX FULL SCAN | PK_EMP | 14 | | 1 (0)| 00:00:01 | |* 5 | SORT JOIN | | 14 | 532 | 4 (25)| 00:00:01 | | 6 | TABLE ACCESS FULL | EMP | 14 | 532 | 3 (0)| 00:00:01 | ---------------------------------------------------------------------------------------- Predicate Information (identified by operation id): --------------------------------------------------- 5 - access(INTERNAL_FUNCTION("T1"."EMPNO")>INTERNAL_FUNCTION("T2"."MGR")) filter(INTERNAL_FUNCTION("T1"."EMPNO")>INTERNAL_FUNCTION("T2"."MGR")) Statistics ---------------------------------------------------------- 1 recursive calls 0 db block gets 8 consistent gets 0 physical reads 0 redo size 6612 bytes sent via SQL*Net to client 575 bytes received via SQL*Net from client 7 SQL*Net roundtrips to/from client 2 sorts (memory) 0 sorts (disk) 89 rows processed SQL>
Beispiel
SQL> select /*+ gather_plan_statistics use_nl(t1,t2)*/* from scott.emp t1,scott.dept t2 where t1.deptno = t2.deptno; SQL> select * from table(dbms_xplan.display_cursor(null,0,'allstats,last')); PLAN_TABLE_OUTPUT -------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- SQL_ID dcsf9m1rzzga5, child number 0 ------------------------------------- select /*+ gather_plan_statistics use_nl(t1,t2)*/* from scott.emp t1,scott.dept t2 where t1.deptno = t2.deptno Plan hash value: 4192419542 ------------------------------------------------------------------------------------- | Id | Operation | Name | Starts | E-Rows | A-Rows | A-Time | Buffers | ------------------------------------------------------------------------------------- | 0 | SELECT STATEMENT | | 1 | | 14 |00:00:00.01 | 32 | | 1 | NESTED LOOPS | | 1 | 14 | 14 |00:00:00.01 | 32 | | 2 | TABLE ACCESS FULL| DEPT | 1 | 4 | 4 |00:00:00.01 | 7 | |* 3 | TABLE ACCESS FULL| EMP | 4 | 4 | 14 |00:00:00.01 | 25 | ------------------------------------------------------------------------------------- Predicate Information (identified by operation id): --------------------------------------------------- - filter("T1"."DEPTNO"="T2"."DEPTNO") rows selected. SQL>
Hash-Join gilt nur für CBO und kann nur für Equi-Join-Bedingungen verwendet werden
Hash-Join ist Sehr gut geeignet zum Verbinden kleiner und großer Tabellen, insbesondere wenn die Selektivität der Verknüpfungsspalten in einer kleinen Tabelle sehr gut ist, kann die Ausführungszeit eines Hash-Joins ungefähr als äquivalent mit der Zeit angesehen werden, die für einen vollständigen Tabellenscan von a aufgewendet wird große Tabelle
Haha Bei der Durchführung einer Hash-Verbindung kann die dem Treiberergebnissatz entsprechende Hash-Tabelle vollständig im Speicher (PGA-Arbeitsbereich) untergebracht werden. Zu diesem Zeitpunkt ist die Ausführungseffizienz der Hash-Verbindung sehr hoch
Das Leistungsproblem der Hash-Verbindung kann durch das 10104-Ereignis zur Diagnose gelöst werden. Die entsprechenden Anweisungen lauten wie folgt:
Anzahl der In-Memory-Partitionen (kann sich geändert haben): Hash-Partition
Endgültige Anzahl der Hash-Buckets: Hash-Bucket-Nummer
Gesamtzahl der Zeilen: Die Anzahl der Datensätze Steuern des Ergebnissatzes
Maximale Anzahl von Zeilen in einem Bucket: Die im Hash-Bucket enthaltenen Datensätze mit der größten Anzahl von Datensätzen. Anzahl vonDeaktivierte Bitmap-Filterung: Ob die Bitmap-Filterung aktiviert werden soll
BeispielSQL> select /*+ gather_plan_statistics use_hash(t1,t2)*/* from scott.emp t1,scott.dept t2 where t1.deptno = t2.deptno; SQL> select * from table(dbms_xplan.display_cursor(null,0,'allstats,last')); PLAN_TABLE_OUTPUT -------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- SQL_ID 0j83q86ara5u2, child number 0 ------------------------------------- select /*+ gather_plan_statistics use_hash(t1,t2)*/* from scott.emp t1,scott.dept t2 where t1.deptno = t2.deptno Plan hash value: 615168685 ---------------------------------------------------------------------------------------------------------------- | Id | Operation | Name | Starts | E-Rows | A-Rows | A-Time | Buffers | OMem | 1Mem | Used-Mem | ---------------------------------------------------------------------------------------------------------------- | 0 | SELECT STATEMENT | | 1 | | 14 |00:00:00.01 | 13 | | | | |* 1 | HASH JOIN | | 1 | 14 | 14 |00:00:00.01 | 13 | 1321K| 1321K| 1070K (0)| | 2 | TABLE ACCESS FULL| DEPT | 1 | 4 | 4 |00:00:00.01 | 6 | | | | | 3 | TABLE ACCESS FULL| EMP | 1 | 14 | 14 |00:00:00.01 | 7 | | | | ---------------------------------------------------------------------------------------------------------------- Predicate Information (identified by operation id): --------------------------------------------------- 1 - access("T1"."DEPTNO"="T2"."DEPTNO") 21 rows selected. SQL>
Das obige ist der detaillierte Inhalt vonOptimierungsmethode der Oracle-Tabellenverbindungsmethode (mit Beispielen). Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!