0

サブクエリを使用して最初の行を返す次の (例) select ステートメントでパフォーマンスの問題があります。

SELECT ITEM_NUMBER,
       PROJECT_NUMBER,       
       NVL((SELECT DISTINCT
                   FIRST_VALUE(L.LOCATION) OVER (ORDER BY L.SORT1, L.SORT2 DESC) LOCATION
            FROM   LOCATIONS L
            WHERE  L.ITEM_NUMBER=P.ITEM_NUMBER
                   AND L.PROJECT_NUMBER=P.PROJECT_NUMBER
           ),
          P.PROJECT_NUMBER) LOCATION
FROM   PROJECT P

を実行することでDISTINCTパフォーマンスの問題が発生していますが、別の方法がわかりません。SORTUNIQUE

ただし、次のようなものが望ましいですが、2 つの select ステートメント内での参照は機能しません。

SELECT ITEM_NUMBER,
       PROJECT_NUMBER,       
       NVL((SELECT LOCATION
            FROM   (SELECT L.LOCATION LOCATION
                           ROWNUM RN
                    FROM   LOCATIONS L
                    WHERE  L.ITEM_NUMBER=P.ITEM_NUMBER
                           AND L.PROJECT_NUMBER=P.PROJECT_NUMBER
                    ORDER BY L.SORT1, L.SORT2 DESC
                   ) R
            WHERE RN <=1
           ), P.PROJECT_NUMBER) LOCATION
FROM   PROJECT P

さらに: - 私の権限では関数を作成できません。- メイン クエリで 10k から 100k のレコードを循環しています。- サブクエリは、1 行に制限する前に 3 ~ 7 行を返す可能性があります。

パフォーマンスを向上させるための支援を歓迎します。

4

2 に答える 2

3

サンプル データとカーディナリティがないと理解するのは難しいですが、これで目的が達成できるでしょうか? 場所の最初の出現を含む、プロジェクトとアイテムの一意のリスト?

SELECT 
P.ITEM_NUMBER,
P.PROJECT_NUMBER,       
MIN(L.LOCATION) KEEP (DENSE_RANK FIRST ORDER BY L.SORT1, L.SORT2 DESC) LOCATION
FROM   
LOCATIONS L
INNER JOIN
PROJECT P
ON L.ITEM_NUMBER=P.ITEM_NUMBER
AND L.PROJECT_NUMBER=P.PROJECT_NUMBER
GROUP BY
P.ITEM_NUMBER,
P.PROJECT_NUMBER
于 2013-01-29T05:57:57.747 に答える
-2

私は過去に同様の問題に遭遇しました - これは究極の解決策ではありませんが (実際にはコーナーカットかもしれません) - Oracle クエリオプティマイザは OPTIMIZER_MODE init パラメータで調整できます。

http://docs.oracle.com/cd/B28359_01/server.111/b28274/optimops.htm#i38318の 11.2.1 章をご覧ください。

FIRST_ROWS

オプティマイザは、コストとヒューリスティックを組み合わせて使用​​して、最初の数行を高速に配信するための最適な計画を見つけます。注: ヒューリスティックを使用すると、クエリ オプティマイザーが、ヒューリスティックを適用しないプランのコストよりも大幅に高いコストのプランを生成する場合があります。FIRST_ROWS は下位互換性とプランの安定性のために利用できます。代わりに FIRST_ROWS_n を使用してください。

もちろん、インデックス、結合効率、クエリ プランなど、分析すべき要素は他にもたくさんあります。

于 2013-01-29T03:47:54.510 に答える