SQL Server中STATISTICS IO物理讀和邏輯讀的誤區

来源:https://www.cnblogs.com/lyhabc/archive/2020/04/10/12670802.html
-Advertisement-
Play Games

SQL Server中STATISTICS IO物理讀和邏輯讀的誤區 大家知道,SQL Server中可以利用下麵命令查看某個語句讀寫IO的情況 SET STATISTICS IO ON 那麼這個命令的結果顯示的物理讀、邏輯讀的IO單位大小是多少,比如結果顯示有 物理讀取 1 次 是代表 對硬碟做了 ...


SQL Server中STATISTICS IO物理讀和邏輯讀的誤區

 

大家知道,SQL Server中可以利用下麵命令查看某個語句讀寫IO的情況

SET STATISTICS IO ON

那麼這個命令的結果顯示的物理讀、邏輯讀的IO單位大小是多少,比如結果顯示有

物理讀取 1

是代表 對硬碟做了1次物理IO嗎?


在回答這個問題之前,需要先普及幾個常識

在一般預設情況下

Windows的記憶體分頁大小單位是4KB

資料庫的最小讀寫單位是 8K頁面

Windows操作系統的NTFS文件系統最小讀寫單位(分配單元/簇)是 4KB

機械硬碟的的最小讀寫單位(邏輯扇區和物理扇區)是512位元組

高級格式化:操作系統對文件系統盤符進行格式化,規劃每分配單元/簇大小,預設4KB

低級格式化:存儲廠家對物理存儲硬體做的低級格式化,例如機械硬碟,規劃每扇區大小,通常512位元組

 

為什麼存在磁碟塊/簇/分配單元?

讀取方便:由於扇區的數量比較小,數目眾多在定址時比較困難,所以操作系統就將相鄰的扇區組合在一起,形成一個塊,再對塊進行整體的操作,

分離對底層的依賴,操作系統忽略對底層物理存儲結構的設計,通過虛擬出來磁碟塊的概念,文件系統就是操作系統的一部分,所以文件系統操作文件的最小單位是塊/簇/分配單元

這個磁碟塊在Linux的ext4文件系統中稱為block,在Windows的NTFS文件系統中稱為分配單元或簇

 

什麼是記憶體分頁?

操作系統經常與記憶體和硬碟這兩種存儲設備進行通信,類似於“塊”的概念,都需要一種虛擬的基本單位。所以,與記憶體操作,是虛擬一個頁的概念來作為最小單位。與硬碟打交道,就是以塊為最小單位

固態硬碟因為沒有扇區概念,用的是塊/頁,一個塊/頁一般是4KB,so固態硬碟暫且不討論

 

先說結論,實際上STATISTICS IO 中物理讀和邏輯讀的統計對象自始至終都是資料庫8K頁面,比如,邏輯讀1次, 物理讀1次,實際上都是按8KB頁為單位,是SQL Server這個軟體的統計方式

這樣就會造成誤解,產生疑問

如果物理讀為1次,那麼資料庫對磁碟是做了一次讀寫操作一次IO,對嗎?

如果邏輯讀為1次,那麼資料庫在記憶體中是讀寫了一個記憶體頁一次IO,對嗎?

 

實際情況是怎樣的呢?

對於物理讀情況

SQL Server是運行在Windows系統上的一個軟體,那麼這個軟體在文件系統上存儲數據依然按照NTFS文件系統的規則,存儲一個8K的頁面需要占用2個分配單元

可以用winhex這個軟體,按8K大小查看資料庫的mdf文件可以查看到完整的一個資料庫頁面數據

對於文件系統,讀寫一個資料庫8KB頁面需要讀寫2個分配單元 也就是2個文件系統IO

在機械硬碟裡面,文件系統的一個4KB分配單元寫入到機械硬碟里,需要讀寫8個扇區,也就是8個硬碟IO,而1個資料庫8KB頁面寫入到機械硬碟里,就需要讀寫16個扇區,也就是實際寫入一個資料庫頁面需要16個硬碟IO

然後這裡會出現一些問題,如果系統故障或硬體故障,就有可能出現一個資料庫頁面寫入存儲硬體不完整情況,比如16個硬碟IO才能寫入完整一個8KB頁面,而如果在寫入第10個IO的時候發生系統崩潰或硬體崩潰,只寫入了5KB頁面數據到硬碟,這時候資料庫數據就已經不完整了,然後各家資料庫廠商才開發【頁面寫入完整性檢測機制】,例如

MySQL InnoDB的Double Write機制(innodb_doublewrite = 1) + page checksum

