日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 运维知识 > 数据库 >内容正文

数据库

SQL Server执行计划那些事儿(3)——书签查找

發布時間:2023/12/10 数据库 36 豆豆
生活随笔 收集整理的這篇文章主要介紹了 SQL Server执行计划那些事儿(3)——书签查找 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

接下來的文章是記錄自己曾經的盲點,同時也透漏了自己的發展歷程(可能發展也算不上,只能說是瞎混)。當然,一些盲點也在工作和探究過程中慢慢有些眉目,現在也愿意發揚博客園的奉獻精神,拿出來和大家分享一下。

在剛開始工作時候,總以自己有個“高科技”的工作,而感到特別神氣,經常在其他人面前說一些讓別人覺得高大上的措辭,到后來會在學妹面前炫耀的講一下SQL Server的執行計劃,這個時候別說執行計劃了,就是SQL的優化對我來說還是個新鮮的事物,總是以自己能正確查出結果而沾沾自喜。然而,當真有不經世事的學妹會問我,執行計劃是什么,我的回答:“就是......”,說的什么,我自己都不知道。

開門見山,直接入題

在查看SQL Sever執行計劃的過程中,你是否曾經也和我一樣,看到索引查找就欣喜若狂,萬事大吉了呢,從來不會理會RID查找,鍵查找為何物,更不會管他們究竟是什么。但是,作為程序猿的我,為了能進化為人,我不得不去搞明白書簽(RID,鍵值)為何物。

書簽查找出現的情況:書簽查找總是伴隨著非聚集索引的查找而出現,但并不是所有的非聚集索引都會引起書簽查找。在表以堆(不含聚集索引)的形式存儲的時候,書簽查找為RID查找,當表以樹(含聚集索引)的形式存儲時,書簽查找為鍵查找。

書簽查找為何物:當SQL Server查詢優化器使用非聚集索引查找時,當該索引沒有完全覆蓋查詢列和返回列時,就會引起書簽查找。

RID是什么:當表以堆的形式存儲的時候,數據行的物理位置是不會(嚴謹的說是很少)變動的,正是因為很少變動,所以,可以通過一個地址來唯一確定一行,又因為數據庫的每一行一定存儲在某一頁上,而某一頁又一定在某一數據庫文件中,所以就可以通過文件號:頁號:行號(如:1:22:14,指的就是第1個數據庫文件的第22頁中的第14行)。

鍵值書簽是什么:當表以樹的形式存儲時,也就是說,當表含有聚集索引時,表中的數據行是會移動的,所以,RID是不能一直定位在同一行的。這個時候就需要通過聚集索引鍵來定位一行,這個聚集索引鍵就是鍵值書簽。

下面我們可以通過例子來認識下書簽查找,以及它們對性能的影響:

我們還用?SQL Server執行計劃那些事兒(1)——哈希、合并、嵌套聯接的選擇中的例子(刪除所有索引)。

1.我們先建立非聚集索引

create nonclustered index non_index_headers_buyDate on headers(BuyDate)

然后執行

select ID,BuyDate from Headers where BuyDate>'2008-12-28'

注:該例子僅僅為了說明情況,不含實際意義。

?分析:在不含聚集索引的表中,因為這個非聚集索引中沒有覆蓋ID列,所以要通過RID進行查找。

2.建立聚集索引

create clustered index index_headers_ID on headers(ID)

然后執行上面查詢語句

select ID,BuyDate from Headers where BuyDate>'2008-12-28'

分析:是不是覺得很奇怪?不奇怪,因為非聚集索引的覆蓋列包含,非聚集索引的鍵列、非聚集索引包含的列以及聚集索引的鍵列。因此,ID和BuyDate為非聚集索引覆蓋列,所以僅通過索引頁就可以查出結果,沒必要再通過任何書簽查找。

3.執行下面SQL語句

select ID,BuyDate,Discount from Headers where BuyDate>'2008-12-28'

分析:因為此時的表中有聚集索引,又因為非聚集索引沒有覆蓋Discount列,所以會引起鍵查找。

4.書簽查找對查詢性能的影響到底有多大呢 ?

創建非聚集索引,讓其覆蓋Discount列

create nonclustered index non_index_headers_buyDate_include on headers(BuyDate) include(Discount)

然后執行例子3中的查詢語句

select ID,BuyDate,Discount from Headers where BuyDate>'2008-12-28'

?分析:因為此時非聚集索引已經覆蓋了,查詢列和結果列,故沒有書簽查找。另外,此時邏輯讀取次數已經明顯比之前小了很多,可見書簽查找是很耗資源的,甚至會使索引失效,從而引起全表掃描。

?

總結

1.只有在用到非聚集索引查找時,并且查找列和返回列沒有完全被索引覆蓋時,才會引起書簽查找。

2.書簽查找是非常耗費資源的,甚至會使索引失效。

3.可以通過讓非聚集索引覆蓋查詢列和返回列來消除書簽查找。

?

轉載于:https://www.cnblogs.com/mrzl/p/4105703.html

總結

以上是生活随笔為你收集整理的SQL Server执行计划那些事儿(3)——书签查找的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。