l id="commonList">
WITH D AS(
SELECT /*+materialize*/ * FROM (
SELECT INNER_TABLE.*, ROWNUM OUTER_TABLE_ROWNUM FROM (
SELECT D.* FROM SP_SO_OUTAGE_PLAN D WHERE 1 = 1
<include refid="flowStateCondition" />
<include refid="queryCondition" />
<if test="sortFieldName !='' and sortFieldName !=null and sortType !='' and sortType !=null">
ORDER BY ${sortFieldName} ${sortType} NULLS LAST,D.ID
</if>
) INNER_TABLE WHERE ROWNUM <= #{END_NUM}
) OUTER_TABLE WHERE OUTER_TABLE_ROWNUM > #{START_NUM}
)
结论:
在一定的情况下,我们可以用with与hint materialize结合的方式取代全局临时表和物化视图来提高查询效率,使用情况如下。
1. 当次查询的结果记录数不是太多的情况下,如果结果记录集比较庞大,还是推荐使用GTT,因为那里面可以指定索引等。
2. 查询值和查询过滤条件中如果含有重复执行的表达式,可以用此方式减少一次计算。
3. 相同子查询被多次使用。