LOGO OA教程 ERP教程 模切知識(shí)交流 PMS教程 CRM教程 開發(fā)文檔 其他文檔  
 
網(wǎng)站管理員

解析SQL Server聚焦移除(Bookmark Lookup、RID Lookup、Key Lookup)

freeflydom
2023年11月27日 11:53 本文熱度 681

Bookmark Lookup、RID Lookup、Key Lookup定義
一說到這三者,如果對(duì)索引研究不深的童鞋估計(jì)是懵逼的,什么玩意,我們姑且將上面三者翻譯為:標(biāo)簽查找、行ID查找、鍵查找。標(biāo)簽查找和鍵查找是一個(gè)意思,在SQL 2005之前叫Key Lookup。怎么解釋,如何定義呢?首先我們不看定義,直接看下面一步一步解析,如果你實(shí)在忍不住,請(qǐng)看園友【永紅】的見解,解釋還是非常到位。我們簡(jiǎn)短的說明下此三者概念。
在查詢中,我們對(duì)返回的列在查詢條件上若建立了非聚集索引,此時(shí)將可能嘗試使用非聚集索引查找,如果返回的列沒有創(chuàng)建非聚集索引,此時(shí)會(huì)返回到數(shù)據(jù)頁中去獲取這些列的數(shù)據(jù),即使表中存在聚集索引或者沒有,都會(huì)返回到表中或者聚集索引中去獲取數(shù)據(jù)。對(duì)于以上場(chǎng)景描述,如果表沒有創(chuàng)建聚集索引則稱為Bookmar Lookup,如果表中沒有聚集索引但是存在非聚集索引我們稱為RID Lookup??吹竭@里我們就會(huì)想法操作如此耗時(shí),還要返回到基表中去獲取數(shù)據(jù),所以才有了我們本節(jié)來移除以上三者來提高查詢性能。接下來我們一起來看看。
拋出Bookmark Lookup、RID Lookup、Key Lookup問題
我們首先創(chuàng)建如下表

1
2
3
4
5
6
7
8
9
USE TSQL2012
GO
create TABLE Sales.Orders
(
[orderid] INT,
[shipaddress] VARCHAR(100),
[shipcity] VARCHAR(100),
[shipregion] VARCHAR(100))
GO

接著進(jìn)行查詢

1
2
3
4
5
USE TSQL2012
GO
select orderid, shipaddress, shipregion
from Sales.Orders
where shipcity = '深圳'


這個(gè)不用多講,沒添加任何索引,執(zhí)行查詢計(jì)劃是全表掃描。接下來我們創(chuàng)建在orderid上創(chuàng)建聚集索引如下:
create CLUSTERED INDEX idx_cls_orderid ON Sales.Orders(orderid)
我們?cè)賵?zhí)行上述查詢

此時(shí)我們創(chuàng)建了聚集索引,所以此時(shí)查詢走聚集索引,到這里我們看到情況由全表掃描轉(zhuǎn)換成了索引掃描。我們?cè)诓樵儠r(shí)一直是帶了查詢條件的,而對(duì)查詢條件我們未作任何操作,如果我們此時(shí)在查詢條件上創(chuàng)建了索引,此時(shí)查詢的性能又會(huì)得到一點(diǎn)改善。我們開始對(duì)查詢條件創(chuàng)建一個(gè)非聚集索引。
create NONCLUSTERED INDEX idx_nc_shipcity ON Sales.Orders(shipcity)
我們?cè)俳又鴪?zhí)行查詢

我們觀察到對(duì)查詢條件創(chuàng)建了非聚集索引,查詢計(jì)劃會(huì)使用非聚集索引查找返回結(jié)果,但是對(duì)于shipaddress, shipcity, shipregion并不是索引的一部分,此時(shí)查詢引擎會(huì)返回到基表中得到這些數(shù)據(jù)再返回。這種行為就叫做Bookmark Lookup或者Key Lookup。下面我們就如本文標(biāo)題一樣問題出現(xiàn)來解決問題,移除Bookmark Lookup或者Key Lookup。我們嘗試用兩種不同的方法來解決。
解決Bookmark Lookup、RID Lookup、Key Lookup問題
創(chuàng)建非聚集索引覆蓋索引
我們對(duì)查詢條件以及檢索列創(chuàng)建非聚集索引。
create NONCLUSTERED INDEX idx_all_cover ON Sales.Orders(shipaddress,orderid,shipcity,shipregion)

