初談邏輯讀、物理讀、預讀

前言:

該文并不全是本人原創,里面的某些原理來自于CareySon。

SQL SERVER數據存儲的形式

要理解邏輯讀、物理讀、預讀這三個概念,先要搞懂SQL Server的數據存儲方式。

? ??? ?SQL Server數據庫包括數據文件和日志文件,一個數據庫可以有一個或多少數據文件、日志文件。所有的數據存儲在數據文件中,數據文件可以劃分為再小的單元,我們稱為“頁”。每頁大小8k。8個頁面構成一個區。SQL Server對于頁的讀取是最原子性,要么讀完一頁,要么完全不讀。頁之間的數據組織結構為B樹。 所以SQL Server對于邏輯讀、物理讀、預讀的單位都是頁。

創建如下測試表:

BEGIN TRAN
--CREATE TABLE
CREATE TABLE [dbo].[TestCount]([C1] [varchar](400) NULL,[C2] [varchar](300) NULL,[C3] [varchar](150) NOT NULL,[C4] [varchar](80) NULL,[C5] [varchar](38) NOT NULL,[C6] [int] NOT NULL,CONSTRAINT [PK_TestCount] PRIMARY KEY CLUSTERED 
([C6] ASC
)WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) ON [PRIMARY]
) ON [PRIMARY]
-----------------------
DECLARE @COUNT INT =1
SET NOCOUNT ON
WHILE @COUNT<=15000
BEGININSERT TestCountSELECT NEWID(),NEWID(),NEWID(),NEWID(),NEWID(),@COUNTSET @COUNT=@COUNT+1
END
commit

由于對頁的讀取是原子性的,以下讀取了多少次就是讀了多少頁

上面查詢邏輯讀 387,該表是3.008M,每一頁存儲的數據是:8K=8192字節-96字節(頁頭)-36字節(行偏移)= 8060字節。

3.008*1024*1024 / 8060 ≈ 391

另外表中還有一些非數據占用的空間,因此上式的結果約等于邏輯讀次數。

第二次執行上面相同的語句:

可以看到,本次就只有邏輯讀了,沒有上面的預讀了,這是因為第一次讀取的時候引擎就把讀到的資料放在了緩存中,方便后面的讀取(緩存的讀取速度約是機械硬盤速度的20倍),而第二次讀的時候只需要讀緩存就行了。

從執行順序上理解各種讀

?

? ? ? 下面我解釋一下圖。當遇到一個查詢語句時,SQL SERVER會走第一步,分別為生成執行計劃(占用CPU和內存資源)和用估計的數據去磁盤中取得需要取的數據(占用IO資源,這就是預讀),注意,兩個第一步是并行的,SQL SERVER通過這種方式來提高查詢性能.

然后查詢計劃生成好了以后去緩存讀取數據.當發現緩存缺少所需要的數據后讓緩存再次去讀硬盤(物理讀)

最后從緩存中取出所有數據(邏輯讀)。

查詢計劃在生成,但未交給查詢執行器執行之前,SQL SERVER 并不產生‘預讀(但在生成執行計劃時,查詢處理器需要讀取各個表的定義及表上各個索引的統計信息)。

當查詢計劃生成后,真正交給查詢執行器執行時,SQL server 才會使用另外一個線程將查詢“可能需要的數據”從磁盤讀取的緩沖區中(前提是數據不在緩存中),這就是預讀。同時這也意味著查詢執行時進行邏輯運算的線程與“預讀”所使用的線程并不是相同的線程。

?? 這個預讀的頁數數據可以通過這個DMV看到:

SELECT 
*
FROM sys.dm_db_index_physical_stats
(DB_ID('Test'),OBJECT_ID('TestCount'),NULL,NULL,'sampled')

?小結:

? ???1、首先要說明,邏輯讀取次數并不絕對等于物理讀取次數和預讀次數之和。第二次查詢物理讀取次數和預讀次數都是0。預讀是按照估計的信息去讀取信息,因此讀取的頁數并不一定準確,可能多于也可能少于實際的頁數。
? ? ?2、如果預讀的頁數包括了全部數據,那么就不會有物理讀取次數。
? ? ?3、有時候出現邏輯讀取次數大于物理讀取次數加上預讀次數,這是因為在預讀之前緩存中已經存在部分需要的數據。

