天天看點

Oracle 全表掃描及其執行計劃(full table scan)

    全表掃描是Oracle通路資料庫表是較為常見的通路方式之一。很多朋友一看到SQL語句執行計劃中的全表掃描,就要考慮對其進行修理一番。全表掃描的存在,的确存在可能優化的餘地。但事實上很多時候全表掃描也并非是最低效的,完全要看不同的情形與場合,任一方式都是有利有弊的,也就是具體情況要具體分析。本文描述了什麼是全表掃描以及何時發生全表掃描,何時全表掃描才低效。

  本文涉及到的相關連結:

1、什麼是全表掃描?

    全表掃描就是掃表表中所有的行,實際上是掃描表中所有的資料塊,因為Oracle中最小的存儲機關是Oracle block。

    掃描所有的資料塊就包括高水位線以内的資料塊,即使是空資料塊在沒有被釋放的情形下也會被掃描而導緻I/O增加。

    在全表掃描期間,通常情況下,表上這些相鄰的資料塊被按順序(sequentially)的方式通路以使得一次I/O可以讀取多個資料塊。

    一次讀取更多的資料塊有助于全表掃描使用更少的I/O,對于可讀取的資料塊被限制于參數DB_FILE_MULTIBLOCK_READ_COUNT。

2、何時發生全表掃描?

    a、表上的索引失效或無法被使用的情形(如對謂詞使用函數、計算、NULL值、不等運算符、類型轉換)

    b、查詢條件傳回了整個表的大部分資料                 

    c、使用了并行方式通路表

    d、使用full 提示

    e、統計資訊缺失時使得Oracle認為全表掃描比索引掃描更高效    

    f、表上的資料塊小于DB_FILE_MULTIBLOCK_READ_COUNT值的情形可能産生全表掃描

3、示範全表掃描的情形

4、全表掃描何時低效?

5、小表的全表掃描是否高效?

更多參考

<a href="http://blog.csdn.net/robinson_0612/article/details/7783724">DML Error Logging 特性 </a>

<a href="http://blog.csdn.net/robinson_0612/archive/2010/12/15/6078622.aspx">PL/SQL --&gt; 遊标</a>

<a href="http://blog.csdn.net/robinson_0612/archive/2010/12/22/6092066.aspx">PL/SQL --&gt; 隐式遊标(SQL%FOUND)</a>

<a href="http://blog.csdn.net/robinson_0612/article/details/7536926">批量SQL之 FORALL 語句</a>

<a href="http://blog.csdn.net/robinson_0612/article/details/7545597">批量SQL之 BULK COLLECT 子句</a>

<a href="http://blog.csdn.net/robinson_0612/article/details/7372061">PL/SQL 集合的初始化與指派</a>

<a href="http://blog.csdn.net/robinson_0612/article/details/7372061">PL/SQL 聯合數組與嵌套表</a>

<a href="http://blog.csdn.net/robinson_0612/article/details/7387647">PL/SQL 變長數組</a>

<a href="http://blog.csdn.net/robinson_0612/article/details/6084390">PL/SQL --&gt; PL/SQL記錄</a>

<a href="http://blog.csdn.net/robinson_0612/article/details/7422254">SQL tuning 步驟</a>

<a href="http://blog.csdn.net/robinson_0612/article/details/7406672">高效SQL語句必殺技</a>

<a href="http://blog.csdn.net/robinson_0612/article/details/6893477">父遊标、子遊标及共享遊标</a>

<a href="http://blog.csdn.net/robinson_0612/article/details/6904229">綁定變量及其優缺點</a>

<a href="http://blog.csdn.net/robinson_0612/article/details/6866925">dbms_xplan之display_cursor函數的使用</a>

<a href="http://blog.csdn.net/robinson_0612/article/details/6866870">dbms_xplan之display函數的使用</a>

<a href="http://blog.csdn.net/robinson_0612/article/details/6860007">執行計劃中各字段各子產品描述</a>

<a href="http://blog.csdn.net/robinson_0612/article/details/6837771">使用 EXPLAIN PLAN 擷取SQL語句執行計劃</a>