區域性範圍掃瞄的條件
通常在sql中使用了order by 將無法實現區域性範圍掃瞄,但如果優化器選擇的驅動索引列與order by 排序列相同,則可以按照區域性範圍掃瞄的方式進行處理。由此可見,並不是所有使用了order by的sql都無法實現區域性範圍掃瞄,唯獨在執行計畫中出現了sort時才真正地無法實現區域性範圍掃瞄。
滿足驅動查詢條件的資料範圍越小,所執行的操作量就越少;而滿足過濾查詢條件的資料範圍越大,所執行的操作量越少。
1.滿足驅動查詢條件的資料範圍越小越有效。在此情況下,由於其他查詢條件對執行速度的影響比較小,所以始終可以確保較快的執行速度。
2.在滿足驅動查詢條件和其他查詢條件的資料範圍都大的情況下,始終可以確保具有較快的執行速度。然後,滿足其他查詢條件的資料範圍較小時,反倒容易影響執行速度。
3.在滿足驅動查詢條件的資料範圍較大,而滿足其他查詢條件的資料範圍較小,從而導致執行速度緩慢的情況下,如果把資料範圍較小的查詢條件作為驅動查詢條件來使用,則可以提高執行速度。
滿足驅動查詢條件的資料範圍
滿足過濾查詢條件的資料範圍
執行速度
採取的措施小小
快大快大
小慢交換驅動查詢條件與過濾條件的角色大快
向區域性範圍掃瞄引導的方法
1.利用訪問路徑實現對sort的代替
索引列序也是能否實現區域性範圍掃瞄的乙個非常重要的前提條件。在要求按照where中沒有使用到的列進行排序的情況下,為了實現在sql中不使用order by 排序,把該列新增到索引中是乙個非常好的解決方案。
例:select ord_dept,ordqty*1000
from order
where ord_date like 『2011%』order by ord_dept desc;
在該sql中,負責資料讀取的列是「ord_date」,而在order by 中所使用的列卻是「ord_dept desc」。如果滿足驅動查詢條件「ord_date like 『2011%』」的資料範圍很大,則無法獲得較好的執行速度。因此,需要對sql做適當的變形:
select /*+ index_desc(a ord_dept_index) */
ord_dept,ordqty*1000
from order a
where ord_date like 『2011%』 and ord_dept>』』
當兩個條件的查詢資料範圍大時:「滿足驅動查詢條件的資料範圍大,且滿足其他查詢條件的資料範圍也大時,執行速度快」。
通過採取一些措施將原有的驅動查詢條件變為過濾查詢條件,原來的過濾查詢條件變為驅動查詢條件,從而實現了區域性範圍掃瞄。
2.只使用索引的區域性範圍掃瞄
為了有效處理大範圍資料而不斷努力的原因,並不是因為掃瞄的索引中資料範圍比較大,而是當所要處理的資料範圍比較大時,經過索引對錶的隨機讀取會大大增加。索引只在查詢第乙個滿足條件的索引行時發生隨機讀取,之後執行的是連續掃瞄,但是從表中讀取資料始終都是按照隨機方式進行的。
通過使用各種方法將親密度較高的列篩選出來,分析其使用頻度、讀取條件中的比較運算子、分布度等內容來決定列序。
3.靈活使用min、max區域性範圍掃瞄
4.filter型區域性範圍掃瞄
exists是檢查子查詢中的結果是否存在的布林型函式,如果存在就返回true,否則返回false。
5.利用rownum的區域性範圍掃瞄
6.利用巢狀檢視的區域性範圍掃瞄
將必須使用全部範圍掃瞄的部分**在巢狀檢視中,以確保檢視之外的部分能夠以區域性範圍掃瞄的方式來執行。
7.利用函式的區域性範圍掃瞄
8.利用查詢語句二元化特性的區域性範圍掃瞄
具有區域性範圍
123 45void foo int x,int y foo 6,7 當foo 呼叫引數6和7,foo的引數x是創造和分配價值的6,和foo的y引數是創造和分配價值的7。雖然引數不在功能塊宣布,函式引數具有區域性範圍。這意味著他們建立呼叫函式時,和被破壞時,該功能塊終止 123 void foo i...
springBoot的自動掃瞄包範圍
springboot的註解掃瞄的預設規則是從springboot的專案入口類。若入口類所在的包是com.example.demo那麼自動掃瞄包的範圍是com.example.demo包及其下面的子包,如果service包和dao包不在此包小面,則不會自動掃瞄。手動配置springboot另外的掃瞄包...
MySQL8 0之跳躍範圍掃瞄
跳躍範圍掃瞄是mysql在8.0.13版本新增加的用於提高效能的新特性,跳躍範圍掃瞄可以使以前部分無法使用到聯合索引的sql利用聯合索引進行查詢,並且可以更高效的利用聯合索引,這對於使用mysql聯合索引進行查詢的應用意義重大。通過乙個示例來解釋跳躍範圍掃瞄 create table t1 f1 i...