sql >> データベース >  >> RDS >> Oracle

Oracle 10g ConnectByPrior-パフォーマンスの問題

    私はあなたの状況を再現しようとしましたが、Oracleにインデックスを賢く使用させることができませんでした。私はそれを行うためのいくつかの賢い方法があると確信しています。しかし、ここにいる他の誰もそれを理解できない場合は、以下が愚かで醜い方法です。

    特定の数のレベルしか取得していないため、手動で接続を作成できます。最初のレベルを取得し、それを2番目のレベル(最初のクエリのコピーから結果を取得する)に結合し、それを3番目のレベル(2番目のクエリのコピーから結果を取得する)に結合するなど。3つのレベルのみを実行しました。ここにありますが、コピーして貼り付けて4番目にすることができます。元のIDが何度も繰り返されるため、使用するのは難しいですが、超高速です(160万レコードの私のマシンでは0.005秒)。

    --Original animal
    select '101' original_animal, animal_id, line_id, sire_animal_id, dam_animal_id, 0 "level" from animals where animal_id = '101'
    union all
    --Parents
    select '101' original_animal, animal_id, line_id, sire_animal_id, dam_animal_id, 1 "level" from animals
    where animal_id = (select sire_animal_id from animals where animal_id = '101')
    union all
    select '101' original_animal, animal_id, line_id, sire_animal_id, dam_animal_id, 1 "level" from animals
    where animal_id = (select dam_animal_id from animals where animal_id = '101')
    union all
    --Grand parents
    select '101' original_animal, animal_id, line_id, sire_animal_id, dam_animal_id, 2 "level" from animals
    where animal_id =
    (
      select sire_animal_id from animals
      where animal_id = (select sire_animal_id from animals where animal_id = '101')
    )
    union all
    select '101' original_animal, animal_id, line_id, sire_animal_id, dam_animal_id, 2 "level" from animals
    where animal_id =
    (
      select dam_animal_id from animals
      where animal_id = (select sire_animal_id from animals where animal_id = '101')
    )
    union all
    select '101' original_animal, animal_id, line_id, sire_animal_id, dam_animal_id, 2 "level" from animals
    where animal_id =
    (
      select sire_animal_id from animals
      where animal_id = (select dam_animal_id from animals where animal_id = '101')
    )
    union all
    select '101' original_animal, animal_id, line_id, sire_animal_id, dam_animal_id, 2 "level" from animals
    where animal_id =
    (
      select dam_animal_id from animals
      where animal_id = (select dam_animal_id from animals where animal_id = '101')
    );
    


    1. ビット演算子を使用したさまざまなモジュールのユーザーロール権限

    2. SQL Server 2008 で select ステートメントと追加の列を使用してテーブルに挿入する

    3. rake db:test:prepareで移行を保留しているレール

    4. 文字列からシーケンスを取得した後、シーケンスから欠落している番号を見つけますか?