第5 24周 堆表

2021-09-08 10:55:50 字數 1960 閱讀 8420

歡迎來到sql server效能調優培訓

的第2個月。這個月將會是最有趣和最有挑戰性的乙個月,這個月我們專乙隻談sql server中的索引,索引,還是索引。相信我,值得乙個月去學習索引。

今天我會談下堆表(heap tables),在接下來的3周,我們會**下聚集索引,非聚集索引,還有sql server的索引戰略。先來看下堆表。堆表就是沒有聚集索引的表。如果sql server中的錶能有乙個聚集索引,那這個表被稱為聚集表(clustered table),沒有聚集索引的表,我們稱它為堆表。

在堆表裡,資料沒有任何方式的排序,它就是乙個無序堆,無結構關聯的記錄。當你使用select語句訪問堆表時,sql server在執行計畫裡會使用表掃瞄(table scan)運算子,因為你沒有定義合適的聚集索引。(堆表)沒有表查詢(table seek)這個運算子。這點非常重要。

下週你會學到,當我們提到聚集索引時,你是通過聚集索引掃瞄(clustered index scan)、聚集索引查詢(clustered index seek)運算子來訪問聚集索引的。在堆表你只有乙個表掃瞄(table scan)運算子。表掃瞄意味著你必須掃瞄整張表,不以你表擁有的資料量來衡量。你的資料量越多,操作花費(時間)越長。

表掃瞄始終是個線性o(n)操作(更多關於大o介紹),它不以你越來越大的表來衡量。現在讓我們一起詳細看下在sql server中堆表的優點和缺點。

堆表插入資料非常,非常,非常快。如我們剛才說的堆表就是乙個資料堆。當你從傳統**本(拆開裝訂)把每頁扯出來並把各頁放在你面前的桌上時,你就擁有了乙個堆表。在堆表的**本裡插入乙個新的**記錄非常快:你分配乙個8kb 的新頁,在那頁寫上新的紀錄,最後把那頁與面前的其他頁放一起,搞定。不需要保證任何的排序。

在sql server裡是一樣的:分配乙個新頁,在新頁存新的紀錄,把這頁分配給堆表,搞定。這是乙個非常快的方法,因為sql server不需要保證任何的排序。把新紀錄存放在**完全由sql server自己決定。

因此在資料庫架構裡,這樣的表設計有些時候是非常好的主意:這些表只有海量(huge)並行(parallel)的insert活動。考慮下你的登陸/審計表。當我絕不推薦在任何地方使用堆表。這裡只是一些特定有意義的使用案例。但不是任何地方。

堆表除了插入資料非常快的優點外,也有很多缺點,當你決定建立堆表時若不考慮這些就不合適了。

第乙個缺點,堆表在你訪問表資料時會在儲存子系統引發隨機訪問(random i/o)。想象下對你的堆表執行簡單的select語句。如果資料沒有緩衝在緩衝池,sql server會發起從你的儲存系統進行物理讀操作。這些讀操作會是隨機訪問(random i/o),因為堆表的頁是存在資料檔案裡某些地方的,它們並不相鄰。

如果你使用傳統的旋轉儲存(現在大多數情況還是這樣的機械硬碟),在你的儲存級別就有效能上的問題,因為隨機訪問是非常,非常慢的。ssd硬碟在這方面是大的遊戲規則改變者,因為如果你在ssd硬碟執行隨機訪問(random i/o)循序訪問(sqquential i/o),這些都不是問題。因為兩種操作不管哪樣速度基本都是一樣(隨機訪問(random i/o)循序訪問(sqquential i/o)稍微慢一點)。

另外乙個是明確只有在堆表裡才有的被稱為**記錄(forwarding records)的問題。存在堆表裡的記錄在某些情況下(更新變長記錄會移動記錄的儲存)可以從一頁移動到另一頁。如果這個發生的話,sql server會在原頁存放一條指向記錄存放新位置的**記錄(forwarding record) 。

0518_05_堆表.rar

第5 24周 堆表

歡迎來到sql server效能調優培訓 的第2個月。這個月將會是最有趣和最有挑戰性的乙個月,這個月我們專乙隻談sql server中的索引,索引,還是索引。相信我,值得乙個月去學習索引。今天我會談下堆表 heap tables 在接下來的3周,我們會 下聚集索引,非聚集索引,還有sql serve...

第16周 專案1 堆排序

檔名稱 1.pp 完成日期 2015年12月14日 問題描述 驗證演算法 include define maxsize 20 typedef int keytype 定義關鍵字型別 typedef char infotype 10 typedef struct 記錄型別 rectype 排序的記錄型...

第16周專案1(6)堆排序

問題及 檔名稱 專案1.6.cpp 完成日期 2015.12.19 問題描述 輸入描述 無 程式輸出 測試資料 include define maxsize 20 typedef int keytype 定義關鍵字型別 typedef char infotype 10 typedef struct ...