深入理解Sql Server中的表掃描_MsSql

來源:互聯網
上載者:User

  很久以前我們在寫sql的時候,最怕的一件事情就是sql莫名奇妙的超級慢,慢的是擼一管子回來,那個小球還在一直轉。。。這個著急也只有當事人才明白,後來聽說有個什麼“評估執行計畫“,後來的後來才明白應該避免表掃描。。。

一:表掃描

1.現象

  ”表掃描“聽起來很簡單,不就是一行一行的掃嘛,你要說”執行計畫”的話,我也會玩,為了更可觀,我build一個表,再插入三行資料,如下圖:

 

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

 

 

   果然是看到了萬惡的“表掃描”三個字,既然是萬惡的東西,我們一定要深刻瞭解下,然後我們才可以怎麼去想辦法避免它。。。所以我們一定要理解到本質,那問題來了,它到底是怎麼掃的呢???怎麼破呢?這個還必須得從資料頁說起。。。

 二: 深刻理解表掃描

1:資料頁

    這個學sqlserver的沒有理由說不知道,我們的記錄都是以資料頁形式儲存的,而且還應該知道資料頁的大小是8k。。。。那資料頁在哪裡?我可以

讓你眼見為實。

乍一看我畫了好多,千萬不要怕,不要以為畫的多,就以為高深了。。。我簡單的剖析下。

<1>:dbcc ind 命令

 你要是想看資料頁的相關情況,sqlserver還真提供了專用命令dbcc 滿足你,你可能會問sqlserver中有提供ind命令的參數嗎?告訴你吧,還真有

的,不過這個要開啟2588跟蹤,就像下面這樣。

  <2>:PageFID,PagePID,IAMFID

  剛才也說了,資料頁有很多種,預設說的都是表資料頁,其實還有IAM資料頁,沒什麼稀奇的,IAM就是用來跟蹤表資料頁的,所以上面的圖中,IAMFID欄位為Null的記錄就是IAM頁,下面的PagePID=78的,就是表資料頁。

 2.查看資料頁

  為避免大家糊塗了,我先還是說說資料頁內部結構大概是個什麼樣子,好讓大家有個整體印象。

 從圖中可以看到,在資料頁的尾部是有很多槽位的,這些槽位指向了Data地區中一條條實際記錄的地址,所以說表掃描,其實就是掃這些Slot槽位,

還是拿上面的Person表中的三條記錄來說,他們都是儲存在78號資料頁中,現在出於好奇心把78號資料頁匯出來,說幹就幹。。。。很簡單,你需

要做兩件事情:

<1>開啟3604跟蹤: dbcc traceon(3604)

<2>使用dbcc page 命令匯出1號檔案下面的78號資料頁(pageFID:pagePID)=(1:78),就像下面這樣。。。

 資料頁頭(PAGE HEADER):

 

資料內容(Page Data): 

 

資料槽位(Page Slot):

 

 

有沒有看到上面(0,1,2)三個槽位,並且都有相應的位移地址(0x7e,0x92,0xba),這個地址就指向了Data地區實際記錄的位移地址。

好了,到此為止吧,不能再往下說了,洗洗睡了。

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.