クエリの処理パフォーマンスを向上させるために、次のヒントを使用して、より効率的なクエリを構築することを検討してください。これらのヒントは、クエリをより効率的に書き換えるために、クエリ処理中にオプティマイザーによって選択される最適化を反映しています。これらの効率化をクエリに組み込むことによって、オプティマイザーの作業量が減少する可能性があります。
ヒント | 改善の前後 | 説明 | ||||
---|---|---|---|---|---|---|
不要な DISTINCT 条件の排除 |
改善前:
改善後:
|
Products テーブルにプライマリキー p.ID があり、結果セットの一部になっているので、最初の文の DISTINCT キーワードは不要です。 |
||||
不要な DISTINCT 条件の排除 |
改善前:
改善後:
|
最初のクエリには両方のテーブルのプライマリキーが含まれているため、結果内の各ローは異なります。 |
||||
サブクエリのネスト解除 |
改善前:
改善後:
|
ネストされたクエリをジョインとして書き換えると、より効率的な実行とより効果的な最適化につながる場合があります。一般的に、サブクエリのネスト解除は、FROM 句にテーブルを多くても 1 つだけ含んだ相関サブクエリに対して常に実行されます。これらの相関サブクエリは、ANY、ALL、EXISTS の各述部で使用されます。クエリのセマンティクス上、サブクエリが返すローは多くても 1 つだけであると判断できる場合は、非相関サブクエリ、または FROM 句に複数のテーブルを含んだサブクエリはフラットにされます。 この例では、サブクエリは外部ブロック内の各ローに対して、多くても 1 つのローしか一致させられません。多くても 1 つのローしか一致させられないため、内部ジョインに変換できます。 |
||||
サブクエリのネスト解除 |
改善前:
改善後:
|
改善前のクエリは、サブクエリ内に結合 EXISTS 述部があり、複数のローと一致する可能性があります。SELECT リストに DISTINCT を使って、内部ジョインに変換できます。 |
||||
サブクエリのネスト解除 |
改善前:
改善後:
|
サブクエリで、外部ブロックの各ローに対して多くても 1 つのローしか一致しない場合、比較しているサブクエリを削除します。 |
||||
インデックスカラムを問い合わせる場合の IN 述部の使用の検討 |
改善前:
改善後:
|
書き換えられた形式では、IN リスト述部を検索引数可能として扱い、インデックス検索に利用できます。また、オプティマイザーが IN リストをインデックスのソート順に合わせてソートし、検索効率を向上させることができます。 定数だけ、またはクエリブロック 1 回の実行中に定数である値 (外部参照など) だけを IN リストに指定してください。 |
||||
不要なジョインの排除 |
改善前:
改善後:
|
次の場合にジョインの排除を検討してください。
この場合、ジョインはプライマリキーから外部キーへのジョインであり、プライマリキーテーブル Products は削除できます。つまり、2 番目のクエリは、SalesOrderItems テーブルの中で、Products への NULL 外部キーを持つローが結果に現れないため、セマンティック上は 1 番目のクエリと同じです。 |
||||
不要なジョインの排除 |
改善前:
改善後:
|
最初のクエリでは、NULL 入力テーブル式が保護された側のローに対して複数のローを生成できず、LEFT OUTER JOIN を超えて Products のカラムが使用されないため、OUTER JOIN を削除できます。 |
||||
大文字と小文字の不要な変換の排除 |
改善前:
改善後:
|
大文字と小文字を区別しないデータベースでは、最初のクエリは書き換えることができます。そのため、オプティマイザーでは Customers.Surname のインデックスを使用することを検討できます。 デフォルトでは、明示的なテキスト変換指示 (UPPER、UCASE、LOWER、LCASE の使用) が指定されないかぎり、データベースサーバーで大文字と小文字を区別しない文字列比較が実行されます。大文字と小文字の不要な変換の排除により、述部を検索引数可能な述部にすることができます。検索引数可能な述部は、対応するテーブルのインデックス検索を使用できます。 |
||||
関数のインライン化の検討 |
改善前:
改善後:
|
次のいずれかの形式の場合、ユーザー定義関数をインライン化できます。
このヒントは、テンポラリ関数、再帰関数、または NOT DETERMINISTIC 句のある関数には適用されません。 また、このヒントは関数がサブクエリを使用して引数として呼び出された場合、または関数がテンポラリプロシージャーの内部から呼び出された場合にも適用されません。 |
||||
単純なストアドプロシージャーのインライン化の検討 |
改善前:
改善後:
|
単一の SELECT 文としてのみ定義されたストアドプロシージャーは、クエリの FROM 句で呼び出すときにインライン化できます。プロシージャーがインライン化される場合は、派生テーブルとして書き換えられます。このヒントは、デフォルトの引数を使用し、単一の SELECT 文以外が本文に存在するプロシージャーには適用されません。 |
![]() |
DocCommentXchange で意見交換できます
|
Copyright © 2012, iAnywhere Solutions, Inc. - SQL Anywhere 12.0.1 |