理解SQL SERVER中的邏輯讀,預讀和物理讀

2021-09-08 02:36:48 字數 1313 閱讀 3260

在談到幾種不同的讀取方式之前,首先要理解sql server資料儲存的方式.sql server儲存的最小單位為頁(page).每一頁大小為8k,sql server對於頁的讀取是原子性,要麼讀完一頁,要麼完全不讀,不會有中間狀態。而頁之間的資料組織結構為b樹(請參考我之前的博文).所以sql server對於邏輯讀,預讀,和物理讀的單位是頁.

sql server一頁的總大小為:8k

但是這一頁儲存的資料會是:8k=8192位元組-96位元組(頁頭)-36位元組(行偏移)=8060位元組

所以每一頁用於儲存的實際大小為8060位元組.

比如上面adventureworks中的person.address表,通過ssms看到這個表的資料空間為:

我們可以通過公式大概推算出占用了多少頁:2.250*1024*1024/8060(每頁的資料容量)≈293 - 表中非資料占用的空間≈290(上圖中的邏輯讀取數)

sql server查詢執行的步驟如果從微觀來看,那將會非常多。這裡為了講述邏輯讀等概念,我從比較高的抽象層次來看:

圖有些粗糙。

下面我解釋一下圖。當遇到乙個查詢語句時,sql server會走第一步,分別為生成執行計畫(占用cpu和記憶體資源),同步的用估計的資料去磁碟中取得需要取的資料(占用io資源,這就是預讀),注意,兩個第一步是並行的,sql server通過這種方式來提高查詢效能.

然後查詢計畫生成好了以後去快取讀取資料.當發現快取缺少所需要的資料後讓快取再次去讀硬碟(物理讀)

最後從快取中取出所有資料(邏輯讀)。

下面我再通過乙個簡單的例子說明一下:

這個估計的頁數資料可以通過這個dmv看到:

當我們第一次查詢完成後,再次進行查詢時,所有請求的資料這時已經在快取中,sql server這時只要對快取進行讀取就行了,也就是只用進行邏輯讀:

理解SQL SERVER中的邏輯讀,預讀和物理讀

優化sql效能,你必須理解資料庫查詢資料的細節,在查詢分析器中開啟io統計,set statistics io on 就能檢視查詢過程 關於邏輯讀,預讀和物理讀的顯示。下面給大家講解資料庫查詢資料的細節,你也就明白了什麼是關於邏輯讀,預讀和物理讀 要想把這幾個概念弄清楚必須了解資料庫查詢資料的細節。...

SQL SERVER中架構的理解

在sqlserver 2005中,可能大家在工作或學習的時候會經常發現這樣一些問題,你使用乙個賬戶在資料庫中建立了一張表,卻發現你自己建立的表卻沒有修改和查詢的許可權,這是一件很鬱悶的事情,在sqlserver2000中卻不存在這樣的問題,那為什麼在2005中會出現這樣的事情,這樣的設定可以帶來哪些...

SQL SERVER中架構的理解

在sqlserver 2005中,可能大家在工作或學習的時候會經常發現這樣一些問題,你使用乙個賬戶在資料庫中建立了一張表,卻發現你自己建立的表卻沒有修改和查詢的許可權,這是一件很鬱悶的事情,在sqlserver2000中卻不存在這樣的問題,那為什麼在2005中會出現這樣的事情,這樣的設定可以帶來哪些...