此時(shí)我們對(duì)檢索列創(chuàng)建了非聚集索引,此時(shí)將不會(huì)再到數(shù)據(jù)頁中獲取數(shù)據(jù),而是從索引中直接返回,所以到這里我們算是移除了Key Lookup。但是此時(shí)觸發(fā)另外一個(gè)問題,執(zhí)行查詢計(jì)劃走的卻是索引掃描,索引到底是什么呢?我們打個(gè)比方,一個(gè)索引相當(dāng)于是數(shù)據(jù)庫中一個(gè)本書開始的索引,我們需要快速從書中查找到我們所需要的數(shù)據(jù),這個(gè)時(shí)候書就是我們所說的表。索引掃描意味著要讀取表中的所有行,然后返回滿足條件的所有數(shù)據(jù),當(dāng)執(zhí)行索引掃描時(shí),所有行上葉子節(jié)點(diǎn)上的所有都會(huì)被掃描,這也就意味著索引上的所有行都會(huì)被檢索一遍而不是直接檢索表,和表掃描對(duì)比的話,表掃描是直接讀取表中數(shù)據(jù),所以表掃描和索引掃描還是有一點(diǎn)點(diǎn)不同,而索引查找則是依賴于索引頁數(shù)據(jù)來定位滿足條件的所有行,索引查找僅僅只影響滿足條件以及頁上包含這些滿足條件的行,所以說索引查找更加高效。
上述我們稍微講解了下索引掃描和索引查找,而上述的問題是我們創(chuàng)建了非聚集索引,但是結(jié)果執(zhí)行的查詢計(jì)劃是索引掃描,很是納悶,對(duì)于剛學(xué)索引小白的我來說,不知該如何是好,以為是緩存的緣故,清除各種緩存均不好使。于是開始胡思亂想是不是檢索列中數(shù)據(jù)有為NULL引起的,是不是檢索列數(shù)據(jù)重復(fù)引起的,嘗試了無數(shù)次,最終發(fā)現(xiàn)某一次居然好使。如下

1
2
create NONCLUSTERED INDEX idx_cls_cover ON
Sales.Orders(shipcity,orderid,shipaddress,shipregion)


此時(shí)若我們將查詢條件進(jìn)行如下修改。

1
2
3
4
5
6
USE TSQL2012
GO
select orderid, shipaddress, shipregion
from Sales.Orders
where shipaddress = '深圳'
GO


到這里我們應(yīng)該發(fā)現(xiàn)了,唯一的區(qū)別在于我們創(chuàng)建非聚集索引時(shí)的順序和查詢條件不同就會(huì)導(dǎo)致索引掃描和索引查找的轉(zhuǎn)換,那么到底什么時(shí)候才會(huì)執(zhí)行索引查找呢?我們可以進(jìn)行如下一般性總結(jié):
索引查找的一般性結(jié)論:如果條件中包含where或者ON的話,查詢條件必須是位于索引集合列中首位,此時(shí)索引查找將會(huì)被使用。
此時(shí)我們穿插一點(diǎn)內(nèi)容,上述我們創(chuàng)建了覆蓋索引,我們來比較下覆蓋索引和默認(rèn)情況下聚集索引查找的性能開銷。
覆蓋索引與默認(rèn)聚集索引性能開銷比較

1
2
3
4
5
6
7
from Sales.Orders WITH(INDEX([PK_Orders]))
where orderid<11072
go
select orderid, shipaddress, shipregion
from Sales.Orders WITH(INDEX([idx_noncls_include_exceptorderid]))
where orderid<11072
GO


從上可知,覆蓋索引的開銷要比默認(rèn)主鍵聚集索引性能開銷要好一點(diǎn),同時(shí)我們可以看看如下二者IO代價(jià)。


通過上述覆蓋索引與默認(rèn)聚集索引的對(duì)比,我們能夠有效的減少IO,這一點(diǎn)也是非常明確的,當(dāng)然下面的INCLUDE索引對(duì)比也是另外一種好的方案。

創(chuàng)建INCLUDE非聚集索引

1
2
3
4
5
USE TSQL2012
GO
create NONCLUSTERED INDEX [ix_noncls_include] ON [TSQL2012].[Sales].[Orders] (
 shipcity
) INCLUDE (shipaddress, shipregion, orderid)


