Oracleテーブル接続方式の最適化方法(例あり)
この記事の内容は、Oracle テーブル接続の最適化方法(例付き)に関するもので、一定の参考価値がありますので、困っている方は参考にしていただければ幸いです。
Oracleデータベースでは、2つのテーブル間のテーブル接続方法として、ソート・マージ接続、ネスト・ループ接続、ハッシュ接続、デカルト接続の4つがあります
1.ソート・マージ接続(ソート・マージ結合)
ソート・マージ・ジョインは、2 つのテーブルを接続する場合に、ソート (SORT) 操作とマージ (MERGE) 操作を使用して接続結果セットを取得するテーブル接続方法です。 t2 テーブルがテーブル接続を作成するときにソートマージ接続を使用すると、Oracle は次の手順を順番に実行します:
a. ターゲット SQL で指定された述語条件で t1 テーブルにアクセスし、結果は次のようになります。 t1テーブルの接続列を基準にソートし、ソート結果集合をs1
bとして記録 対象SQLに指定された述語条件に基づいてt2テーブルにアクセスし、アクセス結果をソートt2 テーブルの接続列に追加すると、ソートされた結果セットは s2
c として記録されます。s1 と s2 をマージし、一致するレコードを最終的な結果セットとして取り出します
利点、接続のソートとマージの短所と応用 シナリオ:
a. 通常の状況では、ハッシュ結合の効果はソート マージ結合より優れていますが、行ソースがソートされている場合は、ソートする必要はありません。ソート・マージ結合を実行する場合は、再度ソートしてください。この場合、ソート・マージの方がハッシュ結合よりもパフォーマンスが向上します。
b. 通常、ソート・マージ結合は、次の状況が発生した場合にのみ使用されます。
1) RBO モード 2) 不等値結合 (>,<,>=,<=)3) ハッシュ結合が無効な場合 (_HASH_JOIN_ENABLED=false) )例
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>
#t1 テーブルと t2 テーブルがテーブル接続を行うときにネストされたループ接続を使用する場合、Oracle は次の手順を順番に実行します。
a. まず、オプティマイザは、特定のルールに従って、t1 と t2 で誰が駆動テーブルで誰が被駆動テーブルであるかを決定します。駆動テーブルは外側のループに使用され、被駆動テーブルはメモリ ループに使用されます。 。 t1 が駆動テーブル
b であるとします。ターゲット SQL で指定された述語条件を使用して駆動テーブル t1 にアクセスし、結果セット s1
c を取得します。s1 を走査し、同時に駆動テーブル t2 を走査、つまり取り出します。 s1 内のレコードは、接続条件に従って駆動テーブル t2 と照合されます。最終的に結果セットが返されます。
ネストされたループ接続の長所、短所、適用可能なシナリオ:
a. 高速な応答を実現できます。接続結果を返す前に、すべての接続操作が完了するのを待つ必要がなく、条件付きレコードができるだけ早く返されること
b. 駆動テーブルに対応する駆動結果セットのサイズが小さいことが適しています。レコードの数と同時に、駆動テーブルの接続に列に一意のインデックスがあります (または、駆動テーブルの接続列に適切な選択性を持つ非一意のインデックス)
#Example
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>
ハッシュ結合は、2 つのテーブルが接続されている場合に、ハッシュ操作に依存して接続結果セットを取得するテーブル接続方法です。 Oracle 7.3 以降に導入されました
ハッシュ結合は、テーブル (通常は小さなテーブル) をハッシュしてハッシュ リストに格納し、別のテーブルからレコードを抽出し、ハッシュ操作を実行して、ハッシュ内の対応する値を見つけることによって機能します。 list. 、一致するための ハッシュ結合は CBO にのみ適用でき、同等の結合条件にのみ使用できますハッシュ結合は、小さなテーブルと大きなテーブルの結合に非常に適しています。特に、小さなテーブル内の結合列の選択性が非常に優れている場合、ハッシュ結合の実行時間は、大きなテーブルの全テーブル スキャンに費やされる時間とほぼ同じになる可能性があります。ハッシュ接続を行う場合、対応するハッシュ テーブルはドライバーの結果セットはメモリ (PGA ワークスペース) に完全に収容できます。この時点で、ハッシュ接続の実行効率は非常に高くなります。
ハッシュ接続のパフォーマンスの問題は 10104 によって解決できます。診断するイベントの場合、関連する手順は次のとおりです。
最終的なハッシュ バケットの数: ハッシュ バケットの数
バケットの合計:空のバケット: 空ではないバケット: ハッシュ バケット内の空のレコードと空ではないレコードの状況合計行数: 駆動結果セット内のレコードの数
バケット内の最大行数:ハッシュ バケットに含まれるレコード数が最も多いレコード NumberDisabled bitmap filtering: ビットマップ フィルタリングを有効にするかどうか
Example
SQL> 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>
[関連する推奨事項:
SQL チュートリアル ]
以上がOracleテーブル接続方式の最適化方法(例あり)の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

