關於資料庫優化2——關於表的連接順序,和where子句的前後順序,是否會影響到sql的執行效率問題
有好多時候,我們常聽別人說大表在前,小表在後,包括現在好多百度出來的靠前的答案都有說資料庫是從右到左載入的,所以from語句最後關聯的那張表會先被處理。如果三表交叉,就選擇交叉表來作為基礎表。等等一些結論,但是這些真的正確么?我就回家做了一個小的驗證,來看一看到底是怎麼一回事。(博主作實驗用的是Oracle,但是不代表只是Oracle是這樣的原理,現在大部分的關係型資料庫都是一樣的)
首先我們來執行一下以下的sql語句,來看一下執行計劃。看一看到底是怎麼樣的。
1 drop table tab_big; --刪除原有big表
2 drop table tab_small;
3 create table tab_big as select * from dba_objects where rownum<=30000; --創建表,並且插入記錄
4 create table tab_small as select * from dba_objects where rownum<=10;
5 set autotrace traceonly --開啟執行計劃和統計信息
6 set linesize 1000
7 set timing on
8 select count(*) from tab_big,tab_small;
9 select count(*) from tab_small,tab_big;
OK,完事後咱們來看一看,到底表的順序到底是否會影響到資料庫的執行效率,我們來看一下」select count(*) from tab_big,tab_small「和」select count(*) from tab_small,tab_big「的執行計劃(圖1為大表在前,小表在後。圖2為小表在前)
執行完後。我們驚奇的發現,居然他們耗費的資源和時間基本是一模一樣的,所以說這個表的順序會影響sql的執行效率是一個不對的結論,但是大部分網上評論和博客都是這麼寫的,真的是惡意謠言么?那咱們看一下下面這兩條sql的執行效率。
然後我們執行下,下面的這兩條sql。
1 select /*+rule*/ count(*) from tab_big,tab_small;--/*+rule*/基於規則執行
2 select /*+rule*/ count(*) from tab_small,tab_big;
接下來我們看一下這兩條sql的執行計劃。(圖1為第一條sql大表在前,小表在後,圖2為第二條sql,小表在前)
這個時候我們有驚奇的發現,這個就應了網上大部分的答案,說明他們說的也是有道理的。這其中是什麼原因呢?根據我在翻閱各種資料和查閱官網後得知:原來早些的資料庫版本是基於規則去處理的sql,也就是加上我們的/*+rule*/這個之後。但是現在我們的資料庫都是基於代價的,所以也就不存在了表的順序會影響sql的效率了。那我們的where其實也是一樣的道理,也不會因為順序去影響sql的效率。(where的結論博主也經過了執行驗證,但是同理表連接,所以就不貼出來代碼了)
※總結一下遇到的幾個sockaddr數據結構的用法-philarlala
※如何用phpcms將靜態網頁生成動態網頁?
※實現容器的底層技術-每天5分鐘玩轉 Docker 容器技術(30)
※NetCore1.1+Linux部署初體驗
TAG:達人科技 |
※時間順序的信息流回歸,月活下降的Twitter最終還是向用戶妥協了
※React 是否保持 state 更新的順序?
※回憶我們的python學習:順序結構
※跨界擴張的場景、timing和順序,以及滴滴要補的課
※時間順序的信息流回歸,月活用戶下降的 Twitter 最終還是向用戶妥協了
※邊界擴張的場景、timing和順序,以及滴滴要補的課
※promise、async和await之執行順序的那點事
※蘋果重組領導層 調整優先順序減輕對iPhone的依賴!
※資料庫大咖丁奇:MySQL索引存儲順序和order by不一致,怎麼辦?
※蘋果重組領導層 調整優先順序減輕對iPhone的依賴
※正確的化妝順序與技巧你get了嗎?
※TensorFlow核心開發組的優先順序安排
※List順序表,鏈表隊列,棧,字典
※粉底液和cc霜的先後順序 兩者的作用完全一樣嗎
※數據結構-線性表(順序表與鏈表的基本知識 以及ArrayList 源碼分析)
※測試Apache使用Openssl及修改Openssl加密演算法執行順序
※更好的適用方法及使用順序,推薦產品;加拿大網紅小眾護膚品牌「The ordinary
※GameFreak:原創新IP的優先順序會高於「寶可夢」新作
※iOS版Gmail應用的高優先順序通知功能由AI支持驅動
※Surprise!陪伴孩子不是越長時間越有效,培育孩子具有優先順序