轉載于:https://www.cnblogs.com/ziqiumeng/p/10212292.html

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/252687.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/252687.shtml
英文地址,請注明出處:http://en.pswp.cn/news/252687.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

Makefile常用萬能模板(包括靜態鏈接庫、動態鏈接庫、可執行文件)

1、生成可執行文件的makefile2、生成靜態鏈接庫的makefile3、生成動態鏈接庫的makefile 本文把makefile 分成了三份&#xff1a;生成可執行文件的makefile&#xff0c;生成靜態鏈接庫的makefile&#xff0c;生成動態鏈接庫的makefile。 這些makefile都很簡單&#xff0c;一般都…

TSQLDBServerHttpApi使用工作線程池

TSQLDBServerHttpApi使用工作線程池 TSQLDBServerHttpApi創建時&#xff0c;默認是使用單線程模式&#xff0c;且只使用一個數據庫連接&#xff0c;服務端要應對眾多的客戶端只靠一個工作線程&#xff08;主線程&#xff09;和一個數據庫連接&#xff0c; 服務端主線程不忙死才…

hibernate

Hibernate是一個開放源代碼的對象關系映射框架&#xff0c;他對JDBC進行了輕量級的封裝&#xff0c;使Java開發員可以隨心所欲的使用對象編程思維操作數據庫。 SessionFactory接口負責初始化Hibernate.他充當數據儲存源的代理&#xff0c;并負責創建Session對象。 Session&…

Python數據分析之pandas入門

一、pandas庫簡介 pandas是一個專門用于數據分析的開源Python庫&#xff0c;目前很多使用Python分析數據的專業人員都將pandas作為基礎工具來使用。pandas是以Numpy作為基礎來設計開發的&#xff0c;Numpy是大量Python數據科學計算庫的基礎&#xff0c;pandas以此為基礎&#x…

激光雷達和毫米波雷達的區別

什么是激光雷達 激光雷達&#xff0c;是以發射激光束探測目標的位置、速度等特征量的雷達系統。其工作原理是向目標發射探測信號&#xff08;激光束&#xff09;&#xff0c;然后將接收到的從目標反射回來的信號&#xff08;目標回波&#xff09;與發射信號進行比較&#xff0c…

Git—使用方法

1、:插件的安裝&#xff08;eclipse LUNA版本之后已經自動集成&#xff0c;不需要安裝插件&#xff09;、 * 先打開該網頁提供了對應版本的EGit&#xff0c;自己選擇相應的版本。&#xff08;http://wiki.eclipse.org/EGit/FAQ#Where_can_I_find_older_releases_of_EGit.3F&…

激光雷達與毫米波雷達對比

激光雷達是一種采用非接觸激光測距技術的掃描式傳感器&#xff0c;其工作原理與一般的雷達系統類似&#xff0c;通過發射激光光束來探測目標&#xff0c;并通過搜集反射回來的光束來形成點云和獲取數據&#xff0c;這些數據經光電處理后可生成為精確的三維立體圖像。采用這項技…

安全可靠國產系統下的應用怎么搭建?

據國家信息安全漏洞共享平臺&#xff08;CNVD&#xff09;統計數據&#xff0c;2016年我國共收錄通用軟硬件漏洞 10822個&#xff0c;漏洞來源涵蓋了眾多知名的國外廠商。應用軟件的不安全性對我國信息技術發展產生了重大威脅&#xff0c;近年來我國頻繁發布信息安全相關政策&a…

Win10 + Python + MXNet + VS2015配置

項目需要使用MTCNN來檢測、對齊、剪切出人臉&#xff0c;它是使用MXNet作為框架的&#xff0c;但是我自己的Ubuntu里各種框架亂成一團&#xff0c;不想再添亂就鐵了心要在windows里配一個。無奈網上的資料不多&#xff0c;掙扎了幾天之后決定留下這么一份文檔。 首先我們使用的…

bzoj 3224 Tyvj 1728 普通平衡樹

