如何在SQL Sever中建立索引?

來源:互聯網
上載者:User

建立索引

假設你想找到本書中的某一個句子。你可以一頁一頁地逐頁搜尋,但這會花很多時間。而通過使用本書的索引,你可以很快地找到你要搜尋的主題。

表的索引與附在一本書後面的索引非常相似。它可以極大地提高查詢的速度。對一個較大的表來說,通過加索引,一個通常要花費幾個小時來完成的查詢只要幾分鐘就可以完成。因此沒有理由對需要頻繁查詢的表增加索引。

注意:

當你的記憶體容量或硬碟空間不足時,也許你不想給一個表增加索引。對於包含索引的資料庫,SQL
Sever需要一個可觀的額外空間。例如,要建立一個聚簇索引,需要大約1.2倍於資料大小的空間。要看一看一個表的索引在資料庫中所佔的空間大小,你可
以使用系統預存程序sp_spaceused,對象名指定為被索引的表名。

聚簇索引和非聚簇索引

假設你已經通過本書的索引找到了一個句子所在的頁碼。一旦已經知道了頁碼後,你很可能漫無目的翻尋這本書,直至找到正確的頁碼。通過隨機的翻尋,你最終可以到達正確的頁碼。但是,有一種找到頁碼的更有效方法。

首先,把書翻到大概一半的地方,如果要找的頁碼比半本書處的頁碼小,就書翻到四分之一處,否則,就把書翻到四分之三的地方。通過這種方法,你可以繼續把書分成更小的部分,直至找到正確的頁碼附近。這是找到書頁的非常有效一種方法。

SQL Sever的表索引以類似的方式工作。一個表索引由一組頁組成,這些頁構成了一個樹形結構。根頁通過指向另外兩個頁,把一個表的記錄從邏輯上分成和兩個部分。而根頁所指向的兩個頁又分別把記錄分割成更小的部分。每個頁都把記錄分成更小的分割,直至到達葉級頁。

索引有兩種類型:聚簇索引和非聚簇索引。在聚簇索引中,索引樹的葉級頁包含實際的資料:記錄的索引順序與物理順序相同。在非聚簇索引中,葉級頁指向表中的記錄:記錄的物理順序與邏輯順序沒有必然的聯絡。

聚簇索引非常象目錄表,目錄表的順序與實際的頁碼順序是一致的。非聚簇索引則更象書的標準索引表,索引表中的順序通常與實際的頁碼順序是不一致的。一本書也許有多個索引。例如,它也許同時有主題索引和作者索引。同樣,一個表可以有多個非聚簇索引。

通常情況下,你使用的是聚簇索引,但是你應該對兩種類型索引的優缺點都有所理解。

每個表只能有一個聚簇索引,因為一個表中的記錄只能以一種物理順序存放。通常你要對一個表按照識別欄位建立聚簇索引。但是,你也可以對其它類型的欄位建立聚簇索引,如字元型,數值型和日期時間型欄位。

從建立了聚簇索引的表中取出資料要比建立了非聚簇索引的錶快。當你需要取出一定範圍內的資料時,用聚簇索引也比用非聚簇索引好。例如,假設你用一個
表來記錄訪問者在你網點上的活動。如果你想取出在一定時間段內的登入資訊,你應該對這個表的DATETIME型欄位建立聚簇索引。

對聚簇索引的主要限制是每個表只能建立一個聚簇索引。但是,一個表可以有不止一個非聚簇索引。實際上,對每個表你最多可以建立249個非聚簇索引。你也可以對一個表同時建立聚簇索引和非聚簇索引。

假如你不僅想根據日期,而且想根據使用者名稱從你的網點活動紀錄中取資料。在這種情況下,同時建立一個聚簇索引和非聚簇索引是有效。你可以對日期時間欄位建立聚簇索引,對使用者名稱欄位建立非聚簇索引。如果你發現你需要更多的索引方式,你可以增加更多的非聚簇索引。

非聚簇索引需要大量的硬碟空間和記憶體。另外,雖然非聚簇索引可以提高從表中
取資料的速度,它也會降低向表中插入和更新資料的速度。每當你改變了一個建立了非聚簇索引的表中的資料時,必須同時更新索引。因此你對一個表建立非聚簇索
引時要謹慎考慮。如果你預計一個表需要頻繁地更新資料,那麼不要對它建立太多非聚簇索引。另外,如果硬碟和記憶體空間有限,也應該限制使用非聚簇索引的數
量。

索引屬性

這兩種類型的索引都有兩個重要屬性:你可以用兩者中任一種類型同時對多個欄位建立索引(複合索引);兩種類型的索引都可以指定為唯一索引。

你可以對多個欄位建立一個複合索引,甚至是複合的聚簇索引。假如有一個表記錄了你的網點訪問者的姓和名字。如果你希望根據完整姓名從表中取資料,你
需要建立一個同時對姓欄位和名字欄位進行的索引。這和分別對兩個欄位建立單獨的索引是不同的。當你希望同時對不止一個欄位進行查詢時,你應該建立一個對多
個欄位的索引。如果你希望對各個欄位進行分別查詢,你應該對各欄位建立獨立的索引。

