查看自我加入桌上

时间:2013-03-14 21:57:35

标签: sql oracle view query-optimization self-join

我想创建一个视图,我将需要一个自我加入的查询。我很担心它的性能和行为,因为它将获取大量数据。表和查询的详细信息如下(原始表有更多列,我将需要多列的结果;这只是为了向您展示一个示例): -
人员表

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'

请告知我有关其优化的信息,如果您认为重组查询会获得更好的结果,或者在查询等方面不建议自行加入。
我希望得到一个优化视图的回复。

1 个答案:

答案 0 :(得分:-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'