前言
前面幾節(jié)都是講的基礎(chǔ)內(nèi)容,本節(jié)我們講講索引性能優(yōu)化,當(dāng)對(duì)大數(shù)據(jù)進(jìn)行處理時(shí)首先想到的就是索引,一旦遇到這樣的問(wèn)題則手忙腳亂,各種查資料,為何平常不扎實(shí)基本功呢,我們由淺入深,簡(jiǎn)短的內(nèi)容,深入的理解,而非一上來(lái)就把問(wèn)題給框死,立馬給出解決方案,拋出問(wèn)題,再到解決問(wèn)題,你GET了沒(méi)有。
Bookmark Lookup、RID Lookup、Key Lookup定義
一說(shuō)到這三者,如果對(duì)索引研究不深的童鞋估計(jì)是懵逼的,什么玩意,我們姑且將上面三者翻譯為:標(biāo)簽查找、行ID查找、鍵查找。標(biāo)簽查找和鍵查找是一個(gè)意思,在SQL 2005之前叫Key Lookup。怎么解釋?zhuān)绾味x呢?首先我們不看定義,直接看下面一步一步解析,如果你實(shí)在忍不住,請(qǐng)看園友【永紅】的見(jiàn)解,解釋還是非常到位。我們簡(jiǎn)短的說(shuō)明下此三者概念。
在查詢中,我們對(duì)返回的列在查詢條件上若建立了非聚集索引,此時(shí)將可能?chē)L試使用非聚集索引查找,如果返回的列沒(méi)有創(chuàng)建非聚集索引,此時(shí)會(huì)返回到數(shù)據(jù)頁(yè)中去獲取這些列的數(shù)據(jù),即使表中存在聚集索引或者沒(méi)有,都會(huì)返回到表中或者聚集索引中去獲取數(shù)據(jù)。對(duì)于以上場(chǎng)景描述,如果表沒(méi)有創(chuàng)建聚集索引則稱(chēng)為Bookmar Lookup,如果表中沒(méi)有聚集索引但是存在非聚集索引我們稱(chēng)為RID Lookup。看到這里我們就會(huì)想法操作如此耗時(shí),還要返回到基表中去獲取數(shù)據(jù),所以才有了我們本節(jié)來(lái)移除以上三者來(lái)提高查詢性能。接下來(lái)我們一起來(lái)看看。
拋出Bookmark Lookup、RID Lookup、Key Lookup問(wèn)題
我們首先創(chuàng)建如下表
USE TSQL2012 GO CREATE TABLE Sales.Orders ( [orderid] INT, [shipaddress] VARCHAR(100), [shipcity] VARCHAR(100), [shipregion] VARCHAR(100)) GO