可以通过使用 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