深入理解Sql Server中的表掃描
很久以前我們在寫sql的時候,最怕的一件事情就是sql莫名奇妙的超級慢,慢的是擼一管子回來,那個小球還在一直轉(zhuǎn)。。。這個著急也只有當(dāng)事人才明白,后來聽說有個什么“評估執(zhí)行計(jì)劃“,后來的后來才明白應(yīng)該避免表掃描。。。
一:表掃描
1.現(xiàn)象
”表掃描“聽起來很簡單,不就是一行一行的掃嘛,你要說”執(zhí)行計(jì)劃”的話,我也會玩,為了更可觀,我build一個表,再插入三行數(shù)據(jù),如下圖:

上面的Person我是一個索引都沒建,然后where一下,看看表掃描是啥樣的???

果然是看到了萬惡的“表掃描”三個字,既然是萬惡的東西,我們一定要深刻了解下,然后我們才可以怎么去想辦法避免它。。。所以我們一定要理解到本質(zhì),那問題來了,它到底是怎么掃的呢???怎么破呢?這個還必須得從數(shù)據(jù)頁說起。。。
二: 深刻理解表掃描
1:數(shù)據(jù)頁
這個學(xué)sqlserver的沒有理由說不知道,我們的記錄都是以數(shù)據(jù)頁形式存儲的,而且還應(yīng)該知道數(shù)據(jù)頁的大小是8k。。。。那數(shù)據(jù)頁在哪里?我可以
讓你眼見為實(shí)。

乍一看我畫了好多,千萬不要怕,不要以為畫的多,就以為高深了。。。我簡單的剖析下。
<1>:dbcc ind 命令
你要是想看數(shù)據(jù)頁的相關(guān)情況,sqlserver還真提供了專用命令dbcc 滿足你,你可能會問sqlserver中有提供ind命令的參數(shù)嗎?告訴你吧,還真有
的,不過這個要開啟2588跟蹤,就像下面這樣。

<2>:PageFID,PagePID,IAMFID
剛才也說了,數(shù)據(jù)頁有很多種,默認(rèn)說的都是表數(shù)據(jù)頁,其實(shí)還有IAM數(shù)據(jù)頁,沒什么稀奇的,IAM就是用來跟蹤表數(shù)據(jù)頁的,所以上面的圖中,IAMFID字段為Null的記錄就是IAM頁,下面的PagePID=78的,就是表數(shù)據(jù)頁。
2.查看數(shù)據(jù)頁
為避免大家糊涂了,我先還是說說數(shù)據(jù)頁內(nèi)部結(jié)構(gòu)大概是個什么樣子,好讓大家有個整體印象。

從圖中可以看到,在數(shù)據(jù)頁的尾部是有很多槽位的,這些槽位指向了Data區(qū)域中一條條實(shí)際記錄的地址,所以說表掃描,其實(shí)就是掃這些Slot槽位,
還是拿上面的Person表中的三條記錄來說,他們都是保存在78號數(shù)據(jù)頁中,現(xiàn)在出于好奇心把78號數(shù)據(jù)頁導(dǎo)出來,說干就干。。。。很簡單,你需
要做兩件事情:
<1>開啟3604跟蹤: dbcc traceon(3604)
<2>使用dbcc page 命令導(dǎo)出1號文件下面的78號數(shù)據(jù)頁(pageFID:pagePID)=(1:78),就像下面這樣。。。
數(shù)據(jù)頁頭(PAGE HEADER):

數(shù)據(jù)內(nèi)容(Page Data):

數(shù)據(jù)槽位(Page Slot):

有沒有看到上面(0,1,2)三個槽位,并且都有相應(yīng)的偏移地址(0x7e,0x92,0xba),這個地址就指向了Data區(qū)域?qū)嶋H記錄的偏移地址。
好了,到此為止吧,不能再往下說了,洗洗睡了。
相關(guān)文章
巧妙利用PARTITION分組排名遞增特性解決合并連續(xù)相同數(shù)據(jù)行
這篇文章主要介紹了巧妙利用PARTITION分組排名遞增特性解決合并連續(xù)相同數(shù)據(jù)行,需要的朋友可以參考下2014-08-08
MSSQL 2000 使用幫助(sql server簡明教程)
這篇文章主要介紹了MSSQL 2000 使用幫助(sql server簡明教程),需要的朋友可以參考下2017-04-04
SqlServer數(shù)據(jù)庫中文亂碼問題解決方法
SQL版的亂碼問題還是出現(xiàn)在SQL SERVER的安裝設(shè)置上。默認(rèn)安裝時系統(tǒng)默認(rèn)的排序規(guī)則是拉丁文的排序規(guī)則,但一般人在安裝時沒有考慮到這一點(diǎn),安裝時只是點(diǎn)取下一步,安裝完成后,造成了SQL版在使用過程中出現(xiàn)亂碼2020-03-03
編寫高質(zhì)量代碼改善C#程序——使用泛型集合代替非泛型集合(建議20)
這篇文章主要介紹編寫高質(zhì)量的代碼有助于改善C#程序,在開發(fā)過程中集合用的比較多,如何把集合使用好,在開發(fā)過程必須掌握的技巧,下面這篇文章就給大家詳細(xì)介紹編寫高質(zhì)量代碼改善C#程序——使用泛型集合代替非泛型集合(建議20),需要的朋友可以參考下2015-08-08
sqlserver循環(huán)刪除表中的數(shù)據(jù)最好方案
這篇文章主要介紹了sqlserver?中?循環(huán)刪除表中的數(shù)據(jù),這樣不會鎖表,導(dǎo)致業(yè)務(wù)出現(xiàn)問題,本文給大家分享最新解決方案,文中給大家補(bǔ)充介紹了foreach 循環(huán)中刪除一條數(shù)據(jù)_SQL Server中刪除重復(fù)數(shù)據(jù)的幾個方法,需要的朋友可以參考下2023-11-11
一個完整的SQL SERVER數(shù)據(jù)庫全文索引的示例介紹
以下是介紹SQL SERVER數(shù)據(jù)庫全文索引的示例,以pubs數(shù)據(jù)庫為例。需要的朋友參考下2013-07-07

