在我的博客上,以前我經(jīng)常談到SQL Serverl里的書簽查找,還有它們帶來的很多問題。在今天的文章里,我想從性能角度進(jìn)一步談下書簽查找,還有它們?nèi)绾卫湍阏麄€(gè)SQL Server性能。
書簽查找——反復(fù)循環(huán)
如果你的非聚集索引不是個(gè)覆蓋非聚集索引,SQL Server的查詢優(yōu)化器會(huì)引入書簽查找。對(duì)于從非聚集索引你返回的每一行,SQL Server需要在聚集索引里或堆表里進(jìn)行額外的查找操作。
例如當(dāng)你的的聚集索引包含3層,為了返回必要的信息,對(duì)于每一行,你需要3頁額外的讀取。因此,查詢優(yōu)化器再執(zhí)行計(jì)劃里選擇書簽查找操作,僅在有意義的時(shí)候發(fā)生——基于你查詢的選擇度。下圖展示了有書簽查找操作的執(zhí)行計(jì)劃。
通常人們不會(huì)太關(guān)注書簽查找,因?yàn)樗鼈冎粓?zhí)行幾次。如果你的查詢選擇度太低,查詢優(yōu)化器會(huì)用聚集索引掃描或表掃描運(yùn)算符直接掃描整個(gè)表。但只在SQL Server重用緩存的執(zhí)行計(jì)劃,這個(gè)計(jì)劃是有多次不同運(yùn)行值,包含書簽查找的(基于最初提供的輸入值),因此這個(gè)情況很容易發(fā)生,書簽查找反復(fù)執(zhí)行。