1. 程式人生 > >SQL Server效能優化(8)堆表結構介紹

SQL Server效能優化(8)堆表結構介紹

一、表結構綜述

下圖是SQL Server中表的組織形式(其中分割槽1、分割槽2是為了便於管理,把表進行分割槽,放到不同的硬碟資料檔案裡。預設情況下,表只有一個分割槽。)。表在硬碟上的存放形式,有堆和B樹兩種形式。

具有分割槽的表組織結構

圖最下方的三個葉子節點,資料、LOB、行溢位是資料在硬碟上存放資料的集合。可以這麼理解,SQL Server在硬碟上一個資料頁是8k,頁有三種類型、分別為:資料、LOB、行溢位。關於頁的結構,可參考頁和區:https://technet.microsoft.com/zh-cn/library/ms190969(v=sql.105).aspx

資料(IN_ROW_DATA):包含除大型物件 (LOB) 資料以外的所有資料的資料行或索引行。頁的型別是data或者index。

LOB(LOB_DATA):一些大型物件資料,如:text、ntext、image、xml、varchar(max)、nvarchar(max)、varbinary(max) 等。頁的型別為 Text/Image。

行溢位(ROW_OVERFLOW_DATA):如果某些資料太大以至於超過1個數據頁。

二、堆的結構

堆是不含聚集索引的表(所以只有非聚集索引的表也是堆)。在資料庫檔案中,對於堆使用的每個分割槽,都有 index_id = 0。

資料沒有任何方式的排序,它就是一個無序堆,無結構關聯的記錄。當你使用SELECT語句訪問堆表時,SQL Server在執行計劃裡會使用表掃描(Table Scan)

運算子,因為你沒有定義合適的聚集索引。(堆表)沒有表查詢(Table Seek)這個運算子。這點非常重要。

在堆表你只有一個表掃描(Table Scan)運算子。表掃描意味著你必須掃描整張表,不以你表擁有的資料量來衡量。你的資料量越多,操作花費(時間)越長。。