題目大意&#xff1a; 您需要寫一種數據結構&#xff08;可參考題目標題&#xff09;&#xff0c;來維護一些數&#xff0c;其中需要提供以下操作&#xff1a; 1. 插入x數 2. 刪除x數(若有多個相同的數&#xff0c;因只刪除一個) 3. 查詢x數的排名(若有多個相同的數&#xff0c…

不懂毫米波雷達?5分鐘讀懂毫米波雷達的那些事兒

2019年是毫米波風生水起的一年&#xff0c;也是毫米波名聲大噪的一年。毫米波應用范圍廣泛&#xff0c;如毫米波雷達、毫米波天線等。而本文&#xff0c;將向大家介紹毫米波雷達&#xff0c;主要內容包括&#xff1a;毫米波雷達原理、毫米波雷達主要特點、毫米波雷達優勢以及毫…

飛鴿傳書(IPMSG)協議(翻譯稿)

協議聲明&#xff1a; 本協議是由日本人Shirouzu Hiroaki &#xff08;白水 啟章&#xff09;先生編寫。 wanpengcoder翻譯于Mr.Kanazawa英文文檔&#xff0c;轉載請注明出處。 http://www.cnblogs.com/wanpeng/ 如有翻譯不當之處望提出&#xff0c;以便改進&#xff0c;衷心感…

redis集群的搭建

########環境######### centos 7.2 , gcch 環境ruby 2.0.0 redis 3.2.8 redis-3.3.3gem 公司要求搭建redis集群, 本來覺得挺好搞的,沒想到弄到現在.... 1, 環境準備 gcc , ruby 等環境準備 yum -y install gcc ruby ruby-devel rubygems rpm-build zlib redis-ruby接口安裝, 我…

2017-2018-1 20155227 《信息安全系統設計基礎》第十三周學習總結

2017-2018-1 20155227 《信息安全系統設計基礎》第十三周學習總結 找出全書你認為最重要的一章&#xff0c;深入重新學習一下&#xff0c;要求&#xff08;期末占10分&#xff09;&#xff1a; 完成這一章所有習題詳細總結本章要點給你的結對學習搭檔講解你的總結并獲取反饋我選…

進程間五種通信方式

進程間通信&#xff08;IPC&#xff0c;InterProcess Communication&#xff09;是指在不同進程之間傳播或交換信息。 IPC的方式通常有管道&#xff08;包括無名管道和命名管道&#xff09;、消息隊列、信號量、共享存儲、Socket、Streams等。其中 Socket和Streams支持不同主機…

電子書下載:Silverlight 5 in Action

下載&#xff1a;http://www.ctdisk.com/file/8447319

git 的使用方法

git 的使用有3個主要步驟&#xff1a; 1.1 工作區域操作&#xff1a; 在自己的git賬號下構建一個工作目錄&#xff0c; 并往工作目錄里添加文件內容&#xff08;cp /root/data/VIP_Amount_prediction/* ./&#xff09;。 cd 當前工作目錄&#xff0c; git init&#xff0c; 初始…

Codeforces 898E Squares and not squares

題目大意 給定 $n$&#xff08;$n$ 是偶數&#xff0c;$2\le n\le 2\times 10^{5}$&#xff09;個非負整數 $a_1,\dots, a_n$&#xff08;$a_i\le 10^9$&#xff09;。 要求將其中 $n/2$ 個數變成平方數&#xff0c;另外 $n/2$ 個數變成非平方數&#xff0c;變化后的數必須仍是…

UTC時間

每個地區都有自己的本地時間&#xff0c;在網上以及無線電通信中時間轉換的問題就顯得格外突出。我自己就經常混淆于此&#xff0c;特地研究了一下&#xff0c;記錄在此以備忘。 整個地球分為二十四時區&#xff0c;每個時區都有自己的本地時間。在國際無線電通信場合&#xff…

Virtualbox橋接網卡設置

正常情況下&#xff0c;像設置virtualbox虛擬機的橋接網卡非常簡單&#xff0c;只需要點配置&#xff0c;然后在配置界面點擊網絡&#xff0c;然后在右邊的網絡里選擇橋接網絡即可。但是如果這么簡單就好了&#xff0c;今天要說的就是在不正常的情況下是怎么設置的。 工具/原料…