国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁(yè) > 數(shù)據(jù)庫(kù) > Oracle > 正文

Oracle8i基于規(guī)則的優(yōu)化機(jī)制對(duì)表達(dá)式的處理

2024-08-29 13:45:15
字體:
來(lái)源:轉(zhuǎn)載
供稿:網(wǎng)友

        Oracle優(yōu)化器在任何可能的時(shí)候都會(huì)對(duì)表達(dá)式進(jìn)行評(píng)估,并且把特定的語(yǔ)法結(jié)構(gòu)轉(zhuǎn)換成等價(jià)的結(jié)構(gòu),這么做的原因是:
·         要么結(jié)果表達(dá)式能夠比源表達(dá)式具有更快的速度

·         要么源表達(dá)式只是結(jié)果表達(dá)式的一個(gè)等價(jià)語(yǔ)義結(jié)構(gòu)

不同的SQL結(jié)構(gòu)有時(shí)具有同樣的操作(例如:= ANY (subquery) and IN (subquery)),ORACLE會(huì)把他們映射到一個(gè)單一的語(yǔ)義結(jié)構(gòu)。

下面將討論優(yōu)化器如何評(píng)估優(yōu)化如下的情況和表達(dá)式:常量 LIKE 操作符 IN 操作符 ANY和SOME 操作符 ALL 操作符 BETWEEN 操作符 NOT 操作符 傳遞(Transitivity) 確定性(DETERMINISTIC)函數(shù)
常量
常量的計(jì)算是在語(yǔ)句被優(yōu)化時(shí)一次性完成,而不是在每次執(zhí)行時(shí)。下面是檢索月薪大于2000的的表達(dá)式:

·         sal > 24000/12

·         sal > 2000

·         sal*12 > 24000

假如SQL語(yǔ)句包括第一種情況,優(yōu)化器會(huì)簡(jiǎn)單地把它轉(zhuǎn)變成第二種。 

注重:優(yōu)化器不會(huì)簡(jiǎn)化跨越比較符的表達(dá)式,例如第三條語(yǔ)句,鑒于此,應(yīng)用程序開(kāi)發(fā)者應(yīng)該盡量寫(xiě)用常量跟字段比較檢索的表達(dá)式,而不要將字段置于表達(dá)式當(dāng)中。
LIKE 操作符
優(yōu)化器把使用LIKE操作符和一個(gè)沒(méi)有通配符的表達(dá)式組成的檢索表達(dá)式轉(zhuǎn)換為一個(gè)“=”操作符表達(dá)式。

例如:優(yōu)化器會(huì)把表達(dá)式ename LIKE 'SMITH'轉(zhuǎn)換為ename = 'SMITH'

優(yōu)化器只能轉(zhuǎn)換涉及到可變長(zhǎng)數(shù)據(jù)類型的表達(dá)式,前一個(gè)例子中,假如ENAME字段的類型是CHAR(10), 那么優(yōu)化器將不做任何轉(zhuǎn)換。
IN 操作符
優(yōu)化器把使用IN比較符的檢索表達(dá)式替換為等價(jià)的使用“=”和“OR”操作符的檢索表達(dá)式。

例如,優(yōu)化器會(huì)把表達(dá)式ename IN ('SMITH','KING','JONES')替換為

    ename = 'SMITH' OR ename = 'KING' OR ename = 'JONES'
ANY和SOME 操作符
優(yōu)化器將跟隨(following)值列表的ANY和SOME檢索條件用等價(jià)的同等操作符和“OR”組成的表達(dá)式替換。

例如,優(yōu)化器將如下所示的第一條語(yǔ)句用第二條語(yǔ)句替換:

·         sal > ANY (:first_sal, :second_sal)

·         sal > :first_sal OR sal > :second_sal

優(yōu)化器將跟隨子查詢的ANY和SOME檢索條件轉(zhuǎn)換成由“EXISTS”和一個(gè)相應(yīng)的子查詢組成的檢索表達(dá)式。

例如,優(yōu)化器將如下所示的第一條語(yǔ)句用第二條語(yǔ)句替換:

·         x > ANY (SELECT sal FROM emp WHERE job = 'ANALYST')

·         EXISTS (SELECT sal FROM emp WHERE job = 'ANALYST' AND x > sal)
ALL 操作符
優(yōu)化器將跟隨值列表的ALL操作符用等價(jià)的“=”和“AND”組成的表達(dá)式替換。

例如,sal > ALL (:first_sal, :second_sal)表達(dá)式會(huì)被替換為:

    sal > :first_sal AND sal > :second_sal

 對(duì)于跟隨子查詢的ALL表達(dá)式,優(yōu)化器用ANY和另外一個(gè)合適的比較符組成的表達(dá)式替換。

例如,優(yōu)化器會(huì)把表達(dá)式 x > ALL (SELECT sal FROM emp WHERE deptno = 10) 替換為:

    NOT (x <= ANY (SELECT sal FROM emp WHERE deptno = 10))

接下來(lái)優(yōu)化器會(huì)把第二個(gè)表達(dá)式適用ANY表達(dá)式的轉(zhuǎn)換規(guī)則轉(zhuǎn)換為下面的表達(dá)式:

    NOT EXISTS (SELECT sal FROM emp WHERE deptno = 10 AND x <= sal)
BETWEEN 操作符
優(yōu)化器總是用“>=”和“<=”比較符來(lái)等價(jià)的代替BETWEEN操作符。


例如:優(yōu)化器會(huì)把表達(dá)式sal BETWEEN 2000 AND 3000用sal >= 2000 AND sal <= 3000來(lái)代替。
NOT 操作符
優(yōu)化器總是試圖簡(jiǎn)化檢索條件以消除“NOT”邏輯操作符的影響,這將涉及到“NOT”操作符的消除以及代以相應(yīng)的比較運(yùn)算符。