MSSQL的PAGE校驗機制

註意:即使是用固態硬碟,也請不要關閉頁面完整性檢測功能!

只有在資料庫頁面、文件系統分配單元、機械硬碟扇區的大小一致的情況下

就是說,資料庫文件系統存儲設備的最小讀寫單位大小一樣的情況下,也就是所謂的【對齊】,才能關閉頁面完整性檢測功能,這個時候可以獲得最大性能

某些文件系統、存儲設備所謂的聲稱支持【原子寫】,請各位擦亮眼睛^_^,檢查是否真的完整支持,對於某些情況,確實是支持真正原子寫,例如

1、資料庫使用裸設備,這樣就不需要文件系統

2、以寶存PCIE快閃記憶體為例子,其Nand Flash的最小寫單位是page,目前Nand Flash 的page大小是32kb,這個基本上都是大於大部分資料庫通用的block size或page size,32kb可以存放4個MSSQL頁面(非廣告)

 


對於邏輯讀情況

Windows的記憶體分頁大小單位是4KB,一個資料庫頁面8KB,那麼讀寫一個記憶體中的資料庫頁面實際上需要讀寫2個記憶體分頁

在記憶體里,讀寫一個資料庫8KB頁面需要讀寫2個記憶體分頁, 也就是2個記憶體IO

然後記憶體中8KB資料庫頁跟文件系統中的8KB資料庫頁是一一對應的,不然的話,利用B+樹索引結構和二分查找法查找數據也無從談起


總結

對於文件系統,讀寫一個資料庫8KB頁面需要讀寫2個分配單元 也就是2個文件系統IO

對於機械硬碟,讀寫一個資料庫8KB頁面需要讀寫16個硬碟扇區 也就是16個硬碟IO

對於記憶體,讀寫一個資料庫8KB頁面需要讀寫2個記憶體分頁 也就是2個記憶體IO

 


SQL Server只是跑在Windows操作系統上的一個軟體,它無法知道也不需知道它所在文件系統的最小讀寫單位,也無法知道也不需知道存儲設備的最小讀寫單位,

實際上操作系統從文件系統中讀取8KB頁面數據喂給資料庫,資料庫收到之後STATISTICS IO 就統計物理讀為 1,至於邏輯讀也是同理

最最後,放一張圖,做的比較醜

 

 

 

參考文章
http://www.dostor.com/article/111637957.html
https://blog.csdn.net/qq_34228570/article/details/80209748

 

 

本文版權歸作者所有,未經作者同意不得轉載。


您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • 關於Let’s Encrypt 免費SSL證書 Let’s Encrypt 作為一個公共且免費 SSL 的項目逐漸被廣大用戶傳播和使用,是由 Mozilla、Cisco、Akamai、IdenTrust、EFF 等組織人員發起,主要的目的也是為了推進網站從 HTTP 向 HTTPS 過度的進程,目前 ...
  • 晚上本來想更新 linuxmint19.3 的,結果更新速度太慢。想著第二天再更新吧,就點了取消按鈕。結果第二天一早起來,更新管理器不見了。 (更好的閱讀體驗可訪問 "這裡" ) 右下角找不到,就進系統的面板里找,結果點擊後沒有任何反應。然後就去百度查 “linuxmint 更新管理器消失”,得到以 ...
  • 目標伺服器:Windows Server 2003 網站: XYCMS企業建站系統2.3(鑫躍教育)滲透測試機:Windows 7 工具:明小子、MD5Crack本次實驗目標網站1、運行明小子,在當前路徑出輸入目標網頁路徑,然後點擊鏈接,在下方會掃描出註入點。2、找一個註入點,右鍵點擊檢測註入3、點... ...
  • Zabbix的服務端與客戶端的安裝這裡不再贅述了,前面也有相應的文章介紹過了,感興趣的伙伴們可以看看歷史文章就可以了,今天主要介紹下如何利用zabbix自帶的模板來監控MySQL服務的一些狀態,同時通過圖形化界面直觀看出MYSQL服務各個時間段的運行情況 1、配置Zabbix_agent客戶端 cd ...
  • 1.查詢cpu,記憶體。 # top 我們能看到系統的記憶體(Mem),然後鍵入數字1,便可顯示CPU的個數,按q退出或按ctal+ct退出。 下麵我解釋下記憶體怎麼看,下方的total為總記憶體,free為空閑未用,used為使用中的包含以前使用的,它不會歸還給free。不能用userd/total計算內 ...
  • 《windows美化系列》第一篇:桌面管理 大家好,我是修複! 今天開個新坑,告訴大家我美化windows的技巧。 今天是第一篇,教大家如何管理桌面。 不多說直接放圖 這就是我的桌面,只有一個臨時的文件夾,是不是一塵不染? 你們可能會問:修複,你桌面一個快捷方式都沒有,那你是怎麼打開軟體的啊? 嘿嘿 ...
  • 回到目錄 共基放大電路的形式比較簡單,其特點是輸入阻抗低、輸出阻抗高,電壓放大倍數可以非常大,但是電流放大倍數略小於1。本小節我們對共基放大電路進行詳細的交流分析。 共基放大電路典型如下圖所示: 圖4-5.01 註意在上圖中的各個電壓電流符號,有的僅含交流分量,有的同時包含交流分量和直流分量。集電極 ...
  • Linux Web伺服器集群 首先需要準備四台機器,分別為以下伺服器 NAS-Server-0 IP:192.168.254.10 Web-Server-1 IP:192.168.254.11 Web-Server-2 IP:192.168.254.12 Web-Server-3 IP:192.16 ...
