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