SQL?Server索引查找/掃描沒(méi)有出現(xiàn)key?lookup的案例機(jī)械
在我們講解這個(gè)案例前,我們先來(lái)了解/預(yù)熱一下SQL Server的兩個(gè)概念:鍵查找(key lookup)和RID查找(RID lookup),通常,當(dāng)查詢優(yōu)化器使用非聚集索引進(jìn)行查找時(shí),如果所選擇的列或查詢條件中的列只部分包含在使用的非聚集索引和聚集索引中時(shí),就需要一個(gè)查找(lookup)來(lái)檢索其他字段來(lái)滿足請(qǐng)求。對(duì)一個(gè)有聚簇索引的表來(lái)說(shuō)是一個(gè)鍵查找(key lookup),對(duì)一個(gè)堆表來(lái)說(shuō)是一個(gè)RID查找(RID lookup),這種查找即是——書(shū)簽查找(bookmark lookup)。在其他數(shù)據(jù)庫(kù)概念中,可能又叫回表查詢之類的概念。
那么我們先來(lái)構(gòu)造案例所需的測(cè)試環(huán)境。下面測(cè)試環(huán)境為SQL Server 2014。
SELECT * INTO TEST FROM SYS.OBJECTS CREATE CLUSTERED INDEX PK_TEST ON TEST(OBJECT_ID, NAME,CREATE_DATE) CREATE INDEX IX_TEST_N1 ON TEST(PARENT_OBJECT_ID, TYPE) UPDATE STATISTICS TEST WITH FULLSCAN;
如上所示,表TEST在字段OBJECT_ID, NAME,CREATE_DATE建立了聚集索引,然后下面這種查詢語(yǔ)句,你查看其實(shí)際執(zhí)行計(jì)劃
SELECT OBJECT_ID, NAME,CREATE_DATE,PARENT_OBJECT_ID, TYPE FROM TEST WHERE PARENT_OBJECT_ID=2255213;
你會(huì)發(fā)現(xiàn),SQL Server優(yōu)化器走索引IX_TEST_N1查找就返回了所有數(shù)據(jù)。沒(méi)有書(shū)簽查找(回表查詢),那么這是為什么呢?朋友這樣問(wèn)我的時(shí)候,我還真沒(méi)有想明白。難道索引IX_TEST_N1中也會(huì)存儲(chǔ)OBJECT_ID, NAME,CREATE_DATE的值? 當(dāng)然你構(gòu)造其它的案例時(shí),有可能是索引IX_TEST_N1掃描就返回了數(shù)據(jù)。不會(huì)發(fā)生書(shū)簽查找。
后面才想明白,非聚集索引中的索引行指向數(shù)據(jù)行的指針?lè)Q為行定位器。 行定位器的結(jié)構(gòu)取決于數(shù)據(jù)頁(yè)是存儲(chǔ)在堆中還是聚集表中。 對(duì)于堆,行定位器是指向行的指針。 對(duì)于聚集表,行定位器是聚集索引鍵。這是不是有點(diǎn)眼熟,類似于MySQL InnoDB的二級(jí)索引(Secondary Index)會(huì)自動(dòng)補(bǔ)齊主鍵,將主鍵列追加到二級(jí)索引列后面。所以執(zhí)行計(jì)劃就走索引IX_TEST_N1查找就能返回?cái)?shù)據(jù)了。根本不需要書(shū)簽查找(回表查詢)。如果查詢語(yǔ)句多一個(gè)字段或者是SELECT *的話,你就會(huì)看到書(shū)簽查找了。如下所示
到此這篇關(guān)于SQL Server索引查找/掃描沒(méi)有出現(xiàn)key lookup的案例淺析的文章就介紹到這了,更多相關(guān)SQL Server索引查找/掃描內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
sql server字符串非空判斷實(shí)現(xiàn)方法
在使用sql server過(guò)程中會(huì)遇到非空判斷,本文將詳細(xì)介紹sql server字符串非空判斷實(shí)現(xiàn)方法,需要了解的朋友可以參考下2012-12-12SQL SERVER 2012新增函數(shù)之字符串函數(shù)FORMAT詳解
這篇文章主要給大家介紹了關(guān)于SQL SERVER 2012新增函數(shù)之字符串函數(shù)FORMAT的相關(guān)資料,文中通過(guò)實(shí)例介紹的非常詳細(xì),對(duì)大家具有一定的參考價(jià)值,需要的朋友們下面來(lái)一起看看吧。2017-03-03SQL SERVER遷移之更換磁盤(pán)文件夾的完整步驟
這篇文章主要給大家介紹了關(guān)于SQL SERVER遷移之更換磁盤(pán)文件夾的完整步驟,文中通過(guò)圖文介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2020-10-10SQL Server誤區(qū)30日談 第10天 數(shù)據(jù)庫(kù)鏡像在故障發(fā)生后 馬上就能發(fā)現(xiàn)
市面上大肆宣傳數(shù)據(jù)庫(kù)鏡像技術(shù)可以在故障發(fā)生后,立即檢測(cè)到錯(cuò)誤并進(jìn)行故障轉(zhuǎn)移2013-01-01sqlserver中根據(jù)字符分割字符串的最好的寫(xiě)法分享
因數(shù)據(jù)庫(kù)中保存的是以,號(hào)分隔的數(shù)據(jù),需要在界面上以表格的方式顯示出來(lái)。特想出以下方法2012-05-05SQL Server計(jì)算兩個(gè)時(shí)間相差的示例代碼
在SQL Server中,處理時(shí)間數(shù)據(jù)并計(jì)算時(shí)間差值是常見(jiàn)的需求,SQL Server提供了一系列函數(shù)來(lái)幫助我們完成這些操作,本文給大家介紹了SQL Server計(jì)算兩個(gè)時(shí)間相差的方法,需要的朋友可以參考下2024-10-10SqlServer將查詢結(jié)果轉(zhuǎn)換為XML和JSON
這篇文章主要介紹了SqlServer將查詢結(jié)果轉(zhuǎn)換為XML和JSON的相關(guān)資料,需要的朋友可以參考下2017-07-07卸載VS2011 Developer Preview后Sql Server2008&nbs
話說(shuō)上回我為了嘗嘗螃蟹的味道而裝了 VS2011 Developer Preview,但是裝完后立馬卸載掉了,原因是這家伙的安裝目錄位置沒(méi)用,我設(shè)置到D盤(pán)的但是裝完后D盤(pán)的文件夾只有一百多M,而足足8G+的空間是在C盤(pán)上消耗的。2011-11-11SQL Server中Check約束的學(xué)習(xí)教程
這篇文章主要介紹了SQL Server中Check約束的學(xué)習(xí)教程,包括對(duì)啟用Check約束來(lái)提升性能的介紹,需要的朋友可以參考下2015-12-12