-1

自己結合を持つクエリが必要なビューを作成したいと考えています。かなりの量のデータを取得するため、パフォーマンスと動作が心配です。テーブルとクエリの詳細は次のとおりです (元のテーブルにはより多くの列があり、複数の列からの結果が必要になります。これは例を示すためのものです):-
Person テーブル

PK NAME       SPOUSE_REF_ID   IS_MARRIED
1  John          Null             Y
2  Alice          1               Y
3  Varvatos      Null             Y
4  Barbara        5               Y
5  Stanely       Null             Y
6  Ross          Null             N
7  Henry         Null             N

結婚していて、spouse_ref_id を持っている人のデータを照会する必要があります。したがって、私が作成したクエリは次のとおりです。

select a.NAME spouse_name, a.SERVICE_NO, a.id,a.employment_category_id, pf.name name, pf.service_no,pf.id,
  pf.employment_category_id
  from person a
 inner join person pf on
  a.id = pf.spouse_ref_id
  where a.IS_MARRIED ='Y'

その最適化について教えてください。また、クエリを再構築するとより良い結果が得られると思われる場合や、クエリなどで自己結合を使用することはお勧めできない場合など
は、最適化されたビューで返信していただければ幸いです。

4

1 に答える 1

-2

ビューをクエリすると、バックグラウンドで、ビューの構築に使用されたクエリが実行され、適切なデータが返されます。

ときどき、結合で where 句を使用すると、予期しない結果がフェッチされることに気付きました。したがって、元のクエリを次のように変更することをお勧めします:-

select a.NAME spouse_name, a.SERVICE_NO, a.id,a.employment_category_id, pf.name name, pf.service_no,pf.id,
  pf.employment_category_id
  from person a
 inner join person pf on
  a.id = pf.spouse_ref_id
  and a.IS_MARRIED ='Y'

実行できる別の最適化は、spouse_ref_id に (一意のインデックス)/ (インデックス) を作成することです。これにより、自己結合を実行しているときに、両方のインスタンスの完全なテーブル スキャンが行われないことが保証されます。次のクエリがさらに良い結果をもたらすかどうか、または意図したとおりになるかどうかはわかりません (ただし、試してみる価値はあります):-

select a.NAME spouse_name, a.SERVICE_NO, a.id,a.employment_category_id, pf.name name, pf.service_no,pf.id,
      pf.employment_category_id
      from person a
     inner join person pf on
      a.id = pf.spouse_ref_id
      and a.IS_MARRIED ='Y'
      and pf.IS_MARRIED='Y'
于 2013-03-15T03:15:04.950 に答える