并入父查询中的派生表

可以通过使用 SQL 将简单查询中的派生表并入父查询中(而不是并入放在临时表中的查询结果)来提高集合派生表的性能。

按照以下所示使用 SQL:

select * from ((select col1, col2 from tab1)) as vtab(c1,c2)

但是,如果如果查询由于涉及聚集、ORDER BY 操作或 UNION 操作而变得复杂,那么服务器将创建一个临时表。

数据库服务器使用与服务器通过 IFX_FOLDVIEW 配置参数折叠视图相似的方式折叠派生表(如启用视图折叠以提高查询性能所述)。启用 IFX_FOLDVIEW 配置参数时,视图将并入父查询中。没有将视图并入放在临时表里的查询结果中。

以下示例显示并入主查询中的派生表。

图: 使用并入父查询中的派生表的查询计划

select * from ((select vcol0, tab1.col1 from
        table(multiset(select col2 from tab2 where col2 > 50 ))
	vtab2(vcol0),tab1 )) vtab1(vcol1,vcol2)
	where vcol1 = vcol2

Estimated Cost: 2
Estimated # of Rows Returned: 1

  1) gbasedbt.tab2: SEQUENTIAL SCAN

        Filters: gbasedbt.tab2.col2 > 50

  2) gbasedbt.tab1: SEQUENTIAL SCAN

        Filters:
        Table Scan Filters: gbasedbt.tab1.col1 > 50

DYNAMIC HASH JOIN
    Dynamic Hash Filters: gbasedbt.tab2.col2 = gbasedbt.tab1.col1 

图: 使用并入父查询中的派生表的第二个查询计划

select * from (select col1 from tab1 where col1 = 100) as vtab1(c1)
left join (select col1 from tab2 where col1 = 10) as vtab2(vc1)
on  vtab1.c1 =  vtab2.vc1

Estimated Cost: 5
Estimated # of Rows Returned: 1

      1) gbasedbt.tab1: SEQUENTIAL SCAN

            Filters: gbasedbt.tab1.col1 = 100

      2) gbasedbt.tab2: AUTOINDEX PATH

        (1) Index Keys: col1   (Key-Only)
            Lower Index Filter: gbasedbt.tab1.col1 = gbasedbt.tab2.col1
            Index Key Filters:  (gbasedbt.tab2.col1 = 10 )

    ON-Filters:(gbasedbt.tab1.col1 = gbasedbt.tab2.col1
            AND gbasedbt.tab2.col1 = 10 )
    NESTED LOOP JOIN(LEFT OUTER JOIN)

以下示例显示涉及 UNION 操作的复杂查询。 此时,已经创建了一个临时表。

图: 创建临时表的复杂派生表查询

select * from (select col1 from tab1 union select col2 from tab2 )
as vtab(vcol1)  where vcol1 < 50

Estimated Cost: 4
Estimated # of Rows Returned: 1

    1) (Temp Table For Collection Subquery): SEQUENTIAL SCAN