至此我們用兩種方式來移除了Bookmark Lookup、RID Lookup、Key Lookup,通過使用索引和覆蓋索引。
既然有如上兩種方式,我們應(yīng)該有所取舍,二者誰的性能更好呢?我們接下來比較上述二者的開銷差異。
比較移除Bookmark Lookup等兩種方式差異

1
2
3
4
5
6
7
8
9
10
USE TSQL2012
GO
select orderid, shipaddress, shipcity, shipregion
from Sales.Orders WITH(INDEX(idx_all_cover))
where shipcity = '深圳'
GO
select orderid, shipaddress, shipcity, shipregion
from Sales.Orders WITH(INDEX(ix_noncls_include))
where shipcity = '深圳'
GO


我們從上所知,二者開銷一樣,并未有什么區(qū)別,當(dāng)然相信我們更傾向于的是將第二種方式作為解決方案。到這里算是基本結(jié)束了,但是還有一個(gè)小問題,我們?cè)谥耙呀?jīng)創(chuàng)建了orderid的聚集索引,后面在解決方案中我們也添加了orderid的非聚集索引,難道非得添加嗎,我們?nèi)サ粼囋嚳础?/span>

1
2
3
4
create NONCLUSTERED INDEX idx_noncls_cover_exceptorderid
ON Sales.Orders(shipcity,shipaddress,shipregion)
create NONCLUSTERED INDEX idx_noncls_include_exceptorderid
ON Sales.Orders(shipcity) INCLUDE(shipaddress,shipregion)

去除orderid比較二者開銷差異:

1
2
3
4
5
6
7
8
9
10
USE TSQL2012
GO
select orderid, shipaddress, shipregion
from Sales.Orders WITH(INDEX([idx_noncls_cover_exceptorderid]))
where shipaddress = '深圳'
GO
select orderid, shipaddress, shipregion
from Sales.Orders WITH(INDEX([idx_noncls_include_exceptorderid]))
where shipaddress = '深圳'
GO


由上知,非聚集索引列不需要包含創(chuàng)建了聚集索引的列,那么事實(shí)到底是怎樣的呢?
結(jié)論:其實(shí)對(duì)于任何非聚集索引列都不需要包含創(chuàng)建了聚集索引的列,因?yàn)閯?chuàng)建聚集索引的列是非聚集索引集合列的一部分,也就是說只要一個(gè)表上的列創(chuàng)建了聚集索引,那么非聚集索引集合列就包含了這個(gè)聚集索引。



該文章在 2023/11/27 11:53:39 編輯過
關(guān)鍵字查詢
相關(guān)文章
正在查詢...
點(diǎn)晴ERP是一款針對(duì)中小制造業(yè)的專業(yè)生產(chǎn)管理軟件系統(tǒng),系統(tǒng)成熟度和易用性得到了國內(nèi)大量中小企業(yè)的青睞。
點(diǎn)晴PMS碼頭管理系統(tǒng)主要針對(duì)港口碼頭集裝箱與散貨日常運(yùn)作、調(diào)度、堆場(chǎng)、車隊(duì)、財(cái)務(wù)費(fèi)用、相關(guān)報(bào)表等業(yè)務(wù)管理,結(jié)合碼頭的業(yè)務(wù)特點(diǎn),圍繞調(diào)度、堆場(chǎng)作業(yè)而開發(fā)的。集技術(shù)的先進(jìn)性、管理的有效性于一體,是物流碼頭及其他港口類企業(yè)的高效ERP管理信息系統(tǒng)。
點(diǎn)晴WMS倉儲(chǔ)管理系統(tǒng)提供了貨物產(chǎn)品管理,銷售管理,采購管理,倉儲(chǔ)管理,倉庫管理,保質(zhì)期管理,貨位管理,庫位管理,生產(chǎn)管理,WMS管理系統(tǒng),標(biāo)簽打印,條形碼,二維碼管理,批號(hào)管理軟件。
點(diǎn)晴免費(fèi)OA是一款軟件和通用服務(wù)都免費(fèi),不限功能、不限時(shí)間、不限用戶的免費(fèi)OA協(xié)同辦公管理系統(tǒng)。
Copyright 2010-2025 ClickSun All Rights Reserved

黄频国产免费高清视频,久久不卡精品中文字幕一区,激情五月天AV电影在线观看,欧美国产韩国日本一区二区
亚洲综合色区另类小说久久久 | 亚洲欧洲精品一区二区 | 色悠久久久久综合网伊 | 亚洲日韩乱码久久久久久 | 亚洲另类精品国产一级欧美 | 亚洲天堂电影午夜在线 |