-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 子句)对查询有两个潜在影响。

  • 它们允许优化器具体化结果集,有效地创建一个临时表来保存结果。据我所知,它执行此操作的条件没有记录,但我已经读过,如果集合的大小超过会话的排序区域大小,并且结果将在查询。

  • 有时会出现与 CTE 查询优化相关的错误。

所以在性能方面,如果您有一个多次使用的大型结果集,那么我认为它是 CTE 的更好候选者。

我倾向于在 Oracle 和 PostgreSQL 中大量使用它们,因为我发现它们使代码比嵌套的内联视图更清晰。

于 2013-02-15T10:24:14.280 回答
1

如果您继续将其作为子查询进行,则使用 CTE / WITH 子句不太可能影响性能,因为 SQL 解释器将有效地将其扩展为长形式 - 用于此类目的(即不使用递归 CTE 的地方) ,使用 CTE 是一种有效地编写更 DRY 的代码的方式。

可以肯定的是,比较两个版本产生的查询计划。

在任何一种情况下,现有的查询结构都非常低效,因为它实际上必须为主查询中返回的每一行单独执行每个子查询。

于 2013-02-15T07:36:29.033 回答
1

根据我在 11gR2 中的经验,使用 WITH 子句可能会更慢。提示materialize可以非常有效并大大缩短执行时间。但正如 Mark Ba​​nnister 所说,要进行真正的调整,您需要制定执行计划。

于 2013-02-15T10:18:37.517 回答