14-多表連線、索引選擇、顯式遊標和其他
14-多表連線、索引選擇、顯式遊標和其他
==============
1、連線多個掃描
如果你對一個列和一組有限的值進行比較,優化器可能執行多次掃描並對結果進行合併連線
例:
SQL> select count(*) from an1 where name in('anbaisheng','xiangxiang') ;
COUNT(*)
----------
20000
已用時間: 00: 00: 00.01
執行計劃
----------------------------------------------------------
Plan hash value: 3815355493
---------------------------------------------
| Id | Operation | Name |
---------------------------------------------
| 0 | SELECT STATEMENT | |
| 1 | SORT AGGREGATE | |
| 2 | CONCATENATION | |
|* 3 | INDEX RANGE SCAN| INDEX_AN1_NAME |
|* 4 | INDEX RANGE SCAN| INDEX_AN1_NAME |
---------------------------------------------
oracle可能會將他轉換成以下語句
SQL> select count(*) from an1 where name='anbaisheng' or name='xiangxiang';
COUNT(*)
----------
20000
已用時間: 00: 00: 00.01
執行計劃
----------------------------------------------------------
Plan hash value: 3815355493
---------------------------------------------
| Id | Operation | Name |
---------------------------------------------
| 0 | SELECT STATEMENT | |
| 1 | SORT AGGREGATE | |
| 2 | CONCATENATION | |
|* 3 | INDEX RANGE SCAN| INDEX_AN1_NAME |
|* 4 | INDEX RANGE SCAN| INDEX_AN1_NAME |
---------------------------------------------
當選擇執行路徑時,優化器可能對每一個條件採用loding$vmanager上的索引範圍掃描
返回的rowid用來訪問lodging表的記錄
最後兩組記錄以連線的形式被組合成一個單一的集合
-------------------------------
2、CBO下使用更具選擇性的索引
基於成本的優化器對索引的選擇性進行判斷來決定所以你的使用是否能提高效率
如果索引有很高的選擇性, 那就是說對於每個不重複的索引鍵值,只對應數量很少的記錄
比如, 表中共有100條記錄而其中有80個不重複的索引鍵值. 這個索引的選擇性就是80/100 = 0.8
選擇性越高, 通過索引鍵值檢索出的記錄就越少.
如果索引的選擇性很低, 檢索資料就需要大量的索引範圍查詢操作和ROWID
訪問表的操作. 也許會比全表掃描的效率更低.
a. 如果檢索資料量超過30%的表中記錄數.使用索引將沒有顯著的效率提高.
b. 在特定情況下, 使用索引也許會比全表掃描慢, 但這是同一個數量級上的區別.
而通常情況下,使用索引比全表掃描要塊幾倍乃至幾千倍
----------------------------------
3、避免使用消耗資源的操作
帶有DISTINCT,UNION,MINUS,INTERSECT,ORDER BY的SQL語句會啟動SQL引擎執行耗費資源的排序(SORT)功能.
DISTINCT需要一次排序操作, 而其他的至少需要執行兩次排序.
例如,一個UNION查詢,其中每個查詢都帶有GROUP BY子句, GROUP BY會觸發嵌入排序(NESTED SORT)
這樣, 每個查詢需要執行一次排序, 然後在執行UNION時, 又一個唯一排序(SORT UNIQUE)操作被執行而且它只能在前面的嵌入排序結束後才能開始執行.
嵌入的排序的深度會大大影響查詢的效率.
通常, 帶有UNION, MINUS , INTERSECT的SQL語句都可以用其他方式重寫.
另外:
如果你的資料庫的SORT_AREA_SIZE調配得好, 使用UNION , MINUS, INTERSECT也是可以考慮的, 畢竟它們的可讀性很強
------------------------------------
4、優化group by
提高GROUP BY 語句的效率, 可以通過將不需要的記錄在GROUP BY 之前過濾掉.
下面兩個查詢返回相同結果但第二個明顯就快了許多.
低效:
SELECT JOB , AVG(SAL) FROM EMP GROUP BY JOB HAVING JOB = ‘PRESIDENT' OR JOB = ‘MANAGER'
高效:
SELECT JOB , AVG(SAL) FROM EMP WHERE JOB = ‘PRESIDENT' OR JOB = ‘MANAGER' GROUP JOB
------------------------------------
5、使用顯式遊標
使用隱式的遊標,將會執行兩次操作.
第一次檢索記錄, 第二次檢查TOO MANY ROWS 這個exception .
而顯式遊標不執行第二次操作.
------------------------------------
6、優化exp和imp
使用較大的buffer可以提高exp和imp的速度
------------------------------------
7、分離索引和表
將表和索引建立在不同的表空間
如果可以控制,最好放在不同的磁碟上
(俺覺得過時了)
來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/13177610/viewspace-676350/,如需轉載,請註明出處,否則將追究法律責任。
相關文章
- LEFT JOIN 和JOIN 多表連線
- 唯一索引和普通索引的選擇索引
- pandas索引和選擇資料索引
- [20190827]函式索引與選擇率.txt函式索引
- 普通索引和唯一索引,應該怎麼選擇?索引
- MySQL筆記3——內連線/外連線、多表連線MySql筆記
- Kubernetes – 標籤和選擇器
- goldengate同源一目標+多表和同源多目標+多表Go
- 如何選擇普通索引和唯一索引《死磕MySQL系列 五》索引MySql
- Elasticsearch 中為什麼選擇倒排索引而不選擇 B 樹索引Elasticsearch索引
- SQL語言基礎(多表連線)SQL
- Selenium 隱式等待與顯示等待的選擇
- pandas 學習 第14篇:索引和選擇資料索引
- 資料庫索引選擇策略資料庫索引
- MySQL和PostgreSQL在多表連線演算法上的差異MySql演算法
- MYSQL學習筆記23: 多表查詢(自連線內連線+左右外連線)MySql筆記
- MySQL索引選擇及規則整理MySql索引
- HTTP客戶端連線,選擇HttpClient還是OkHttp?HTTP客戶端client
- 2018年電腦顯示卡選購指南 遊戲顯示卡怎麼選擇?遊戲
- MSTP專線和SDH專線該如何選擇?——VecloudCloud
- day42:HTML標籤和CSS選擇器HTMLCSS
- 002---選擇器(標籤選擇器、類選擇器、id選擇器、偽類選擇器、萬用字元選擇器)字元
- 如何選擇我們的損失函式 - 連線統計推斷和問題所在領域的橋樑函式
- SVM 的核函式選擇和調參函式
- 表資料量影響MySQL索引選擇MySql索引
- Mysql——內外連線,事物,索引MySql索引
- Django 直接使用資料庫連線和遊標讀寫資料庫Django資料庫
- 除了chrome瀏覽器,還有其他選擇嗎?Chrome瀏覽器
- 圖形設計與遊戲用途的電腦CPU和顯示卡選擇攻略遊戲
- Dcat-Admin SelectTable 表格選擇器選擇後顯示使用者頭像和暱稱
- VSCode連線伺服器在選擇平臺時報錯VSCode伺服器
- SpringBoot + JPA的自學之路(三)多表連線查詢Spring Boot
- 【學習】SQL基礎-006-多表連線查詢SQL
- 索引選擇度問題最佳化整理索引
- [20200326]為什麼選擇這個索引.txt索引
- 44 pandas DataFrame分層索引切片選擇(tcy)索引
- MySQL innodb如何選擇一個聚簇索引MySql索引
- vue-element 選擇框 選擇值改變,顯示不變Vue
- CustomPlot 在Qt下 滑鼠點選曲線 顯示當前座標QT