1

テーブルからすべての製品コード(mal_no列)と数量データ(adet列)を読み込もうとしています(「hso」表で、mal_noで索引付けされています。 mal_noの索引を持っています)。ただし、データ行が1行しかない場合でも、実行は継続され、終了することはありません。1行テーブルに参加するには時間がかかります

この参加なしのクエリ(以下のコメントアウトされた部分のみ追加)は即時です。

ご意見はありますか?

おかげで、

select mt.mal_no,hso.adet siparis, 
    mot.birim_no,round((mbs.eldeki_stok_miktar*0.8),0) duzelts, 
    mot.oncelik, 
    SUM(round((mbs.eldeki_stok_miktar*0.8),0)) OVER(ORDER BY 
    mot.oncelik desc ROWS BETWEEN UNBOUNDED PRECEDING AND CURRENT ROW) kumule_stok 
from [email protected] mbs 
    ,[email protected] mt 
    ,[email protected] mot 
    ,web_hso hso 
where 1=1 
and hso.mal_no=mbs.mal_no 
and mbs.mal_no=mt.mal_no 
and mbs.birim_no=mot.birim_no 
and mt.mal_grup_no=mot.mal_grup_no 
and mt.mal_altgrup_no=mot.mal_altgrup_no 
--and mt.mal_no in ('1035541001') 
and mbs.eldeki_stok_miktar>0 
and mot.oncelik>0 
and mbs.ambar_no='01' 
order by mot.oncelik desc 
+0

ジョインは大丈夫だと思われます。おそらく、これらのテーブルのDDL /構造を教えてください。 –

答えて

0

情報のこのくらいから伝えるのは難しいです。

しかし、私は、この手順に従うためにあなたを示唆している:あなたは任意のデータベース管理者を持っているか、あなたは適切なツールを持っている場合は、実行計画を確認した場合

  1. を。たとえば、TOADにはOracleデータベースの実行計画が表示されます。
  2. ネストされたループ内の実行計画に「フルスキャン」が表示された場合は、データベースが繰り返し表をスキャンしていることを意味します。全体的なアプローチのために

、あなたはこれらのメソッドを使用することができます。ここで、条件項目は、最初のセットを減らすものを見つけるの中

  1. を。
  2. (Oracle)データベースを明示的に定義するために、インデックスヒントとuse_nlヒントを使用して、テーブルへの移動方法を指定します。

最後に、原則として、大きな結合を避けるようにしてください。データを分割して征服するネストされたループを作成し、データを取得しながらインデックスを使用してください。

2

3つのテーブルをリモートデータベースからローカルデータベースの1つに結合しています。このような分散問合せは、2つのデータベース間でネットワークを介してデータを送信する必要があるため、低速であることが知られています。

ローカルデータベースはリモートデータベースにサブクエリを送信します。結合とフィルタリングはローカルで行われるため、リモートデータベースから大量の冗長データを送信する可能性があります。したがって、最適なサブクエリを作成できるように、オプティマイザに十分な情報を提供する必要があります。例えば

、インライン・ビューにリモート表を隔離:私はあなたのデータモデルやデータを理解していないので、

select rmt.mal_no, 
     hso.adet siparis, 
     rmt.birim_no, 
     rmt.duzelts, 
     rmt.oncelik, 
     rmt.kumule_stok 
from web_hso hso 
    join 
     (select mt.mal_no, 
       mot.birim_no, 
       round((mbs.eldeki_stok_miktar*0.8),0) duzelts, 
       mot.oncelik, 
       SUM(round((mbs.eldeki_stok_miktar*0.8),0)) 
       OVER(ORDER BY mot.oncelik desc ROWS BETWEEN UNBOUNDED PRECEDING AND CURRENT ROW) kumule_stok 
from [email protected] mbs 
    join [email protected] mt 
     on mbs.mal_no=mt.mal_no 
    join [email protected] mot 
     on mbs.birim_no=mot.birim_no 
     and mt.mal_grup_no=mot.mal_grup_no 
     and mt.mal_altgrup_no=mot.mal_altgrup_no 
     where mbs.eldeki_stok_miktar>0 
     and mot.oncelik>0 
     and mbs.ambar_no='01') rmt 
    on hso.mal_no=rmt.mal_no 
    order by rmt.oncelik desc 

明らかにこれは唯一の推測です。良いクエリを作成するには、ドメイン知識をここに適用する必要があります。インラインビューだけでは、必要なすべての速度を提供できない場合があります。たとえば、ほとんどの作業で3つのリモートテーブルの結合が行われ、そうである可能性が高い場合は、@ BriteSpongeが示すように、the driving_site hintを使用するとパフォーマンスが大幅に向上する可能性があります。だから、上からインライン・ビューを使用して、コードは、Oracleのドキュメントが更なるガイダンスを持って

select /*+DRIVING_SITE(rmt)*/ 
     rmt.mal_no, 
     hso.adet siparis, 
     rmt.birim_no, 
     rmt.duzelts, 
     rmt.oncelik, 
     rmt.kumule_stok 
from web_hso hso 
    join (...) rmt 
    on hso.mal_no=rmt.mal_no 

を開始します。 Find out more

+0

私はヒントがあまり好きではありませんが、DRIVING_SITEのヒントを使用すると、ここで助けになるかもしれません。 – BriteSponge

+0

@BriteSponge - DRIVING_SITEヒントは、一般に、より安全なヒントの1つと考えられています。それは良い提案であり、私はそれを私の答えに組み込んだ。 – APC

関連する問題