SQLチューニングの概要
- SQLステートメントは、データベースからデータを取得/フェッチするために記述されています。 SQLステートメントを高速で実行し(SQLチューニング)、結果を数秒で提供する必要があります。
- SQLの設計が不十分だと、データベース操作全体の速度が低下し、操作全体が停止する可能性があります。機能的に正しいSQLを作成するよりも、効率的なSQLを作成する方がはるかに困難です。 SQLパフォーマンスの調整により、システムの状態とパフォーマンスを大幅に向上させることができます。
- SQLを調整するための鍵は、SQLがアクセスするデータを最小限に抑えて結果を提供することです。アクセスするデータを最小限に抑えて、最適な検索パスで結果を提供できます。
簡単な例は
ですselect * from dept where emp=10
- このクエリでは、テーブル部門全体を検索して、emp=10のデータを見つける必要があります。したがって、テーブル全体にアクセスする必要があります
- これで、emp列へのインデックスを作成すると、インデックスにアクセスして結果を取得できます。したがって、ここではより少ないデータにアクセスします
OracleでSQLチューニングを実行するための12のステップ
SQLパフォーマンスチューニングの一般的なヒント
(1)まず、SQLチューニングに必要なすべてのツールが必要です。トレース、トレースのフォーマット、プランの説明、オラクルでのプランの説明の読み取りに関する十分な情報が必要です。
で利用可能なさまざまな結合方法に関する十分な知識が必要です。 Oracleとそれらを効率的に使用する方法
(2)読み取るデータが少なくなり、I / O効率が高くなります。
sqlステートメントで読み取るデータが多いほど、取得する必要のあるラッチが多くなり、パフォーマンスが低下します。したがって、常に論理読み取りを少なくする必要があります。
適切なフィルターを使用して適切なSQLステートメントを記述します。関連するさまざまなテーブルの行数を確認し、SQLステートメントを作成するための最良の方法を見つけてください
(2)適切なOracleインデックスを使用する
Bツリーインデックスとビットマップインデックスを使用すると、返されるデータが10%未満の場合に、クエリのパフォーマンスを向上させることができます。ただし、インデックスの作成時には、挿入、更新、削除の操作でも維持する必要があるため、注意が必要です。したがって、インデックスを作成すると、多くのことにオーバーヘッドが生じます。したがって、インデックスを作成した場合の影響を注意深く調べる必要があります。
(3)インデックスの使用を無効にするSQLを避けてください
インデックスを無効にするSQL
(a)関数(to_char()、to_date()など)
修正:関数を「定数/バインド変数」側に移動します
(b)型キャスト
SQLの場合
emp_no=10(emp_noはvarchar2)
PL/SQLの場合
emp_no=v_emp_num(v_emp_numは数値)
修飾子
およびid + 0 =111
および日付+1=sysdate(試行日=sysdate – 1)
修正:回避するように変更します
(4)アプリケーションでは常にバインド変数を使用してください。 Oracleでバインド変数を使用しない場合、SQLは毎回解析され、データベースのパフォーマンスに影響します。バインド変数が含まれている場合、SQLはキャッシュされ、それ以降の実行では解析が不要になるため、システムの全体的なパフォーマンスが向上します。
(5)UNIONvsOR。 2つの明確な実行パスを持つクエリにはUNIONを使用します。それぞれがかなり少数の行を返します。すべての行を並べ替える必要があり、ほとんどの行が破棄されるため、多数の行を返す可能性のあるクエリにはユニオンを使用しないでください。または、インデックスを無効にする傾向があります
(6)テーブルの正確なオプティマイザー統計を使用して、最適な計画を取得します。
(7)条件で関数on式を使用している場合は、その列に関数ベースのインデックスがあるかどうかを確認します。存在しない場合、インデックスは使用されません
(8)相関サブクエリの使用は存在するか存在するか、存在しないか存在しないか
(9)不適切なコーディング慣行を避ける
いくつかのヒント
(a)デカルト結合を避ける。クエリに必要なすべてのテーブルが必要であり、相互にリンクされていることを確認してください
(b)データベースへの複数のトリップを回避するためにデコードを使用します
(c)外部結合を回避するようにしてください
(d )ロジックを小さな部分に分解すると、作業が速くなることがあります
(10)複雑なビューを使用する場合は、ビューのパフォーマンスが低下する傾向があるため、代わりにベーステーブルを使用できるかどうかを確認してください
(11)取得したデータに重複する行がないことがわかっている場合は、UNIONALLとUNIONを使用します
(12)ヒントを使用して実行計画を最適化します。ヒントを使用して、クエリの実行プランを変更し、最適なパスを選択できる場合があります。
バインドのピークによって不適切なプランが作成される場合があるため、その場合は、プランを修正するために必要なヒントを入力して、毎回良好なパフォーマンス
最も一般的なヒントは次のとおりです
/* + LEADING(テーブルエイリアス)*/結合を開始するテーブルを指定します
/ * + FIRST_ROWS*/オンラインに非常に適していますscreens –ネストされたループを優先します
/ * + INDEX(テーブルalias.index名)*/使用するインデックスを指定します。注:インデックスが削除されて再作成され、名前が変更された場合、ヒントは無効になります。
/ * + USE_NL(テーブルエイリアス1テーブルエイリアス2)*/オプティマイザに指定された2つのテーブルにネストされたループ結合を使用するように要求します
不要なオプティマイザーのヒントを避け、注意して使用してください
これらは、問題を回避し、SQLチューニングを行うためのヒントの一部です。 SQLチューニングは大きな海であり、練習するだけで物事を学ぶことができます。幸運を祈ります!!
また読む
https://docs.oracle.com/cd/B19306_01/server.102/b14211/sql_1016.htm