ホットAIツール

Undresser.AI Undress
リアルなヌード写真を作成する AI 搭載アプリ

AI Clothes Remover
写真から衣服を削除するオンライン AI ツール。

Undress AI Tool
脱衣画像を無料で

Clothoff.io
AI衣類リムーバー

AI Hentai Generator
AIヘンタイを無料で生成します。

人気の記事

ホットツール

メモ帳++7.3.1
使いやすく無料のコードエディター

SublimeText3 中国語版
中国語版、とても使いやすい

ゼンドスタジオ 13.0.1
強力な PHP 統合開発環境

ドリームウィーバー CS6
ビジュアル Web 開発ツール

SublimeText3 Mac版
神レベルのコード編集ソフト(SublimeText3)

ホットトピック









Oracle Tablespaceサイズを照会するには、次の手順に従ってください。クエリを実行して、TableSpace名を決定します。DBA_TABLESPACesからTableSpace_Nameを選択します。クエリを実行してテーブルスペースのサイズをクエリします:sum(bytes)をtotal_size、sum(bytes_free)asavail_space、sum(bytes) - sum(bytes_free)as sum(bytes_free)as dba_data_files from tablespace_

Oracle View暗号化により、ビュー内のデータを暗号化でき、それにより機密情報のセキュリティが強化されます。手順には以下が含まれます。1)マスター暗号化キー(MEK)の作成。 2)暗号化されたビューを作成し、暗号化されるビューとMEKを指定します。 3)暗号化されたビューにアクセスすることをユーザーに許可します。暗号化されたビューがどのように機能するか:ユーザーが暗号化されたビューを求めてクエリをするとき、OracleはMEKを使用してデータを復号化し、認定ユーザーのみが読み取り可能なデータにアクセスできるようにします。

Oracleでインスタンス名を表示するには3つの方法があります。「sqlplus」と「v $ instanceからselect instance_name;」を使用します。」コマンドラインのコマンド。 「show instance_name;」を使用しますSQL*Plusのコマンド。オペレーティングシステムのタスクマネージャー、Oracle Enterprise Manager、またはオペレーティングシステムを介して、環境変数(LinuxのOracle_Sid)を確認してください。

Oracleインストール障害のためのアンインストールメソッド:Oracleサービスを閉じ、Oracleプログラムファイルとレジストリキーを削除し、Oracle環境変数をアンインストールし、コンピューターを再起動します。アンインストールが失敗した場合、Oracle Universal Uninstallツールを使用して手動でアンインストールできます。

Oracle Cursorの閉鎖問題を解決する方法には、次のものが含まれます。 Scopeが終了した後に自動的に閉じるように、for update句のカーソルを宣言します。使用句のカーソルを宣言して、関連するPL/SQL変数が閉じられたときに自動的に閉じるようにします。例外処理を使用して、例外の状況でカーソルが閉じていることを確認します。接続プールを使用して、カーソルを自動的に閉じます。自動送信を無効にし、カーソルの閉鎖を遅延させます。

Oracle無効な数値誤差は、データ型の不一致、数値オーバーフロー、データ変換エラー、またはデータの破損によって引き起こされる場合があります。トラブルシューティング手順には、データ型のチェック、デジタルオーバーフローの検出、データ変換のチェック、データの破損のチェック、nls_numeric_charactersパラメーターの構成、データ検証ロギングの有効化など、他の可能なソリューションの調査が含まれます。

SQLステートメントは、Oracleの動的SQLを使用して、ランタイム入力に基づいて作成および実行できます。手順には、次のものが含まれます。動的に生成されたSQLステートメントを保存するための空の文字列変数を準備します。 executeを即座に使用するか、ステートメントを準備して、動的なSQLステートメントをコンパイルおよび実行します。バインド変数を使用して、ユーザー入力またはその他の動的値を動的SQLに渡します。実行するか、実行するか、動的SQLステートメントを実行します。

Oracleでは、forループループは動的にカーソルを作成できます。手順は次のとおりです。1。カーソルタイプを定義します。 2。ループを作成します。 3.カーソルを動的に作成します。 4。カーソルを実行します。 5。カーソルを閉じます。例:カーソルをサイクルごとに作成して、上位10人の従業員の名前と給与を表示できます。