一周排行
    -Advertisement-
    Play Games
  • 移動開發(一):使用.NET MAUI開發第一個安卓APP 對於工作多年的C#程式員來說,近來想嘗試開發一款安卓APP,考慮了很久最終選擇使用.NET MAUI這個微軟官方的框架來嘗試體驗開發安卓APP,畢竟是使用Visual Studio開發工具,使用起來也比較的順手,結合微軟官方的教程進行了安卓 ...
  • 前言 QuestPDF 是一個開源 .NET 庫,用於生成 PDF 文檔。使用了C# Fluent API方式可簡化開發、減少錯誤並提高工作效率。利用它可以輕鬆生成 PDF 報告、發票、導出文件等。 項目介紹 QuestPDF 是一個革命性的開源 .NET 庫,它徹底改變了我們生成 PDF 文檔的方 ...
  • 項目地址 項目後端地址: https://github.com/ZyPLJ/ZYTteeHole 項目前端頁面地址: ZyPLJ/TreeHoleVue (github.com) https://github.com/ZyPLJ/TreeHoleVue 目前項目測試訪問地址: http://tree ...
  • 話不多說,直接開乾 一.下載 1.官方鏈接下載: https://www.microsoft.com/zh-cn/sql-server/sql-server-downloads 2.在下載目錄中找到下麵這個小的安裝包 SQL2022-SSEI-Dev.exe,運行開始下載SQL server; 二. ...
  • 前言 隨著物聯網(IoT)技術的迅猛發展,MQTT(消息隊列遙測傳輸)協議憑藉其輕量級和高效性,已成為眾多物聯網應用的首選通信標準。 MQTTnet 作為一個高性能的 .NET 開源庫,為 .NET 平臺上的 MQTT 客戶端與伺服器開發提供了強大的支持。 本文將全面介紹 MQTTnet 的核心功能 ...
  • Serilog支持多種接收器用於日誌存儲,增強器用於添加屬性,LogContext管理動態屬性,支持多種輸出格式包括純文本、JSON及ExpressionTemplate。還提供了自定義格式化選項,適用於不同需求。 ...
  • 目錄簡介獲取 HTML 文檔解析 HTML 文檔測試參考文章 簡介 動態內容網站使用 JavaScript 腳本動態檢索和渲染數據,爬取信息時需要模擬瀏覽器行為,否則獲取到的源碼基本是空的。 本文使用的爬取步驟如下: 使用 Selenium 獲取渲染後的 HTML 文檔 使用 HtmlAgility ...
  • 1.前言 什麼是熱更新 游戲或者軟體更新時,無需重新下載客戶端進行安裝,而是在應用程式啟動的情況下,在內部進行資源或者代碼更新 Unity目前常用熱更新解決方案 HybridCLR,Xlua,ILRuntime等 Unity目前常用資源管理解決方案 AssetBundles,Addressable, ...
  • 本文章主要是在C# ASP.NET Core Web API框架實現向手機發送驗證碼簡訊功能。這裡我選擇是一個互億無線簡訊驗證碼平臺,其實像阿裡雲,騰訊雲上面也可以。 首先我們先去 互億無線 https://www.ihuyi.com/api/sms.html 去註冊一個賬號 註冊完成賬號後,它會送 ...
  • 通過以下方式可以高效,並保證數據同步的可靠性 1.API設計 使用RESTful設計,確保API端點明確,並使用適當的HTTP方法(如POST用於創建,PUT用於更新)。 設計清晰的請求和響應模型,以確保客戶端能夠理解預期格式。 2.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...