兩種類型的索引都可以被指定為唯一索引。如果對一個欄位建立了唯一索引,你將不能向這個欄位輸入重複的值。一個識別欄位會自動成為唯一值欄位,但你
也可以對其它類型的欄位建立唯一索引。假設你用一個表來儲存你的網點的使用者密碼,你當然不希望兩個使用者有相同的密碼。通過強制一個欄位成為唯一值欄位,你
可以防止這種情況的發生。
用SQL建立索引

為了給一個表建立索引,啟動工作列SQL Sever程式組中的ISQL/w程式。進入查詢時段後,輸入下面的語句:

CREATE INDEX mycolumn_index ON mytable (myclumn)

這個語句建立了一個名為mycolumn_index的索引。你可以給一個索引起任何名字,但你應該在索引名中包含所索引的欄位名,這對你將來弄清楚建立該索引的意圖是有協助的。

注意:

在本書中你執行任何SQL語句,都會收到如下的資訊:

This command did not return data,and it did not return any rows

這說明該語句執行成功了。

索引mycolumn_index對錶mytable的mycolumn欄位進行。這是個非聚簇索引,也是個非唯一索引。(這是一個索引的預設屬性)

如果你需要改變一個索引的類型,你必須刪除原來的索引並重建 一個。建立了一個索引後,你可以用下面的SQL語句刪除它:

DROP INDEX mytable.mycolumn_index

注意在DROP INDEX 語句中你要包含表的名字。在這個例子中,你刪除的索引是mycolumn_index,它是表mytable的索引。

要建立一個聚簇索引,可以使用關鍵字CLUSTERED。)記住一個表只能有一個聚簇索引。(這裡有一個如何對一個表建立聚簇索引的例子:

CREATE CLUSTERED INDEX mycolumn_clust_index ON mytable(mycolumn)

如果表中有重複的記錄,當你試圖用這個語句建立索引時,會出現錯誤。但是有重複記錄的表也可以建立索引;你只要使用關鍵字ALLOW_DUP_ROW把這一點告訴SQL Sever即可:

CREATE CLUSTERED INDEX mycolumn_cindex ON mytable(mycolumn)

WITH ALLOW_DUP_ROW

這個語句建立了一個允許重複記錄的聚簇索引。你應該盡量避免在一個表中出現重複記錄,但是,如果已經出現了,你可以使用這種方法。

要對一個表建立唯一索引,可以使用關鍵字UNIQUE。對聚簇索引和非聚簇索引都可以使用這個關鍵字。這裡有一個例子:

CREATE UNIQUE COUSTERED INDEX myclumn_cindex ON mytable(mycolumn)

這是你將經常使用的索引建立語句。無論何時,只要可以,你應該盡量對一個對一個表建立唯一聚簇索引來增強查詢操作。

最後,要建立一個對多個欄位的索引──複合索引──在索引建立語句中同時包含多個欄位名。下面的例子對firstname和lastname兩個欄位建立索引:

CREATE INDEX name_index ON username(firstname,lastname)

這個例子對兩個欄位建立了單個索引。在一個複合索引中,你最多可以對16個欄位進行索引。

用交易管理員建立索引

用交易管理員建立索引比用SQL語句容易的多。使用交易管理員,你可以看到已經建立的索引的列表,並可以通過圖形介面選擇索引選項。

使用交易管理員你可以用兩種方式建立索引:使用Manage Tables視窗或使用Manage Indexes視窗。

要用Manage Tables 視窗建立一個新索引,單擊按鈕Advanced Options(它看起來象一個前面有一加號的表)。這樣就開啟了Advanced Options對話方塊。這個對話方塊有一部分標名為Primary Key(見圖11.1)。

圖11。1

要建立一個新索引,從下拉式清單中選擇你想對之建立索引的欄位名。如果你想建立一個對多欄位的索引,你可以選擇多個欄位名。你還可以選擇索引是聚簇的還是非聚簇的。在儲存表資訊後,索引會自動被建立。在Manage Tables視窗中的欄位名旁邊,會出現一把鑰匙。

你已經為你的表建立了“主索引”。主索引必須對不包含空值的欄位建立。另外,主索引強制一個欄位成為唯一值欄位。

要建立沒有這些限制的索引,你需要使用Manage Indexes視窗。從菜單中選擇Manage|Indexes,開啟Manage
Indexes 視窗。在Manage Indexes
視窗中,你可以通過下拉框選擇表和特定的索引。(見圖11.2)。要建立一個新索引,從Index下拉框中選擇New
Index.,然後就可以選擇要對之建立索引的欄位。單擊按鈕Add,把欄位加人到索引中。

圖11。2

你可以為你的索引選擇許多不同的選項。例如,你可以選擇該索引是聚簇的還是非聚簇的。你還可以指定該索引為唯一索引。設計好索引後,單擊按鈕Build,建立該索引。

注意:

唯一索引是指該欄位不能有重複的值,而不是只能建立這一個索引。

相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在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.