2011-11-09 12 views
3

私は以下のようなクエリを持っています。テーブルA、T、Sは約100万行、Pは1億以上の行を持っています。私はこのクエリにインラインビュー "temp"を新たに導入し、パフォーマンスが大幅に低下しました。 temp用に取得されたデータはほとんど50行で、このインラインクエリは単独で実行されたときにスナップインで実行されます。Oracleのインラインビューでのパフォーマンスの問題

自動トレース統計では、これを追加した後にtempを9桁の数字に導入する前に、6桁の数字から「一貫性のある取得」の数が大幅に増加しています。また、LAST_CR_BUFFER_GETSの90%以上が「一時」ビューに含まれています。このビューのデータを一時テーブルに抽出し、そのテーブルを結合の一部として使用すると、パフォーマンスは非常に良いですが、その解決策は私にとっては実際には実現できません。

私はこの質問が非常に一般化されていることを知っていますが、このインラインビューを使用するにあたって何かが間違っているのではないかと思います。 インラインビューでは、このデータを一時テーブルに格納するのと同じパフォーマンスが得られませんか? 有効な方法でこのビューを使用し、パフォーマンスを向上させるためにOracleに助言を与える方法はありますか。

select t.id, 
      a.date 
    from A a, 
      T t, 
      P p, 
      S s, 
      (select id 
      from S, 
        R 
      where s.id = r.id 
       and r.code = 10 
        r.code1 = 20 
        r.name = 'string1') temp 
    where ...cond1 
      ...cond2 
      ...cond2 
    s.id = temp.id 
+2

こんにちは、あなたのクエリプランを投稿できますか? –

+1

実際のクエリ(あなたには店舗全体に構文エラーがあります)と説明計画、テーブルサイズなどを投稿して、開始することができます。 – Ollie

+3

サブセレクトのカーディナリティ推定値のような音が途切れています。 [このドキュメントを読む](http://www.oracle.com/technetwork/database/focus-areas/bi-datawarehousing/twp-explain-the-explain-plan-052011-393674.pdf) – Gaius

答えて

0
WITH TEMP AS 
(select id 
     from S, 
       R 
     where s.id = r.id 
      and r.code = 10 
       r.code1 = 20 
       r.name = 'string1') 
select t.id, 
     a.date 
from A a, 
     T t, 
     P p, 
     S 
where ...cond1 
     ...cond2 
     ...cond2 
s.id = temp.id; 

このクエリを実行しようとすると、このクエリ私のチューニング経験に基づいて

1

ベストの推測のための実行計画を提供してください、それはおそらく、インライン・ビュー「の一時を評価していますされます"A、t、p、sに参加して得られた結果セットから一致するレコードにつき1回。 ここで最善の解決策は、このように書き直すことです。 ORDEREDヒントは、FROM句にテーブルを追加したい順番でテーブルを提供していることを前提としています。 私はtempとsを最初にリストしました。これは、temp.id = s.idにリストされている唯一の結合条件です。 また、結合基準の一部である他のすべての列に索引があるとします。これ以上質問があれば教えてください。

select /*+ ordered use_nl(a t p s) */ 
    t.id, a.date 
from (
    select id 
    from S, 
     R 
    where s.id = r.id and r.code = 10 r.code1 = 20 r.name = 'string1' 
    ) temp, 
    S s, 
    A a, 
    T t, 
    P p 
where ...cond1 ...cond2 ...cond2 and s.id = temp.id 
関連する問題