SQL 查詢機能優化 處理書簽查找。本站提示廣大學習愛好者:(SQL 查詢機能優化 處理書簽查找)文章只能為提供參考,不一定能成為您想要的結果。以下是SQL 查詢機能優化 處理書簽查找正文
先來看看甚麼是書簽查找:
當優化器所選擇的非聚簇索引只包括查詢要求的一部門字段時,就須要一個查找(lookup)來檢索其他字段來知足要求。對一個有聚簇索引的表來講是一個鍵查找(key lookup),對一個堆表來講是一個RID查找(RID lookup)。這類查找等於——書簽查找。
書簽查找依據索引的行定位器從表中讀取數據。是以,除索引頁面的邏輯讀取外,還須要數據頁面的邏輯讀取。
從索引的行定位器到從表中讀取數據這之間會發生一些額定的開支,本文就來處理這個開支。
先看下我的測試表構造:
個中可以看出 有一個 聚簇索引 PK_UserID 和一個 非聚簇索引IX_UserName。
看看發生書簽 查找的後果:
select UserName,Gender from dbo.UserInfo where UserName='userN600'
按下面的 SQL 發生履行籌劃 可以看出, 會發生一個書簽查找(Key Lookup),以下圖
假如把下面的 SQL 改寫成
select UserName from dbo.UserInfo where UserName='userN600'
可以看出 書簽查找 沒有了。
本SQL 發生書簽查找的 重要緣由是 本SQL 優化器會選擇 非聚簇索引IX_UserName,來執生SQL 。IX_UserName 索引不包括 Gender 這個字段 因而發生個從索引到 數據表的 一個 查找 即 書簽查找。
處理書簽查找:
辦法1、應用一個 聚簇索引
關於聚簇索引, 索引的葉子頁面和表的數據頁面雷同,是以,當讀取聚簇索引 鍵列的值時,數據引擎可以讀取其它列的值而不須要任何行定位,如許就處理了書簽查找。
關於這句SQL ( select UserName,Gender from dbo.UserInfo where UserName='userN600')處理了書簽查找的方法就是在UserName 上 建聚簇索引 ,由於一個表只要一個聚簇索引 ,這就意味著刪除現有聚簇索引(PK_UserID),將會形成其它從表 中的外鍵束縛 要產生更改,這須要考一些相干的任務,能夠嚴重影響依附於現有聚簇索引的其它查詢。
辦法2、應用一個 籠罩索引
籠罩索引 是在一切為知足SQL 查詢不消達到根本表所需的列 樹立的非聚簇索引。假如查詢碰到一個索引而且完整不須要援用底層數據表,那末 該索引可以被以為是 籠罩索引。
關於這句SQL ( select UserName,Gender from dbo.UserInfo where UserName='userN600') 處理書簽查找的方法就是 在非聚簇索引IX_UserName 裡包括 Gender 字段。
也就是在 建索引時 用INCLUDE 語句,詳細操作以下
用INCLUDE 最好在 以下情形下應用:
1、不願望增長索引鍵的年夜小,然則依然可以建一個 籠罩索引;
2、盤算索引一種不克不及被索引的數據類型(除文本、NTEXT和圖象);
3、曾經跨越了一個索引的症結字列的最年夜數目
辦法3、應用 索引銜接
索引銜接 是應用多個索引之間一個索引穿插來完整籠罩一個查詢。假如籠罩索引變的異常寬,那末便可以斟酌索引銜接。
關於這句SQL ( select UserName,Gender from dbo.UserInfo where UserName='userN600' and Gender=1)可以在 Gender 上 建一個非聚簇索引就好了。
關於這個例 子,能夠 SQL 優化器並沒有同時 選 用非聚簇索引IX_UserName 和 我們新樹立在Gender 上的索引,這時候我們可以告訴 SQL 優化器 同時應用 這個兩上索引,操作以下
select Gender,UserName from UserInfo with(index (IX_Gender,IX_UserName)) where UserName='jins' and Gender=0
好了就寫這麼多吧.