SQL中使用WITH AS提高性能

1. Overview

The WITH query_name clause lets you assign a name to a subquery block. You can then reference the subquery block multiple places in the query by specifying the query name. Oracle Database optimizes the query by treating the query name as either an inline view or as a temporary table.

使用WITH AS语句可以为一个子查询语句块定义一个名称,使用这个子查询名称可以在查询语句的很多地方引用这个子查询。Oracle数据库像对待内联视图或临时表一样对待被引用的子查询名称,从而起到一定的优化作用。

You can specify this clause in any top-level SELECT statement and in most types of subqueries. The query name is visible to the main query and to all subsequent subqueries except the subquery that defines the query name itself.

你可以在任何一个顶层的SELECT语句以及几乎所有类型的子查询语句前,使用子查询定义子句。被定义的子查询名称可以在主查询语句以及所有的子查询语句中引用,但未定义前不能引用

2. 实例

从上面的定义可以看出,WITH AS短语作为子查询,可以让你做很多事情,定义一个SQL片断,该SQL片断会被整个SQL语句所用到。有的时候,是为了让SQL语句的可读性更高些,也有可能是在UNION ALL的不同部分,作为提供数据的部分。特别对于UNION ALL比较有用。因为UNION ALL的每个部分可能相同,但是如果每个部分都去执行一遍的话,则成本太高,所以可以使用WITH AS短语,则只要执行一遍即可。因此起到了优化执行时间的目的。

在ITS产品中,Cardinal公司的developer定义的SQL查询效率就非常高,其中就用到了WITH … AS语句。参考学习下:

 
WITH T_EVENTIDS AS (SELECT EL.EPC_UNINTERNED, MAX(EV.EVENT_ID) AS EVENT_ID FROM EVENTSCHEMA.EVENT EV
 
INNER JOIN EVENTSCHEMA.EPCLIST EL ON EL.EVENT_ID = EV.EVENT_ID
 
WHERE EL.EPC_UNINTERNED IN ('urn:epc:id:sgtin:IBM.product001.003', 'urn:epc:id:sgtin:IBM.product001-01-01.001')
 
GROUP BY EL.EPC_UNINTERNED)
 
SELECT EI.EPC_UNINTERNED, EI.EVENT_ID, MB.ELEMENT_NAME AS BIZSTEP, MD.ELEMENT_NAME AS DISPOSITION FROM T_EVENTIDS EI
 
INNER JOIN EVENTSCHEMA.EVENT EV ON EV.EVENT_ID = EI.EVENT_ID
 
LEFT OUTER JOIN MDMSCHEMA.VOCABULARY_ELEMENT MB ON MB.INTERNAL_ID = EV.BIZSTEP
 
LEFT OUTER JOIN MDMSCHEMA.VOCABULARY_ELEMENT MD ON MD.INTERNAL_ID = EV.DISPOSITION

Leave a Comment.