全表掃描是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 --> 遊标</a>
<a href="http://blog.csdn.net/robinson_0612/archive/2010/12/22/6092066.aspx">PL/SQL --> 隐式遊标(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 --> 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>