SQL條件的順序對資料庫效能的影響

2021-06-14 00:18:28 字數 1526 閱讀 8604

經常有人問到oracle中的where子句的條件書寫順序是否對sql效能有影響,我的直覺是沒有影響,因為如果這個順序有影響,oracle應該早就能夠做到自動優化,但一直沒有關於這方面的確鑿證據。在網上查到的文章,一般認為在rbo優化器模式下無影響(10g開始,預設為rbo優化器模式),而在cbo優化器模式下有影響,主要有兩種觀點:

a.能使結果最少的條件放在最右邊,sql執行是按從右到左進行結果集的篩選的;

b.有人試驗表明,能使結果最少的條件放在最左邊,sql效能更高。

實驗一:證明了sql的語法分析是從右到左的

下面的試驗在9i和10g都可以得到相同的結果: 第1條語句執行不會出錯,第2條語句會提示除數不能為零。

1.select 'ok' from dual where 1 / 0 = 1 and 1 = 2;

2.select 'ok' from dual where 1 = 2 and 1 / 0 = 1;

證明了sql的語法分析是從右到左的。

實驗二:證明了sql條件的執行是從右到左的

在9i上執行, 第1條語句執行不會出錯,第2條語句會提示「無效的數字」

在10g上執行,兩條語句都不會出錯。

說明:9i上,sql條件的執行確實是從右到左的,但是10g做了什麼調整呢?

實驗三:證明了在10g上sql條件的執行是從右到左的

結果表明,sql條件的執行順序是從右到左的。

那麼,根據這個結果來分析,把能使結果最少的條件放在最右邊,是否會減少其它條件執行時所用的記錄數量,從而提高效能呢?

例如:下面的sql條件,是否應該調整sql條件的順序呢?

實際上,從這條sql語句的執行計畫來分析,oracle首先會找出條件中使用索引或表間連線的條件,以此來過濾資料集,然後對這些結果資料塊所涉及的記錄逐一檢查是否符合所有條件,所以條件順序對效能幾乎沒有影響。

如果沒有索引和表間連線的情況,條件的順序是否對效能有影響呢?再來看乙個實驗。

實驗四:證明了條件的順序對效能沒有影響。

上面的sql按兩種方式分別執行了1000次查詢,結果如下:

操作型別= '1'在最右|類別='z'在最右

0.093 | 1.014

1.06 | 0.999

0.998 | 1.014

按理說,從右到左的順序執行,「類別='z'」在最右邊時,先過濾得到170條記錄,再從中找符合「操作型別 = '1'」的,比較而言,「操作型別 = '1'」在最右邊時,先過濾得到3251條記錄,再從中找符合「類別='z'」,效率應該要低些,而實際結果卻是兩者所共的時間差不多。

其實,從oracle的資料訪問原理來分析,兩種順序的寫法,執行計畫都是一樣的,都是全表掃瞄,都要依次訪問該錶的所有資料塊,對每乙個資料塊中的行,逐一檢查是否同時符合兩個條件。所以,就不存在先過濾出多少條資料的問題。

綜上所述,where子句中條件的順序對效能沒有影響(不管是cbo還是rbo優化器模式),注意,額外說一下,這裡只是說條件的順序,不包含表的順序。在rbo優化器模式下,表應按結果記錄數從大到小的順序從左到右來排列,因為表間連線時,最右邊的表會被放到巢狀迴圈的最外層。最外層的迴圈次數越少,效率越高。

對資料庫與SQL的認知

1.什麼是資料庫 資料庫 database,儲存資料的倉庫。資料庫 高效的儲存和處理資料的介質 介質主要是兩種 磁碟和記憶體 ram 2.資料庫的分類 資料庫基於儲存介質的不同,進行了分類。分為兩類 關係型資料庫 sql 和非關係型資料庫 nosql not only sql不是關係型的資料庫都叫做...

監控資料庫效能的SQL

監控資料庫效能的sql 檢視tablespace的空間使用情況 select tablespace name,sum bytes 1024 1024 from dba free space group bytablespace name 1.監控事例的等待 select event,sum deco...

資料庫效能優化 4 減少對資料庫的連線次數

原因 1 頻繁的對資料庫操作將影響其他正常使用者的訪問。2 為了保護資料的安全會牽涉到鎖 資料庫級鎖,表級鎖,塊級鎖,頁級鎖,行級鎖。3 對資料庫的訪問會牽涉到磁碟io的操作,經過一段時間分析發現 效能差主要是在資料的讀寫。4 每次讀資料庫的更新操作會寫日誌,減少不必要的磁碟寫入。解決方法 1 能合...