SQL Server 索引和表體繫結構(三)

來源:互聯網
上載者:User

標籤:style   blog   http   os   io   strong   ar   資料   div   

 

轉自:http://www.cnblogs.com/chenmh/p/3785285.html

包含列索引

概述

包含列索引也是非叢集索引,索引結構跟叢集索引結構是一樣,有一點不同的地方就是包含列索引的非鍵列只儲存在葉子節點;包含列索引的列分為鍵列和非鍵列,所謂的非鍵列就是INCLUDE中包含的列,至少需要有一個鍵列,且鍵列和非鍵列不允許重複,非鍵列最多允許1023列(也就是表的最多列-1),由於索引鍵列(不包括非鍵)必須遵守現有索引大小的限制(最大鍵列數為 16,總索引鍵大小為 900 位元組)的要求所以引進了包含列索引。

本文

  • 建立包含列索引

 

----建立表CREATE TABLE [dbo].[Customers](    [custid] [int] IDENTITY(1,1) NOT NULL,    [companyname] [nvarchar](40) NOT NULL,    [contactname] [nvarchar](30) NOT NULL,    [contacttitle] [nvarchar](400) NOT NULL, CONSTRAINT [PK_Customers] PRIMARY KEY CLUSTERED (    [custid] ASC)WITH (PAD_INDEX  = OFF, STATISTICS_NORECOMPUTE  = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS  = ON, ALLOW_PAGE_LOCKS  = ON) ON [PRIMARY]) ON [PRIMARY]----建立包含列索引CREATE NONCLUSTERED INDEX [IX1_Customers] ON [dbo].[Customers] (    [companyname] ASC)INCLUDE ( [contactname])
WITH (STATISTICS_NORECOMPUTE = OFF, SORT_IN_TEMPDB = OFF, IGNORE_DUP_KEY = OFF, DROP_EXISTING = OFF, ONLINE = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) ON [PRIMARY]GO

這裡的鍵列就是:companyname
非鍵列就是:contactname

非鍵列具有下列優點:

    • 它們可以是不允許作為索引鍵列的資料類型。 

    • 在計算索引鍵列數或索引鍵大小時,資料庫引擎不考慮它們。


 

當查詢中的所有列都作為鍵列或非鍵列包含在索引中時,帶有包含性非鍵列的索引可以顯著提高查詢效能。這樣可以實現效能提升,因為查詢最佳化工具可以在索引中找到所有列值;不訪問表或叢集索引資料,從而減少磁碟 I/O 操作。(當索引包含查詢引用的所有列時,它通常稱為“覆蓋查詢”。)

  • 建立覆蓋查詢

 覆蓋查詢就是建立的索引列包含查詢所引用的所有列時

  1. 查詢列都設為鍵列
當我們的SELECT查詢是這樣的SELECT        [companyname]      ,[contactname]      ,[contacttitle]  FROM [chenmh].[dbo].[Customers]  where companyname=‘好孩子‘    ---這時我們選擇將索引列都包含在索引建列中  CREATE NONCLUSTERED INDEX [IX2_Customers] ON [dbo].[Customers] (             [companyname] ASC      ,[contactname] ASC      ,[contacttitle] ASC)WITH (STATISTICS_NORECOMPUTE  = OFF, SORT_IN_TEMPDB = OFF, IGNORE_DUP_KEY = OFF, DROP_EXISTING = OFF, ONLINE = OFF, ALLOW_ROW_LOCKS  = ON, ALLOW_PAGE_LOCKS  = ON) ON [PRIMARY]GO

將會彈出警告:警告! 最大鍵長度為 900 個位元組。索引 ‘IX2_Customers‘ 的最大長度為 940 個位元組。對於某些大值組合,插入/更新操作將失敗。
由於三個欄位都是NVARCHAR欄位類型,每個字元需要 2 個位元組,(40+30+400)*2=940個位元組,大於900位元組,這時我們可以將[contactname] ,[contacttitle]包含在非鍵列中

2.將大資料類型設為非鍵列

 

CREATE NONCLUSTERED INDEX [IX3_Customers] ON [dbo].[Customers] (             [companyname] ASC      )INCLUDE ( [contactname]        ,[contacttitle])WITH (STATISTICS_NORECOMPUTE  = OFF, SORT_IN_TEMPDB = OFF, IGNORE_DUP_KEY = OFF, DROP_EXISTING = OFF, ONLINE = OFF, ALLOW_ROW_LOCKS  = ON, ALLOW_PAGE_LOCKS  = ON) ON [PRIMARY]GO

這時索引鍵大小所佔字元就只有40*2=80個位元組,同時索引也是覆蓋索引,索引的列包含查詢用到的列,當我們查詢資料時直接在索引頁中尋找資料就可以,不需要訪問資料頁,減少磁碟IO,提高效能

 

帶有內含資料行索引準則

設計帶有包含列的非叢集索引時,請考慮下列準則:

    • 在 CREATE INDEX 語句的 INCLUDE 子句中定義非鍵列。
    • 只能對錶或索引檢視表的非叢集索引定義非鍵列。
    • 除 textntext 和 image 之外,允許所有資料類型。
    • 精確或不精確的確定性計算資料行都可以是包含列。有關詳細資料,請參閱為計算資料行建立索引。
    • 與鍵列一樣,只要允許將計算資料行資料類型作為非索引鍵之索引資料行,從 imagentext 和 text 資料類型派生的計算資料行就可以作為非鍵(包含性)列。 
    • 不能同時在 INCLUDE 列表和鍵列列表中指定列名。
    • INCLUDE 列表中的列名不能重複。
列大小準則
    • 必須至少定義一個鍵列。最大非鍵列數為 1023 列。也就是最大的表列數減 1。
    • 索引鍵列(不包括非鍵)必須遵守現有索引大小的限制(最大鍵列數為 16,總索引鍵大小為 900 位元組)。
    • 所有非鍵列的總大小隻受 INCLUDE 子句中所指定列的大小限制;例如,varchar(max) 列限制為 2 GB。
列修改準則

修改已定義為包含列的表列時,要受下列限制:

    • 除非先刪除索引,否則無法從表中刪除非鍵列。
    • 除進行下列更改外,不能對非鍵列進行其他更改: 

      • 將列的為空白性從 NOT NULL 改為 NULL。
      • 增加 varcharnvarchar 或 varbinary 列的長度。
注意事項
  • 鍵列的大小盡量小,有利用提高效率
  • 將用於搜尋和尋找的列為鍵列,鍵列盡量不要包含沒必要的列。(例如上面建立的覆蓋查詢列,雖然companyname+contactname加起來作為鍵列也不會超過900位元組,但是這樣鍵大小就變大了,降低了查詢效率)
  • 避免添加不必要的列。添加過多的索引列(鍵列或非鍵列)會對效能產生下列影響:
    • 一頁上能容納的索引行將更少。這樣會使 I/O 增加並降低緩衝效率。
    • 需要更多的磁碟空間來儲存索引。特別是,將 varchar(max)nvarchar(max)varbinary(max) 或 xml 資料類型添加為非索引鍵之索引資料行會顯著增加磁碟空間要求。這是因為列值被複製到了索引分葉層級。因此,它們既駐留在索引中,也駐留在基表中。
    • 索引維護可能會增加對基礎資料表或索引檢視表執行修改、插入、更新或刪除操作所需的時間

 

總結

   如果您覺得文章對你有協助,活動活動你的手指麻煩給個推薦;這也是對我一種鼓勵,在此表示感謝。

SQL Server 索引和表體繫結構(三)

相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.