Rowid的概念:
rowid是一個偽列,既然是偽列,那麼這個列就不是使用者定義,而是系統自己加上去的。每個表都有一個rowid的偽列,但是表中並沒有物理儲存ROWID列的值。不過你可以像使用其它列那樣使用它,但是不能刪除改列,也不能對該列的值進行修改、插入。一旦一行資料插入資料庫,則rowid在該行的生命週期內是唯一的,即即使該行產生行遷移,行的rowid也不會改變。
為什麼要使用ROWID
rowid對存取一個表中的給定的行提供了最快的存取方法,透過ROWID可以直接定位到相應的資料塊上,然後將其讀到記憶體。當我們建立一個索引時,索引不但儲存索引列的值,而且也儲存索引值所對應的行的ROWID,這樣我們透過索引快速找到對應行的ROWID後,透過該ROWID,就可以迅速將資料查詢出來。這也就是我們使用索引查詢時,速度比較快的原因。
在ORACLE8以前的版本中,ROWID由FILE 、BLOCK、ROW NUMBER構成。隨著oracle8中物件概念的擴展,ROWID發生了變化,ROWID由OBJECT、FILE、BLOCK、ROW NUMBER構成。利用DBMS_ROWID可以將rowid分解成上述的各部分,也可以將上述的各部分組成一個有效的rowid。
Recursive SQL概念有時為了執行使用者發出的一個sql語句,Oracle必須執行一些額外的語句,我們將這些額外的語句稱之為'recursive calls'或'recursive SQL statements'。如當一個DDL語句發出後,ORACLE總是隱含的發出一些recursive SQL語句,來修改資料字典訊息,以便使用者可以成功的執行該DDL語句。當所需的資料字典資訊沒有在共享記憶體中時,經常會發生Recursive calls,這些Recursive calls會將資料字典資訊從硬碟讀入記憶體中。使用者不比關心這些recursive SQL語句的執行情況,在需要的時候,ORACLE會自動的在內部執行這些語句。當然DML語句與SELECT都可能造成recursive SQL。簡單的說,我們可以將觸發器視為recursive SQL。
Row Source(行來源)
用在查詢中,由上一操作傳回的符合條件的行的集合,即可以是表格的全部行資料的集合;也可以是表格的部分行資料的集合;也可以為對上2個row source進行連接操作(如join連接)後所得到的行資料集合。
Predicate(謂詞)
一個查詢中的WHERE限制條件
Driving Table(驅動表)
該表又稱為外層表(OUTER TABLE)。這個概念用於嵌套與HASH連接中。如果該row source傳回較多的行數據,則對所有的後續操作有負面影響。注意此處雖然翻譯為驅動表,但實際上翻譯為驅動行來源(driving row source)更為確切。一般說來,是應用查詢的限制條件後,返回較少行源的表作為驅動表,所以如果一個大表在WHERE條件有有限制條件(如等值限制),則該大表作為驅動表也是合適的,所以並不是只有較小的表可以作為驅動表,正確說法應該為應用查詢的限制條件後,返回較少行源的表作為驅動表。在執行計劃中,應該為靠上的那個row source,後面會給予具體說明。在我們後面的描述中,一般將該表稱為連接操作的row source 1。
Probed Table(被探查表)
此表又稱為內層表(INNER TABLE)。在我們從驅動表中得到具體一行的資料後,在該表中尋找符合連接條件的行。所以該表應為大表(實際上應該為傳回較大row source的表)且對應的列上應該有索引。在我們後面的描述中,一般將該表稱為連接操作的row source 2。
組合索引(concatenated index)
由多個欄位構成的索引,如create index idx_emp on emp(col1, col2, col3, …),則我們稱idx_emp索引為組合索引。在組合索引中有一個重要的概念:引導列(leading column),在上面的例子中,col1列為引導列。當我們進行查詢時可以使用”where col1 = ? ”,也可以使用”where col1 = ? and col2 = ?”,這樣的限制條件都會使用索引,但是”where col2 = ? ”查詢就不會使用該索引。所以限制條件包含先導列時,此限制條件才會使用該組合索引。
可選擇性(selectivity):
比較一下列中唯一鍵的數量和表格中的行數,就可以判斷該列的可選擇性。如果該列的」唯一鍵的數量/表中的行數」的比值越接近1,則該列的可選擇性越高,該列就越適合建立索引,同樣索引的可選擇性也越高。在可選擇性高的欄位上進行查詢時,傳回的資料就較少,比較適合使用索引查詢。
有了這些背景知識後就開始介紹執行計劃。為了執行語句,Oracle可能必須實作許多步驟。這些步驟中的每一步可能是從資料庫中實體檢索資料行,或用某種方法準備資料行,供發出語句的使用者使用。 Oracle用來執行語句的這些步驟的組合稱為執行計劃。執行計畫是SQL最佳化中最複雜、最關鍵的部分,只有知道ORACLE在內部到底是如何執行該SQL語句後,我們知道優化器選擇的執行計畫是否是最優的。執行計畫對於DBA來說,就像財務報表對財務人員一樣重要。所以我們面臨的問題主要是:如何得到執行計劃;如何分析執行計劃,以找出影響績效的主要問題。以下先從分析樹型執行計劃開始介紹,再介紹如何得到執行計劃,再介紹如何分析執行計劃。
舉例:
這個範例顯示關於下面SQL語句的執行計劃。
SELECT ename, job, sal, dname
FROM emp, dept
WHERE emp.deptno = derpt.deptno
AND NOT EXISTS
( SELECT *
FROM salgrade
WHERE emp.sal BETWEEN losal AND hisal );
此語句查詢薪水不在任何建議薪水範圍內的所有僱員的名字,工作,薪水和部門名。
本文出自CSDN博客,轉載請標示出處: http://blog.csdn.net/lcyhjx/archive/2009/12/20/5044672.aspx