-1

プロシージャにこのクエリがあり、データの読み込みが非常に遅いです。このクエリを実行するより高速な方法はありますか?

SELECT date, price
  FROM ( SELECT date, 
                price,price_src,
                ROW_NUMBER() OVER (PARTITION BY date ORDER BY 
                             CASE WHEN price_src = 'mom' THEN 
                                   0 
                                   WHEN price_src = 'dad' THEN 
                                   1 
                                   WHEN price_src = 'other' THEN 
                                   2 
                                   END) AS roworder
           FROM pr.sources e
          WHERE e.home = inTick
            AND price IS NOT NULL
            AND e.security = inVal
            AND e.securityNum = NVL(inSecurity,'FWD')
            AND bc= 'USD' 
            AND date >= NVL(startDate, date)
            AND date <= NVL(endDate, date)
                )
 WHERE roworder = 1
 ORDER BY date;

inval基本通貨が米ドルで、特定の日付範囲内の特定の値 ( ) の価格を取得したいと考えています。問題は、ここに優先順位付けが含まれていることです。最初に「お母さん」の価格設定ソースから入手してみてください。それが利用できない場合は、「お父さん」に進み、次に「その他」に進みます。

テーブルのサンプルを次に示します。

+------------+------+-----+-------------+--------- ----------+--------+
| | 日付 | ホーム | 紀元前 | セキュリティ番号 | セキュリティ | price_src | 価格 |
+------------+------+-----+-------------+--------- ----------+--------+
| | 2001-05-04 | 3A | 米ドル | 前輪駆動 | 32 | お母さん | 548.54 |
| | 2012-05-04 | 3G | 米ドル | BWD | 58 | お父さん | 58.54 |
| | 2009-05-04 | 3F | 米ドル | 前輪駆動 | 39 | その他 | 588.54 |
| | 2010-05-04 | 3E | 米ドル | 前輪駆動 | 38 | お母さん | 38.54 |
+------------+------+-----+-------------+--------- ----------+--------+

テーブルには 200 万を超えるレコードがあります。特定の日付の特定の値 (通貨またはプロパティである可能性があります) の価格を取得することになっています。

クエリの実行には 10 秒かかり (1 回の実行で)、ループで呼び出されます。実行ごとに遅いタイミングが蓄積されると、全体が遅くなります。

4

1 に答える 1

1

さらに情報がなければ、これをお勧めします:

  • ループを削除して、一度に 1 行ではなくセット ベースの操作を実行できるかどうかを確認します
  • securityNum、security、home、price、bc、date、priceSource にインデックスを追加します
  • inSecurity の nvl を削除し、null かどうかに応じて 2 つの個別のステートメントを作成します。
于 2013-01-30T07:33:44.017 に答える