使用索引消除排序
索引是有順序的,如果一個查詢使用索引,可以利用索引的順序讀取資料,這樣可以消除OrderBy的排序。
前提:索引列的順序和OrderBy的順序完全一致
實驗使用Hr模式的Employees表,查詢某個工種(job_id)的所有員工,並且按照入職時間降序排列。檢視索引對排序的影響。
1.檢視job_id為IT_PROG和ST_MAN的員工,按照工種(Job_id),入職時間(Hire_date)降序排列
可以看到根據索引的順序讀取資料,消除了OrderBy排序
![](https://i.iter01.com/images/b20f756928225138c87a51b55cefb8fb24d0af19ab8ddbacd8dc3f4ca3209acc.png)
單獨給Job_id列建立索引,則結果如下(SORT ORDER BY不能避免)
![](https://i.iter01.com/images/f074667c6eb3fb151d5804044af90127f0ebba9d45686c03fd1738966e66caf6.png)
2.查詢工種(Job_id)為IT_PROG的員工,並且按照入職時間降序排列。
可以看到,單一的Job_id作為過濾條件,也可以使用排序消除的特性
![](https://i.iter01.com/images/946126818814223ddf00e7fdc25fb8f564945973d448999d3ee0f9f2c70b9568.png)
3.查詢工種(Job_id)為IT_PROG的員工,並且按照入職時間升序排列。
使用單一的Job_id作為過濾條件,甚至升序排列,也能夠做到排序消除(INDEX RANGE SCAN DESCENDING)
![](https://i.iter01.com/images/08f19836bc4e7bee8b0f1a4f731e56105b7ae9f62d1ee523ca4f81b8b3e9c120.png)
4.檢視job_id為IT_PROG和ST_MAN的員工,按照工種(Job_id),入職時間(Hire_date)升序排列
![](https://i.iter01.com/images/76efae2269e982e7007ee4f8b7989570027aa256600a967ac9c97c24a435daa1.png)
可以看到,這種情況下,索引不能消除排序。
總結
建立A、B列的組合索引,create index ind_test on test(a,b desc)
order by a,b desc 可以消除排序
但是order by a,b 則不能消除排序。
如果a作為單獨的過濾條件,則order by b 或者 order by b desc 都是可以消除排序的。
前提:索引列的順序和OrderBy的順序完全一致
實驗使用Hr模式的Employees表,查詢某個工種(job_id)的所有員工,並且按照入職時間降序排列。檢視索引對排序的影響。
-
create table test as select * from hr.employees;
-
create index ind_test on test(job_id,hire_date desc);
- exec dbms_stats.gather_schema_stats('EDMOND');
-
select * from test
-
where job_id='IT_PROG' or job_id='ST_MAN'
- order by job_id,hire_date desc;
![](https://i.iter01.com/images/b20f756928225138c87a51b55cefb8fb24d0af19ab8ddbacd8dc3f4ca3209acc.png)
單獨給Job_id列建立索引,則結果如下(SORT ORDER BY不能避免)
![](https://i.iter01.com/images/f074667c6eb3fb151d5804044af90127f0ebba9d45686c03fd1738966e66caf6.png)
2.查詢工種(Job_id)為IT_PROG的員工,並且按照入職時間降序排列。
可以看到,單一的Job_id作為過濾條件,也可以使用排序消除的特性
-
select * from test
-
where job_id='IT_PROG'
- order by hire_date desc;
![](https://i.iter01.com/images/946126818814223ddf00e7fdc25fb8f564945973d448999d3ee0f9f2c70b9568.png)
3.查詢工種(Job_id)為IT_PROG的員工,並且按照入職時間升序排列。
使用單一的Job_id作為過濾條件,甚至升序排列,也能夠做到排序消除(INDEX RANGE SCAN DESCENDING)
![](https://i.iter01.com/images/08f19836bc4e7bee8b0f1a4f731e56105b7ae9f62d1ee523ca4f81b8b3e9c120.png)
4.檢視job_id為IT_PROG和ST_MAN的員工,按照工種(Job_id),入職時間(Hire_date)升序排列
-
select * from test
-
where job_id='IT_PROG' or job_id='ST_MAN'
- order by job_id,hire_date;
![](https://i.iter01.com/images/76efae2269e982e7007ee4f8b7989570027aa256600a967ac9c97c24a435daa1.png)
可以看到,這種情況下,索引不能消除排序。
總結
建立A、B列的組合索引,create index ind_test on test(a,b desc)
order by a,b desc 可以消除排序
但是order by a,b 則不能消除排序。
如果a作為單獨的過濾條件,則order by b 或者 order by b desc 都是可以消除排序的。
來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/29254281/viewspace-1067134/,如需轉載,請註明出處,否則將追究法律責任。
相關文章
- PostgreSQL11preview-索引優化。filter智慧消除、分割槽索引智慧合併SQLView索引優化Filter
- SQL優化之利用索引排序SQL優化索引排序
- PHP 實現堆, 堆排序以及索引堆PHP排序索引
- MYSQL order by排序與索引關係總結MySql排序索引
- mongodb索引使用MongoDB索引
- Mysql索引使用MySql索引
- 索引的使用索引
- MySql索引使用策略MySql索引
- Mysql索引以及使用索引注意事項MySql索引
- 使用Elasticsearch的動態索引和索引優化Elasticsearch索引優化
- 圖解MySQL索引(三)—如何正確使用索引?圖解MySql索引
- MySql如何使用索引(一)MySql索引
- mysql索引使用基礎MySql索引
- MySql如何使用索引(二)MySql索引
- MySQL 禁止使用 HASH 索引MySql索引
- localforage indexedDB如何使用索引Index索引
- 聯合索引和多個單列索引使用中的索引命中情況及索引建立原則索引
- 索引使用的基本原則索引
- 關於pcl索引的使用索引
- 監控索引的使用(轉)索引
- MySQL的索引原理及使用MySql索引
- MySQL全文索引的使用MySql索引
- 高斯消除矩陣矩陣
- LeetCode 消除遊戲LeetCode遊戲
- 多型消除if else多型
- linphone 回聲消除
- 2020.10.27【GWAS】丨使用vcftools繪製pi(θπ) 選擇消除分析圖
- 使用 Swift 實現堆排序Swift排序
- Comparator.comparing排序使用示例排序
- 在python中使用BitMap排序Python排序
- mysql索引的使用和優化MySql索引優化
- [20180503]檢視提示使用索引.txt索引
- MySQL 索引使用策略及優化MySql索引優化
- mysql索引使用經驗總結MySql索引
- PG裡常見的欄位有索引但未使用索引的原因索引
- MySQL 中使用 EXPLAIN判斷索引使用情況MySqlAI索引
- 正負消除問題
- 消除 UINavigationBar 底部黑線UINavigation
- 矩陣消除遊戲矩陣遊戲