理解SQL SERVER的邏輯讀,預讀和物理讀以及索引

来源:http://www.cnblogs.com/zhong717/archive/2016/01/20/5144937.html
-Advertisement-
Play Games

主要參考了博文:宋沄劍 -理解SQL SERVER中的邏輯讀,預讀和物理讀 和 宋沄劍 - T-SQL查詢進階--理解SQL Server中索引的概念,原理以及其他,以下內容為對其博文的讀書筆記。 1. 資料庫的數據存儲形式 在談到幾種不同的讀取方式之前,首先要理解SQL SERVER數據存儲的方式...


主要參考了博文:宋沄劍 -理解SQL SERVER中的邏輯讀,預讀和物理讀宋沄劍 - T-SQL查詢進階--理解SQL Server中索引的概念,原理以及其他,以下內容為對其博文的讀書筆記。

 

1. 資料庫的數據存儲形式

 

在談到幾種不同的讀取方式之前,首先要理解SQL SERVER數據存儲的方式.SQL SERVER存儲的最小單位為頁(Page).每一頁大小為8k,SQL SERVER對於頁的讀取是原子性,要麼讀完一頁,要麼完全不讀,不會有中間狀態。而頁之間的數據組織結構為B樹。所以SQL SERVER對於邏輯讀,預讀,和物理讀的單位是頁.

原子性,指不可再分。頁是資料庫讀取數據的最小單位,所以上圖中那種顯示,讀取了多少次,都是指的是讀取了多少頁數據。

 

2. SQL SERVER數據讀取順序

當SQL Server執行一個查詢語句時,SQL Serer會開始第一步,生成查詢計劃,同時用估計的數據去磁碟讀取數據(預讀),這兩個第一步是並行的。SQL Server通過這種方式來提高查詢性能。

查詢計劃生成好了以後去緩存讀取數據,當發現緩存缺少所需要的數據後讓緩存再次去讀硬碟(物理讀)然後從緩存中取出所有數據(邏輯讀)

也即,一般生產環境中,開啟io查詢後,可能不太容易看到物理讀取的操作,因為執行過1次後系統會將其緩存下來,所以這種情況下,物理讀的優化不用考慮,只要想辦法讓邏輯讀的次數儘可能少就可以大幅度提高查詢性能了。

 

3. 索引的原理

在資料庫檢索來說,對於磁碟IO掃描是最消耗時間的.因為磁碟掃描涉及很多物理特性,這些是相當消耗時間的。所以B樹設計的初衷是為了減少對於磁碟的掃描次數。如果一個表或索引沒有使用B樹(對於沒有聚集索引的表是使用堆heap存儲),那麼查找一個數據,需要在整個表包含的資料庫頁中全盤掃描。這無疑會大大加重IO負擔.而在SQL SERVER中使用B樹進行存儲,則僅僅需要將B樹的根節點存入記憶體,經過幾次查找後就可以找到存放所需數據的被葉子節點包含的頁!進而避免的全盤掃描從而提高了性能.

也即,使用索引以後,數據的存儲會由無序的堆變成b樹,完成從無序到有序的轉變。

 

4. 聚集索引

為了提高某個屬性(或屬性組)的查詢速度,把這個或這些屬性(稱為聚集碼)上具有相同值的元組集中存放在連續的物理塊稱為聚集。

 

3

在SQL SERVER中,聚集的作用就是將某一列(或是多列)的物理順序改變為和邏輯順序相一致,比如,我從adventureworks資料庫的employee中抽取5條數據:

4

    當我在ContactID上建立聚集索引時,再次查詢:

5

 

所以,核心是:聚集索引改變的是其所在表的物理存儲順序,所以每個表只能有一個聚集索引.

由於有主鍵的表,系統會預設將其建成聚集索引,所以個人感覺,如果主鍵是用自增id做的話,不如不要將其設為主鍵,因為自增id一般在查詢中不會太經常使用,反而是【時間】、【日期】等欄位在查詢時很方便縮小數據集的範圍,因此將之設定成聚集索引,個人覺得應該會對查詢速度有明顯提高。

 

5. 非聚合索引

一個簡單的非聚集索引概念如下:

6

     可以看到,非聚集索引需要額外的空間進行存儲,按照被索引列進行聚集索引,併在B樹的葉子節點包含指向非聚集索引所在表的指針.

如果用目錄來比喻索引的話,個人感覺,應該是醬紫的:

聚集索引:

就是標準的目錄樣式:    頁碼(聚集索引列)  ||   頁碼對應的內容

非聚集索引:

是一種嵌套的目錄,類似:       頁碼(非聚集索引列)   ||  頁碼對應的聚集索引列

也即,非聚集索引查詢時,應該是先通過非聚集索引查到對應的聚集索引列,而後再通過聚集索引查詢到目標內容。

顯然,非聚集索引多了一些操作,因此查詢速度上必然比聚集索引要慢,但好處在於,聚集索引只能有一個,可非聚集索引可以有多個,因此給了更多的查詢方式。

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

-Advertisement-
Play Games
更多相關文章
  • 機器學習很多場景中會用到放回采樣,比如bagging方法。
  • 上篇文章簡單討論了虛擬機的原理,這篇文章我們詳細討論下指令,具體從幾種典型的SQL語句來看看每種SQL對應的指令流,以及每個指令的含義。通過explain語句,可以看到語句對應的指令流;通過pragma vdbe_trace=on指令,我們甚至可以得到語句對應的指令執行流程,包括跳轉等。測試表結.....
  • 作為一個DBA,排除SQL Server問題是我們的職責之一,每個月都有很多人給我們帶來各種不能解釋卻要解決的性能問題。我就多次聽到,以前的SQL Server的性能問題都還好且在正常範圍內,但現在一切已經改變,SQL Server開始糟糕, 瘋狂的事情不能解釋。在這個情況下我介入,分析下整個SQL...
  • 在 SQL 跟蹤中,如果事件是在跟蹤定義中列出的事件類的實例,則收集這些事件。可以將這些事件從跟蹤中篩選出來或為其目標進行排隊。目標可以是文件或 SQL Server 管理對象 (SMO),它可以使用管理 SQL Server 的應用程式中的跟蹤信息。SQL 跟蹤的優點 Microsoft S...
  • Oracle創建用戶、表空間、導入導出、...命令//創建臨時表空間create temporary tablespace ext_temptempfile 'D:\oracle\product\10.2.0\oradata\test\ext_temp.dbf'size 32mautoextend ...
  • 1.sql_safe_updates官方解釋如下:If set to 1, MySQL aborts UPDATE or DELETE statements that do not use a key in the WHERE clause or a LIMIT clause. (Specifica...
  • 今天,啟動MySQL伺服器失敗,如下所示:[root@spark01 ~]# /etc/init.d/mysqld startStarting mysqld (via systemctl): Job for mysqld.service failed because the control pro....
  • use mysql;ALTER TABLE `proc`MODIFY COLUMN `comment` text CHARACTER SET utf8 COLLATE utf8_bin NOT NULL AFTER `sql_mode`;具體原因請看:http://www.cnblogs.com/....
一周排行
    -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.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...