程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 數據庫知識 >> 其他數據庫知識 >> MSSQL >> SQL 查詢機能優化 處理書簽查找

SQL 查詢機能優化 處理書簽查找

編輯:MSSQL

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

好了就寫這麼多吧.
  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved