2016-04-20 8 views
0

Oracleデータベースが使用されています SALESテーブルと多くのディクショナリテーブルDICT_1、DICT_2、... DIC_Nがあります。 ユーザーは、SALESテーブルを変更(挿入、更新、削除)などのデータ結果と尋ねることができます:多くのRIGHT OUTER JOINとORDERINGを使用してSQLクエリのパフォーマンスを向上させます

SELECT 
S.ID as ID, 
RPAD(D1.NAME, 10) || LPAD(D1.NAME, 10) as NAME, 
    CASE 
     WHEN D2.count > 0 THEN 'Y' 
     ELSE 'N' 
    END 
as FLAG 
D3.FIELD as SOME_FIELD_3 
D4.FIELD as SOME_FIELD_4 
D5.FIELD as SOME_FIELD_5 

FROM SALES S, DICT_1 D1, DICT_2 D2, DICT_3 D3, DICT_4 D4, DICT_5 D5 
WHERE 
    S.D1_ID = D1.ID(+) 
AND S.D2_ID = D2.ID(+) 
AND S.D3_ID = D3.ID(+) 
AND S.D4_ID = D4.ID(+) 
AND S.D5_ID = D5.ID(+) 

ORDER BY NAME; 

だから何sutch辞書はnullを設定していない場合には特売の辞書に参加しようと辞書フィールド・販売から追加フィールドを計算します。選択(たとえば、名前、フラグ、...)から任意のフィールドに服用することができます。クエリによるウィット順序は非常に高速ですが、順序付けのパフォーマンスは低下します。 私はORACLE MATERIALIZED VIEWを使用することを提案しますが、ユーザーはしばしばSALESテーブルを更新してこのaproachを拒否します。 右外部結合と計算結果フィールドを使用してこのクエリを改善する方法を決定してサポートしてください。

+0

これは、古典的な右結合構文ですか? – Magnus

+0

まず、現代的な明示的な結合構文に切り替えます。また、ほとんどの人はLEFT JOINに十分な問題を抱えており、正しいジョインがさらに混乱していることがわかります。だから、みんなに好意を持ち、LEFT JOINに切り替えてください! – jarlh

+0

残念ながら構文はパフォーマンスに影響しません – Alstresh

答えて

0

私はあなたの構文に満足しています。しかし、私はあなたの声明に興味があります:

クエリによって順序は非常に高速ですが、パフォーマンスを注文すると、すべての行を取得しなければならず、データベースは、データの前に注文ORDER BY句でダウン

行くWithot結果セットをあなたに返します。 ORDER BYがなければ、データベースは検索されるとすぐにデータのバッチを返すことができます。結果セット全体のパフォーマンスはほとんど変わりません。

0

ORDER BYだけがSQLを遅くすると言うと、データをフェッチするのではなく、ソートすることで問題が発生します。したがって、事前計算されたデータを持つマテリアライズド・ビューを持っていても、毎回異なるフィールドでデータを動的にソートする必要がある場合、SQLには時間がかかります。

より良いアプローチは です。1.ビジネス/クライアントと話し合い、最も頻繁に使用されるFEWソート列を特定します。 2.これらの識別された列に索引を作成します。 (少数でなければならないか、このSQLのためだけに有用な多くのインデックスで終わります) 3.以下のようにSQLを書き換えます。 AS sorted_result WITH (indexed_Columns BY ORDER FROM indexed_columnsを選択)から、選択し、sorted_result WHERE AND sorted_result.ID = SALES.ID

表アクセスは、WITH句で完了を選別するまで回避されます。外側のSQLはソートされた結果セットを使用してバッチ/ first_rows_nで結果を取得します。並べ替えのためにインデックスにアクセスするだけで、クエリは高速になるはずです。

これが役に立ちます。

関連する問題