SQLパフォーマンスの最適化(A)

まず、効率因子の影響
1、大量のデータ
2は、中国の取得
3、システム構成データベース

第二には、プロセスの実行効率を閲覧
実施計画の簡単な分析を通じて
最もリソースを消費するポイントを見つけるために、1
全表スキャンtable_access減らすために、2を
インデックスを取り、3

第三に、ステップの実装SQL
ここに画像を挿入説明

/*
顺序为有1-6,6个大步骤,然后细分,5-1,5-2,5-3,由小变大顺序,1-J,1-A,1-P,1-U,为并行次序
*/
--查询组合字段
(5)select (5-2) distinct(5-3) top(<top_specification>)(5-1)<select_list>
--连表
(1)from (1-J)<left_table><join_type> join <right_table> on <on_predicate>
        (1-A)<left_table><apply_type> apply <right_table_expression> as <alias>
        (1-P)<left_table> pivot (<pivot_specification>) as <alias>
        (1-U)<left_table> unpivot (<unpivot_specification>) as <alias>
--查询条件
(2)where <where_pridicate>
--分组
(3)group by <group_by_specification>
--分组条件
(4)having<having_predicate>
--排序
(6)order by<order_by_list>

第四に、最適化戦略
1、テーブルの中央に描かれた、データ量削減
2を、事前の割り当ては、先の行うにはいくつかの計算および統計的な作業がある
3は、見当違いな条件での機能(任意の関数)を実行しないようにしてください
4を、表に関連する条件は、インデックスを取る
5条件は、ネストされたループの出現を回避する場合、
6を、さらにデータ量条件接続テーブルを減らします

V.最適化対策
テーブルの前面に1、前面から背面に、テーブル駆動テーブルとしてレコードの最小数を選択するが検索されるので、最小記録
に係る句が順次正面から検索を使用して2、原理は、テーブル間の接続は、その、WHERE条件の他の前に書き込まれなければならない
フィルタリングすることができるWHERE句の最後に書かれた、ならびにリンクされたリストになければならないレコードの最大数の条件を除外することができる最初の濾過されるべき
3、SELECT句「*」の使用を避ける
句と節を備えた場合に置き換え、4
テーブル、別名5
代替には存在して、NOT NOT IN置き換えるEXISTS、6
。7は、テーブルが存在するあるいは接続
、8。インデックス列を避けるためにインデックス故障につながる指数計算の列として用いて計算
NOT欄における使用を回避するために、図9(インデックス列でない使用を引き起こすインデックス障害)
UNION-ALLあるいはUNION、UNIONには、あるいは、または10、
11、注目。組み合わせ指数、最初の列のインデックス
12とインデックス列にあるNULLであるNOT NULLの使用を回避
13は、ORDER BY句は、2つの索引の厳しい条件下でのみ使用されている。
14、インデックス列を変更することを避けるために 入力
資源集約的操作の使用を避け、15(DISTINCTと、UNION、MINUS、INTERSECT、 ORDER BY)

ケース:
。1は、ISとIS NOT NULL NULLは
  NULL値を含む任意の列がインデックスに含まれませんインデックスヌルとして使用することはできません。複数の列などのAの場合、インデックスは、ヌルを含む列があっても、列がインデックスから除外されます。列のNULL値はインデックス列の構築は、パフォーマンスを改善されません場合でも、存在する場合、この手段。
  句がnullの場合はnullステートメントオプティマイザではありません任意の使用は、インデックスを使用することはできません。

「!=」2は、インデックスはテーブルだけに存在するものを伝えることができますことを心にインデックスを使用しませんが、テーブルに存在しない何を伝えることはできません。
んが、インデックスを使用しない:従業員からどこ給与<*選択 > 3000;
使用インデックス:トランザクションから選択ACCOUNT_NAME量> 0;
インデックスを使用して:給与<従業員から選択* > 3000 3000または給与;

図3に示すように、結合カラムは、「||」無効指標として文字他の関数としての機能に接続されている。
索引を使用しない:トランザクションから選択ACCOUNT_NAME、量 ACCOUNT_NAME || ACCOUNT_TYPE =「AMEXA」;
使用ランキング:選択ACCOUNT_NAME、トランザクションどこからACCOUNT_NAME = 'AMEX量 'とACCOUNT_TYPE = 'A';

4、「+」無効指標として他の数学関数などの数学関数である。
インデックス使用しない:選択ACCOUNT_NAME、取引の金額金額+> 5000 3000;
使用インデックス:トランザクションから選択ACCOUNT_NAME、金額量> 2000 ;

図5に示すように、同一のインデックス列は、フルテーブルスキャンを可能にするれ、互いに比較することができない
インデックスを使用せずに:トランザクションから選択ACCOUNT_NAME、量 ACCOUNT_NAME = NVL(:acc_name、ACCOUNT_NAME);
使用ランキング:選択ACCOUNT_NAME、量取引から ACCOUNT_NAME様NVL(:acc_name、 '%' )。

6、ワイルドカード(%)されたとの声明のような
インデックスを使用していない:従業員から選択*どこlast_nameのような 「%cliton%」;
使用のインデックス:従業員からのlast_nameのような選択* 「Cの%」

7、INとEXISTS
...(*選択中の列:インデックス使用せずに 、...から...どこ)
...(「X選択が存在する:使用してインデックス ...から...」);
できるだけ同じ時間にしていないEXISTS、NOT置き換えるために使用されるべきですが、両方は使用しないで(インデックスを使用して速度を減らすことはできません)、NOT NOT INクエリの効率よりも高い存在していても。

公開された66元の記事 ウォンの賞賛8 ビュー20000 +

おすすめ

転載: blog.csdn.net/qq125281823/article/details/104447469