-1

以下のような構造のクエリがあります。

select (select first_name 
        from sub_table_1,
             sub_table_2,
             sub_table_3 
        where <where clause for sub_table 1,2,4> 
          and sub_table_1.col_1=table_1.col_1) first_name ,
       (select last_name 
        from sub_table_1,
             sub_table_2,
             sub_table_3 
        where <where clause for sub_table 1,2,4> 
              and sub_table_1.col_1=table_1.col_1) last_name ,
       <other select clause for table 1,2,3>
from table_1,
     table_2,
     table_3
where <Where clauses>
union
select (select first_name 
        from sub_table_1,
             sub_table_2,
             sub_table_3 
        where <where clause for sub_table 1,2,3> 
          and sub_table_1.col_1=table_4.col_1) first_name ,
       (select last_name 
        from sub_table_1,
             sub_table_2,
             sub_table_3 
        where <where clause for sub_table 1,2,3> 
          and sub_table_1.col_1=table_4.col_1) last_name ,
       <other select clause for table 4,5,6>
from table_4,
     table_5,
     table_6
where <Where clauses>

私は参加するかどうか私としてしたい:

(select first_name , last_name
    from sub_table_1,
    sub_table_2,
    sub_table_3 
    where <where clause for sub_table 1,2,3> 
    and sub_table_1.col_1=table_4.col_1) first_name ,
        (select last_name 
    from sub_table_1,
    sub_table_2,
    sub_table_3 
    where <where clause for sub_table 1,2,3> )

クエリをより速く、より良くするのに役立つか、悪影響を及ぼします。

また、このサブクエリはそれ自体で約10000レコードをフェッチする可能性があることにも注意してください。

助けてください

4

3 に答える 3

4

一般的なテーブル式(WITH句)は、私が知る限り、クエリに2つの潜在的な影響を及ぼします。

  • これらにより、オプティマイザーは結果セットを実体化し、結果を保持するための一時テーブルを効果的に作成できます。これを行う条件は、私が知る限り文書化されていませんが、セットのサイズがセッションの並べ替え領域のサイズを超えた場合に発生し、結果がで複数回使用される場合に発生することを読みました。クエリ。

  • CTEクエリの最適化に関連するバグが時々あります。

したがって、パフォーマンスの面では、複数回使用される大きな結果セットがある場合は、CTEの候補として適していると思います。

ネストされたインラインビューよりもコードがはるかに明確になるため、OracleとPostgreSQLの両方で頻繁に使用する傾向があります。

于 2013-02-15T10:24:14.280 に答える
1

サブクエリとして引き続き実行する場合、SQLインタープリターが効果的に長い形式に拡張するため(つまり、再帰的なCTEを使用しない場合)、CTE/WITH句を使用してもパフォーマンスに影響を与える可能性はほとんどありません。 、CTEの使用は、よりドライなコードを効果的に記述する方法です。

確かに、両方のバージョンで作成されたクエリプランを比較してください。

いずれの場合も、既存のクエリ構造は、メインクエリで返される行ごとに個別に各サブクエリを効果的に実行する必要があるため、非常に非効率的です。

于 2013-02-15T07:36:29.033 に答える
1

11gR2での私の経験から、WITH句の使用は遅くなる可能性があります。ヒントmaterializeは非常に効率的で、実行時間を大幅に改善できます。しかし、Mark Ba​​nnisterが言ったように、実際の調整を行うには、実行計画に取り組む必要があります。

于 2013-02-15T10:18:37.517 に答える