MSSQL優化教程之1 4 其他幾種型別的頁面

2022-02-18 13:02:41 字數 2021 閱讀 1656

上一次只是講了講普通資料頁面,後來自己回想一下,應該跟大家講講其他型別的頁面,作為乙個知識體系貫穿起來。 

全域性分配對映表 (gam)

gam 頁記錄已分配的區。每個 gam 包含 64,000 個區,相當於近 4 gb 的資料(每個區占用一位,每八個區占用乙個位元組,每個頁大概可用位元組為8000個位元組,所以能管理4gb的資料)。gam 用乙個位來表示所涵蓋區間內的每個區的狀態。如果位為 1,則區可用;如果位為 0,則區已分配。

共享全域性分配對映表 (sgam)

sgam 頁記錄當前用作混合區且至少有乙個未使用的頁的區。每個 sgam 包含 64,000 個區,相當於近 4 gb 的資料。sgam 用乙個位來表示所涵蓋區間內的每個區的狀態。如果位為 1,則區正用作混合區且有可用頁。如果位為 0,則區未用作混合區,或者雖然用作混合區但其所有頁均在使用中。

區的當前使用情況

gam位設定

sgam位設定

可用,未使用

1

0

統一區或已滿的混合區

0

0

具有可用頁的混合區

0

1

這樣,資料庫在分配物件的時候,先去找混合區,那還有未使用的混合區就是到gam頁和sgam頁裡對應的0或者1.

pfs:

free space page,他用來跟蹤頁面的使用者狀態,到底是滿的還是空的,還是只是使用了百分之幾十。每個頁面都有乙個對應的位元組來描述,所以,每個pfs頁面只能管理約8000個頁面。資料庫引擎將使用 pfs 頁來記錄區中的哪些頁已分配或哪些頁可用。資料庫引擎必須分配新頁時,將使用此資訊。保留的頁中的可用空間量僅用於堆和 text/image 頁。資料庫引擎必須找到乙個具有可用空間的頁來儲存新插入的行時,使用此資訊。索引不要求跟蹤頁的可用空間,因為插入新行的點是由索引鍵值設定的。

iam:

index allocation map,這個頁面記錄哪個區被分配到了那個物件了,總共可以標記4gb的區,同時,這個頁面是非常重要的乙個頁面,在資料插入的時候,起到至關重要的作用。

記得很久以前看過一篇大牛的文章,說堆表插入比聚集索引樹快,但是最近看了一篇文章,在乙個模擬的多併發情況下,事實卻相反,而他的推斷依據,也是因為資料庫的分配體制而來的,也就是iam+pfs資料分配體制。

資料庫在新插入資料的時候(堆表),先去iam頁面上查詢這個物件的區,然後找到區後在pfs頁面上找到這個區的使用情況,如果有空的,那麼就插入到這個區。其中涉及到兩個操作:查詢iam,查詢pfs,但是iam和pfs是有鎖存在的,在大量併發情況下,肯定會存在在區分配滿後,會將pfs頁面更新,更新其狀態,比如置為已滿或者已空,這樣,就會涉及到併發衝突問題。而且堆表上絕大部分的查詢操作都是表掃瞄,而表掃瞄一次性都要占用iam和pfs頁,這樣併發問題更加突出。所以那篇文章的作者模擬出一環境,不停查詢和不停的插入,對比堆表和聚集索引表的插入速度,實際上聚集索引是要快很多的,具體快多少,忘記倍數了,^_^.

dcm:

這個頁面全稱叫:different change map ,他記錄自從上次全備以來的資料改變的頁面,以備差異備份,如果不執行差異備份,這個功能是不是可以略去,還請大人們指點一下。

bcm:

bulk change map 批量插入的時候防止日誌大量記錄而使用的乙個頁面,跟蹤被新插入的頁面,在大容量插入模式下,這個頁面非常管用。

sort page:

排序時所用到的臨時頁,排序中間操作儲存資料用的。

另外這些頁面都是位於資料庫檔案的第1,2,3前幾個頁面(具體他們之間也有順序,我就不羅嗦了,對優化沒有啥關係),可以稱為是資料庫的元檔案。他們這些頁面都是常駐於緩衝池內的,不用擔心他們會造成物理讀取。

另外長嘆一聲,我的兄弟因傷退賽,唉,太可惜了……………………………

MySQL教程之查詢優化程式

當你呼叫語句時,mysql會對它進行分析,判斷出可以使用哪些優化操作來加快處理速度。例如 select from tab where false mysql會檢查子句,發現沒有符合查詢條件的行,就根本不會去搜尋表。通過執行explain可以看出 explain select from tab whe...

MSSQL優化之索引優化

1。用count 統計比用count 字段 快。用count 主鍵 速度最快!2。select cid,title,cnt from table where cid 9999999 or riqi 2004 9 16 select cid,title,cnt from table where cid...

MySQL優化教程之超大分頁查詢

基本上只要是做後台開發,都會接觸到分頁這個需求或者功能吧。基本上大家都是會用mysql的limit來處理,而且我現在負責的專案也是這樣寫的。但是一旦資料量起來了,其實limit的效率會極其的低,這一篇文章就來講一下limit子句優化的。很多業務場景都需要用到分頁這個功能,基本上都是用limit來實現...