如果sql語句已經達到優化,瓶頸在於資料檔案的磁碟io,此時可以怎麼調整

時間 2022-02-01 19:23:07

1樓:寒氣襲人

sql 資料庫佔用磁碟io讀寫過高,

原因:可能是插入資料頻繁,並且存在的索引太多所以建議清除不用的索引

或是對資料庫進行重建索引

也可以叫dbcc 操作

2樓:愛可生雲資料庫

具體問題具體分析,舉例來說明為什麼磁碟io成瓶頸資料庫的效能急速下降了。

為什麼當磁碟io成瓶頸之後, 資料庫的效能不是達到飽和的平衡狀態,而是急劇下降。為什麼資料庫的效能有非常明顯的分界點,原因是什麼?

相信大部分做資料庫運維的朋友,都遇到這種情況。 資料庫在前一天效能表現的相當穩定,資料庫的響應時間也很正常,但就在今天,在業務人員反饋業務流量沒有任何上升的情況下,資料庫的變得不穩定了,有時候一個最簡單的insert操作, 需要幾十秒,但99%的insert卻又可以在幾毫秒完成,這又是為什麼了?

dba此時心中有無限的疑惑,到底是什麼原因呢? 磁碟io效能變差了?還是業務運維人員反饋的流量壓根就不對? 還是資料庫內部出問題?昨天不是還好好的嗎?

如果親之前沒有注意到上述的現象,親對上述的結論也是懷疑。但請看下面的分解。

在寫這個文章之前,作者閱讀了大量跟的io相關的**,如非同步io執行緒的相關的,innodb_buffer池相關的,以及跟讀資料塊最相關的核心函式buf_page_get_gen函式以及其呼叫的相關子函式。為了將文章寫得通俗點,看起來不那麼累,因此不再一行一行的將**解析寫出來。

咱們先來提問題。 buf_page_get_gen函式的作用是從buffer bool裡面讀資料頁,可能存在以下幾種情況。

提問. 資料頁不在buffer bool 裡面該怎麼辦?

buffer_read_page函式棧的頂層是pread64(),呼叫了作業系統的讀函式。

buf_read_page的**

如果去讀檔案,則需要等待物理讀io的完成,如果此時io沒有及時響應,則存在堵塞。這是一個同步讀的操作,如果不完成該執行緒無法繼續後續的步驟。因為需要的資料頁不再buffer 中,無法直接使用該資料頁,必須等待作業系統完成io .

再接著上面的回答提問:

當第二會話執行緒執行sql的時候,也需要去訪問相同的資料頁,它是等待上面的執行緒將這個資料頁讀入到快取中,還是自己再發起一個讀磁碟的然後載入到buffer的請求呢?   **告訴我們,是前者,等待第一個請求該資料頁的執行緒讀入buffer pool。

試想一下,如果第一個請求該資料頁的執行緒因為磁碟io瓶頸,遲遲沒有將物理資料頁讀入buffer pool, 這個時間區間拖得越長,則造成等待該資料塊的使用者執行緒就越多。對高併發的系統來說,將造成大量的等待。 等待資料頁讀入的函式是buf_wait_for_read,下面是該函式相關的棧。

通過解析buf_wait_for_read函式的下層函式,我們知道其實通過首先自旋加鎖pin的方式,超過設定的自旋次數之後,進入等待,等待io完成被喚醒。這樣節省不停自旋pin時消耗的cpu,但需要付出被喚起時的開銷。

再繼續擴充套件問題: 如果會話執行緒a 經過物理io將資料頁1001讀入buffer之後,他需要修改這個頁,而在會話執行緒a之後的其他的同樣需要訪問資料頁1001的會話執行緒,即使在資料頁1001被入讀buffer pool之後,將仍然處於等待中。因為在資料頁上讀取或者更新的時候,同樣需要上鎖,這樣才能保證資料頁併發讀取/更新的一致性。

由此可見,當一個高併發的系統,出現了熱點資料頁需要從磁碟上載入到buffer pool中時,造成的延遲,是難以想象的。因此排在等待熱點頁佇列最後的會話執行緒最後才得到需要的頁,響應時間也就越長,這就是造成了一個簡單的sql需要執行幾十秒的原因。

再回頭來看上面的問題,mysql資料庫出現效能下降時,可以看到作業系統有讀io。 原因是,在資料庫對資料頁的更改,是在記憶體中的,然後通過檢查點執行緒進行非同步寫盤,這個非同步的寫操作是不堵塞執行sql的會話執行緒的。所以,即使看到作業系統上有大量的寫io,資料庫的效能也是很平穩的。

但當使用者執行緒需要查詢的資料頁不在buffer pool中時,則會從磁碟上讀取,在一個熱點資料頁不是非常多的情況下,我們設定足夠大的innodb_buffer_pool的size, 基本可以快取所有的資料頁,因此一般都不會出現缺頁的情況,也就是在作業系統上基本看不到讀的io。  當出現讀的io時,原因時在執行buf_read_page_low函式,從磁碟上讀取資料頁到buffer pool, 則資料庫的效能則開始下降,當出現大量的讀io,資料庫的效能會非常差。

主機sql資料庫佔用磁碟io讀寫過高,怎麼解決?

3樓:

1、首先登入sql server例項,如下圖所示。

2、接著右鍵單擊某個資料庫,選擇報表下面的標準報表,第一個就是了。

3、接下來在右側就出現了磁碟的使用情況圖示了,如下圖所示。

4、可以點選磁碟空間的加號展示列表資料,如下圖所示。

5、另外頂部有重新整理按鈕可以重新整理最新的資料。

6、最後還可以通過列印按鈕將資料列印出來,如下圖所示。

4樓:

原因:可能是插入資料頻繁,並且存在的索引太多所以建議清除不用的索引

或是對資料庫進行重建索引

也可以叫dbcc 操作

5樓:沁瑰礫香

優化你的sql的資料庫結構吧,要麼就分資料庫,把表分開,分到不同的伺服器上,要麼就是你的sql寫的不行,對資料庫的操作太頻繁

求sql語句,求!!!SQL語句!

隨緣寫法你看是你要的不,實際上要是已經是1和0了 直接sum也行select a1,sum a2 sum a3 from a group by a1 既然已經是1和0了,那麼直接sum就可以了 select place,sum tdbz sum xdbz from table group by pl...

sql語句中,SQL語句中USE

三歲喝酒 use pubs 選擇 名字 pubs 的資料庫 select title id from sales where title id in 查詢欄位title id符合號內限定條件的表sales的 title id 列 select title id from titles where t...

sql基礎查詢語句,sql簡單查詢語句

greate table insert selce filetad,name,calss,form student sql簡單查詢語句 1 首先開啟資料庫,建立好表。2 然後查詢全體教師的教師號 姓名 職稱,並分別為三列指定別名 教師號 姓名 職稱,如下圖所示。3 查詢結果如下圖所示。4 接著查詢所...