執行緩慢的查詢語句(阻塞)(一) 鎖粒度及鎖公升級

2021-06-22 05:59:06 字數 1272 閱讀 3491

執行緩慢或者持續執行很長時間的查詢會導致過度的資源消耗。它們可以導致查詢阻塞的嚴重後果。

過度的資源消耗不侷限於只占用cpu資源,也會增加i/o頻寬以及記憶體頻寬。儘管sql server查詢可以通過where謂詞的限制避免進行全表掃瞄,但是由於缺少支援這個特定查詢所需要的索引,所以他們可能不會按照預期的方式執行。同樣,where謂詞頁可以由應用程式動態進行構建,或者依賴於使用者的輸入。綜上,已經存在的索引不能覆蓋所有可能出現的限制。t-sql語句可能會導致的過度的cpu,i/o,以及記憶體消耗的情況,在前面的章節中已經有所介紹。

此外,沒有使用索引的話,可能是因為存在索引只是沒有被使用。因為所有的索引都不得不被維護,這可能不會影響到查詢的效能,但是會影響到那些dml的查詢

查詢執行緩慢也可以由邏輯鎖等待或者系統資源阻塞查詢而導致。導致阻塞的原因可以是設計不好的應用程式,不好的查詢計畫,缺失有效的索引,或者是相對於當前負載配置不足的sql 例項。

這一章專注於導致執行緩慢的兩種原因:阻塞和索引問題。

阻塞主要是為了等待邏輯鎖,例如等待獲取加在資源上的x鎖(排他鎖)或者等待來在於較低級別同步基元的結果,例如閂鎖。

邏輯鎖等待發生在某個請求想要在乙個已經被加過鎖的資源上加上另乙個不相容的鎖時。儘管這需要在這個特定的正在執行查詢語句中新增保證資料一致性的事務隔離級別,但是這會讓使用者有一種sql server執行緩慢的感覺。當乙個查詢阻塞之後,它就不會在消耗任何的系統資源了,所以你會發現執行速度很慢,但是占用的系統資源很少。

如果你的系統沒有被配置成可以處理當前的系統負載,那麼會導致等待較低階別的同步基元。

阻塞及等待的通用場景如下:

--確定阻塞

--確定長的阻塞原文:

MySql 一條查詢SQL語句的執行

這個的快取不是指redis,或者mybatis的快取我們常見的快取,其實mysql自帶了快取模組,但是我們幾乎從來沒有用過他,甚至在mysql8.0直接就給去掉了,所以一定有他的侷限性,大家可以查閱一下,但是確實是存在的。如果開啟的話,所以乙個查詢sql先會查詢快取 我們沒有使用快取的話,就會跳過快...

一條SQL查詢語句是如何執行的

mysql可以分為server層和儲存引擎層兩部分 一條普通的查詢語是怎樣執行並返回結果了 聯結器查詢快取 大多數情況下建議不要使用查詢快取,查詢快取往往弊大於利。查詢快取的失效非常頻繁,只要有對乙個表的更新,這個表上所有的查詢快取都會被清空。分析器優化器 比如你執行下面這樣的語句,這個語句是執行兩...

一條SQL查詢語句是如何執行的?

我們在寫sql的時候crud這些基本的操作想必大家已經是得心應手了,專欄會更傾向於sql優化與執行過程模型的角度重新學習sql,方便大家在做效能優化上更加熟練。select from t where id 10 接下來我們來拆解一下這個sql語句,從中就可以看出sql在mysql中各個模組的執行過程...