sys.system_internals_allocation_units 系統檢視中的列 first_iam_page 指向管理特定分割槽中堆的分配空間的一系列 IAM 頁的第一頁。SQL Server 使用 IAM 頁在堆中移動。堆內的資料頁和行沒有任何特定的順序,也不連結在一起。資料頁之間唯一的邏輯連線是記錄在 IAM 頁內的資訊。(參考

http://www.cnblogs.com/chenmh/p/4359171.html

image

即,查詢堆內資料的時候是從IAM頁面進行查詢的。關於IAM頁面請參考上一篇文章。

1. IAM用於查詢分配給堆的所有資料頁資訊,IAM頁中記錄了所有的頁面的頁id。

2. 對於大多數較小的堆表來說,僅需要一個IAM頁就可以管理其頁面。

3. 若堆表大於4GB或包含LOB資料型別的話,則會包含多個IAM頁面。

4. 當查詢要獲取堆表的記錄時,SQL Server使用IAM頁來掃描堆表,是效能最差的一種查詢方法。

三、堆表的優點

堆表插入資料非常快。分配一個8kb 的新頁,在那頁寫上新的紀錄,不需要保證任何的排序。

因此在資料庫架構裡,這樣的表設計有些時候是非常好的主意:這些表只有海量(huge)並行(parallel)的INSERT活動。

參考:

相關推薦

SQL Server效能優化8結構介紹

一、表結構綜述 下圖是SQL Server中表的組織形式(其中分割槽1、分割槽2是為了便於管理,把表進行分割槽,放到不同的硬碟資料檔案裡。預設情況下,表只有一個分割槽。)。表在硬碟上的存放形式,有堆和B樹兩種形式。 圖最下方的三個葉子節點,資料、LOB、行溢位是資料在硬碟上存放資料的集合。可以這麼理解

SQL Server效能優化案例分享1——CPU持續過高——CPU高使用率的常見原因及處理方向

本系列屬於 SQL Server效能優化案例分享 專題     部分內容借用《SQL Server 2012實施與管理實戰指南》P592,如果SQL Server錯誤日誌裡面並沒有17883/17884這類錯誤,但是SQ

SQL Server進階T-SQL查詢和編程的背景

.com src 編程 server 分享 bubuko 進階 分享圖片 img SQL Server進階(一)T-SQL查詢和編程的背景

SQL Server進階表達式

ins upd 逗號 csdn 引用 ssd 優點 暫存 可讀性 概述   SQL Server支持四種類型的表表達式:派生表,公用表表達式,視圖和內聯表值函數。 派生表 派生表是一個查詢結果生成的表,類似於臨時表。 派生表可以簡化查詢,避免使用臨時表。相比手動生成

SQL Server進階集合運算

nbsp 分享圖片 src 函數 server -c 計算 lec 括號 概述 為什麽使用集合運算:   在集合運算中比聯接查詢和EXISTS/NOT EXISTS更方便。 並集運算(UNION) 並集:兩個集合的並集是一個包含集合A和B中所有元素的集合。

SQL Server進階查詢

解決方案 查詢 小結 練習 數據 分組 函數 sql 方案 開窗函數 透視數據 逆透視數據 分組集 小結 練習 解決方案SQL Server進階(八)查詢

sql查詢的優化

設計 nbsp 復合 並且 字符 之前 操作符 HERE 運算 1、對查詢進行優化,應盡量避免全表掃描,首先應考慮在 where 及 order by 涉及的列上建立索引; 2、應盡量避免在 where 子句中對字段進行 null 值判斷,否則將導致引擎放棄使用索引

php網站速度效能優化

一個網站的訪問開啟速度至關重要,特別是首頁的開啟載入過慢是致命性的,本文介紹關於php網站效能優化方面的實戰案例:淘寶首頁載入速度優化實踐 。想必很多人都已經看到了新版的淘寶首頁,它與以往不太一樣,這一版頁面中四處彌散著個性化的味道,由於獨特的個性化需求,前端也面臨各方面的技術挑戰:  

淺談前端效能優化——對HTTP傳輸進行壓縮

1、前端效能優化的一點: 對js、css、圖片等進行壓縮,儘可能減小檔案的大小,減少檔案下載的時間,從而減少網頁響應的時間。   2、前端效能優化的另一點: 對HTTP傳輸進行壓縮,即在js,css、圖片等資源已經壓縮的基礎上(其實,檔案的壓縮與否均可,檔案的壓縮跟HTTP傳輸過程的壓縮沒關

淺談前端效能優化

前端效能優化中,減少HTTP請求可以提高頁面的響應速度。 瀏覽器在第一次訪問頁面時向伺服器請求資源,並快取起來,下次再訪問時會判斷在快取中是否已有該資源且有沒有更新過,如果已有該資源且未更新過,則直接從瀏覽器快取中讀取。原理:通過HTTP 請求頭中的 If-Modified-Since(If-No-Matc

SQL Server On Linux3——SQL Server 2019 For Linux 下載並部署示例資料庫

  接上文SQL Server On Linux(2)——SQL Server 2019 For Linux安裝過程細節研究 正所謂工欲善其事必先利其器,讀者可能也跟作者一樣很迫切希望瞭解和嘗試SQL Server On Linux及SQL 2019的各種新特性,不過為了走得

SQL Server On Linux2——SQL Server 2019 For Linux安裝過程細節研究

  接上文SQL Server On Linux(1)——CentOS 7 安裝SQL Server2019 在安裝過程中,作者發現了一些資訊,這些資訊引起了作者的興趣,那麼下面作者把自己研究的結果分享出來,如果讀者對此有深入研究過,歡迎指正。 為什麼要研究這些東西?說白了就

SQL Server On Linux1——CentOS 7 安裝SQL Server2019

前言 SQL Server 2019已經正式公佈,雖然只是preview版,但是不影響我們追求新的技術。接下來的一個系列,隨著本人的研究,儘量讓這個系列成為“教程”,真正的入門到精通。 環境準備   不廢話,先把研究環境搭建起來。由於某些原因(晚點再說),本系列

MongoDB---效能優化---1

MONGODB資料架構 升級解決.方案 問題發現  應用server突然湧入的使用者人數,造成server響應變慢  檢查server,發現每次響應速度極慢,為30ops  檢

SQL Server On Linux4——Linux 初步配置1

接上文:SQL Server On Linux(3)——SQL Server 2019 For Linux 下載並部署示例資料庫 本文聊一下Linux,因為這個系列是Linux上的SQL Server,所以我們有必要初步瞭解一下這個基石,地基不穩那麼上面搭建的東西也必然搖搖晃

淺談JavaSE效能優化1——BufferedImage與畫素級渲染

分享一下我老師大神的人工智慧教程!零基礎,通俗易懂!http://blog.csdn.net/jiangjunshow 也歡迎大家轉載本篇文章。分享知識,造福人民,實現我們中華民族偉大復興!        

SQL SERVER效能優化SQL

sql server 效能優化方法 --檢視是否有死鎖 dECLARE  @tab TABLE(NAME varchar(100),value varchar(200)); INSERT INTO @tab EXEC('DBCC OPENTRAN WITH TABLERESULTS

oracle程式設計300例-效能優化

1、在SELECT語句中避免使用“*” 2、儘可能減小記錄行數 3、使用rowid高效刪除重複記錄 例項: delete from stu s where s.rowid>(select min(t.rowid) from stu t where t.stu=t.stu / 4、使用t

C#效能優化1-- 使用泛型時避免裝箱

  本想接著上一篇詳解泛型接著寫一篇使用泛型時需要注意的一個性能問題,但是後來想著不如將之前的詳解XX系列更正為現在的效能優化系列,記錄在工作時遇到的一些效能優化的經驗和技巧,如果有什麼不足,還請大家多多指出;   在使用集合時,通常為了防止裝箱操作而選擇List<T>、Dictionary&l

SQL Server 效能優化實戰系列(一) SQL Server擴充套件函式的基本概念 使用SQL Server 擴充套件函式進行效能優化 SQL Server Url正則表示式 記憶體常駐 完美解決方案

資料庫伺服器主要用於儲存、查詢、檢索企業內部的資訊,因此需要搭配專用的資料庫系統,對伺服器的相容性、可靠性和穩定性等方面都有很高的要求。        下面是進行籠統的技術點說明,為的是讓大家有一個整體的概念,如果想深入可以逐個擊破;&n