例如,優(yōu)化器將下面的第一條語(yǔ)句用第二條語(yǔ)句代替:

·         NOT deptno = (SELECT deptno FROM emp WHERE ename = 'TAYLOR')

·         deptno <> (SELECT deptno FROM emp WHERE ename = 'TAYLOR')

通常情況下一個(gè)含有NOT操作符的語(yǔ)句有很多不同的寫(xiě)法,優(yōu)化器的轉(zhuǎn)換原則是使“NOT”操作符后邊的子句盡可能的簡(jiǎn)單,即使可能會(huì)使結(jié)果表達(dá)式包含了更多的“NOT”操作符。

例如,優(yōu)化器將如下所示的第一條語(yǔ)句用第二條語(yǔ)句代替:

·         NOT (sal < 1000 OR comm IS NULL)

·         NOT sal < 1000 AND comm IS NOT NULL sal >= 1000 AND comm IS NOT NULL
傳遞(Transitivity)
假如“WHERE”子句的兩個(gè)檢索條件涉及了一個(gè)共同的字段,優(yōu)化器有時(shí)會(huì)根據(jù)傳遞原理推斷出第三個(gè)檢索條件,隨后可以根據(jù)這個(gè)推斷出的條件對(duì)語(yǔ)句進(jìn)行優(yōu)化,推斷出的條件可能會(huì)激活一個(gè)原來(lái)的檢索條件沒(méi)有激活的潛在的接口路徑(access path)。

注重:傳遞僅僅被用在基于代價(jià)(cost-based)的優(yōu)化中。

假設(shè)有一個(gè)這樣的包含兩個(gè)檢索條件的“WHERE”子句:WHERE 字段1 <comp_oper> 常量 AND字段1 = 字段2,在這個(gè)例子里,優(yōu)化器會(huì)推斷出新的檢索條件:字段2 <comp_oper> 常量。在這里,<comp_oper>是比較運(yùn)算符=、!=、^=、<>、>、<= 或 >=之中的任何一個(gè),常量是指任何一個(gè)涉及了操作符、SQL函數(shù)、文字、綁定變量(bind variables)或者關(guān)聯(lián)變量(correlation variables)的常量表達(dá)式。

例如,考慮這樣一個(gè)包含兩個(gè)各自使用了字段EMP.DEPTNO的檢索條件的WHERE子句的查詢:

SELECT * FROM emp, dept WHERE emp.deptno = 20 AND emp.deptno = dept.deptno;

使用傳遞優(yōu)化,優(yōu)化器會(huì)推斷出如下條件:dept.deptno = 20

假如有索引存在于EMP.DEPTNO字段上,這個(gè)條件會(huì)使調(diào)用這個(gè)索引的接口路徑有效。

注重:優(yōu)化器只能對(duì)字段關(guān)聯(lián)常量的表達(dá)式進(jìn)行推斷,而不是字段關(guān)聯(lián)字段的表達(dá)式。例如,包含這樣條件的WHERE子句:字段1 <comp_oper> 字段3 AND 字段1 = 字段2,這種情況不能推斷出表達(dá)式:字段2 < comp_oper> 字段3。
確定性(DETERMINISTIC)函數(shù)
在某些情況下,優(yōu)化器能夠使用先前的函數(shù)返回結(jié)果而不是重新執(zhí)行用戶定義的函數(shù),這僅僅對(duì)那些以限制的方式來(lái)執(zhí)行的函數(shù)來(lái)說(shuō)是有效的。這些函數(shù)必須對(duì)任何的輸入都有同樣的返回值,函數(shù)的結(jié)果必須不能因?yàn)榘≒ACKAGE)變量、數(shù)據(jù)庫(kù)或會(huì)話(session)的參數(shù)(例如NLS參數(shù))不同而變化,假如函數(shù)在將來(lái)重新定義,返回值必須對(duì)任何參數(shù)來(lái)說(shuō)仍然與以前的返回值相同。函數(shù)的創(chuàng)建者可以在以CREATE FUNCTION、CREATE PACKAGE或者CREATE TYPE聲明函數(shù)時(shí)根據(jù)以上的要求使用DETERMINISTIC要害字向數(shù)據(jù)庫(kù)申明該函數(shù)為確定性函數(shù),數(shù)據(jù)庫(kù)不會(huì)對(duì)確定性函數(shù)的合法性進(jìn)行校驗(yàn),即使一個(gè)函數(shù)明顯的使用了包變量或操作了數(shù)據(jù)庫(kù),仍然可以被定義為確定性函數(shù),這就是說(shuō)如何安全合法的使用和定義確定性函數(shù)是程序員的責(zé)任。

當(dāng)確定性函數(shù)在同一個(gè)查詢里被多次調(diào)用,或者被基于函數(shù)的索引或物化視圖(materialized view)調(diào)用時(shí),有可能被一個(gè)已經(jīng)計(jì)算出的值取代

發(fā)表評(píng)論 共有條評(píng)論
用戶名: 密碼:
驗(yàn)證碼: 匿名發(fā)表
主站蜘蛛池模板: 太康县| 高青县| 阿拉善右旗| 南汇区| 赫章县| 平湖市| 鞍山市| 察隅县| 宝山区| 宜都市| 永寿县| 特克斯县| 九台市| 惠来县| 武隆县| 泾源县| 元谋县| 应城市| 娄烦县| 临沧市| 钟祥市| 吉隆县| 盐山县| 三门峡市| 大悟县| 昌宁县| 静宁县| 公主岭市| 武定县| 石渠县| 定边县| 清涧县| 佛山市| 邓州市| 巨野县| 霍城县| 金平| 金平| 弥渡县| 武穴市| 南陵县|