mssql 建立索引第1/2頁
更新時間:2009年04月09日 00:33:49 作者:
假設(shè)你想找到本書中的某一個句子。你可以一頁一頁地逐頁搜索,但這會花很多時間。而通過使用本書的索引,你可以很快地找到你要搜索的主題。
表的索引與附在一本書后面的索引非常相似。它可以極大地提高查詢的速度。對一個較大的表來說,通過加索引,一個通常要花費幾個小時來完成的查詢只要幾分鐘就可以完成。因此沒有理由對需要頻繁查詢的表增加索引。
注意:
當(dāng)你的內(nèi)存容量或硬盤空間不足時,也許你不想給一個表增加索引。對于包含索引的數(shù)據(jù)庫,SQL Sever需要一個可觀的額外空間。例如,要建立一個聚簇索引,需要大約1.2倍于數(shù)據(jù)大小的空間。要看一看一個表的索引在數(shù)據(jù)庫中所占的空間大小,你可以使用系統(tǒng)存儲過程sp_spaceused,對象名指定為被索引的表名。
聚簇索引和非聚簇索引
假設(shè)你已經(jīng)通過本書的索引找到了一個句子所在的頁碼。一旦已經(jīng)知道了頁碼后,你很可能漫無目的翻尋這本書,直至找到正確的頁碼。通過隨機的翻尋,你最終可以到達正確的頁碼。但是,有一種找到頁碼的更有效的方法。
首先,把書翻到大概一半的地方,如果要找的頁碼比半本書處的頁碼小,就書翻到四分之一處,否則,就把書翻到四分之三的地方。通過這種方法,你可以繼續(xù)把書分成更小的部分,直至找到正確的頁碼附近。這是找到書頁的非常有效的一種方法。
SQL Sever的表索引以類似的方式工作。一個表索引由一組頁組成,這些頁構(gòu)成了一個樹形結(jié)構(gòu)。根頁通過指向另外兩個頁,把一個表的記錄從邏輯上分成和兩個部分。而根頁所指向的兩個頁又分別把記錄分割成更小的部分。每個頁都把記錄分成更小的分割,直至到達葉級頁。
索引有兩種類型:聚簇索引和非聚簇索引。在聚簇索引中,索引樹的葉級頁包含實際的數(shù)據(jù):記錄的索引順序與物理順序相同。在非聚簇索引中,葉級頁指向表中的記錄:記錄的物理順序與邏輯順序沒有必然的聯(lián)系。
聚簇索引非常象目錄表,目錄表的順序與實際的頁碼順序是一致的。非聚簇索引則更象書的標準索引表,索引表中的順序通常與實際的頁碼順序是不一致的。一本書也許有多個索引。例如,它也許同時有主題索引和作者索引。同樣,一個表可以有多個非聚簇索引。
通常情況下,你使用的是聚簇索引,但是你應(yīng)該對兩種類型索引的優(yōu)缺點都有所理解。
每個表只能有一個聚簇索引,因為一個表中的記錄只能以一種物理順序存放。通常你要對一個表按照標識字段建立聚簇索引。但是,你也可以對其它類型的字段建立聚簇索引,如字符型,數(shù)值型和日期時間型字段。
從建立了聚簇索引的表中取出數(shù)據(jù)要比建立了非聚簇索引的表快。當(dāng)你需要取出一定范圍內(nèi)的數(shù)據(jù)時,用聚簇索引也比用非聚簇索引好。例如,假設(shè)你用一個表來記錄訪問者在你網(wǎng)點上的活動。如果你想取出在一定時間段內(nèi)的登錄信息,你應(yīng)該對這個表的DATETIME型字段建立聚簇索引。
對聚簇索引的主要限制是每個表只能建立一個聚簇索引。但是,一個表可以有不止一個非聚簇索引。實際上,對每個表你最多可以建立249個非聚簇索引。你也可以對一個表同時建立聚簇索引和非聚簇索引。
假如你不僅想根據(jù)日期,而且想根據(jù)用戶名從你的網(wǎng)點活動日志中取數(shù)據(jù)。在這種情況下,同時建立一個聚簇索引和非聚簇索引是有效的。你可以對日期時間字段建立聚簇索引,對用戶名字段建立非聚簇索引。如果你發(fā)現(xiàn)你需要更多的索引方式,你可以增加更多的非聚簇索引。
非聚簇索引需要大量的硬盤空間和內(nèi)存。另外,雖然非聚簇索引可以提高從表中取數(shù)據(jù)的速度,它也會降低向表中插入和更新數(shù)據(jù)的速度。每當(dāng)你改變了一個建立了非聚簇索引的表中的數(shù)據(jù)時,必須同時更新索引。因此你對一個表建立非聚簇索引時要慎重考慮。如果你預(yù)計一個表需要頻繁地更新數(shù)據(jù),那么不要對它建立太多非聚簇索引。另外,如果硬盤和內(nèi)存空間有限,也應(yīng)該限制使用非聚簇索引的數(shù)量。
索引屬性
這兩種類型的索引都有兩個重要屬性:你可以用兩者中任一種類型同時對多個字段建立索引(復(fù)合索引);兩種類型的索引都可以指定為唯一索引。
你可以對多個字段建立一個復(fù)合索引,甚至是復(fù)合的聚簇索引。假如有一個表記錄了你的網(wǎng)點訪問者的姓和名字。如果你希望根據(jù)完整姓名從表中取數(shù)據(jù),你需要建立一個同時對姓字段和名字字段進行的索引。這和分別對兩個字段建立單獨的索引是不同的。當(dāng)你希望同時對不止一個字段進行查詢時,你應(yīng)該建立一個對多個字段的索引。如果你希望對各個字段進行分別查詢,你應(yīng)該對各字段建立獨立的索引。
兩種類型的索引都可以被指定為唯一索引。如果對一個字段建立了唯一索引,你將不能向這個字段輸入重復(fù)的值。一個標識字段會自動成為唯一值字段,但你也可以對其它類型的字段建立唯一索引。假設(shè)你用一個表來保存你的網(wǎng)點的用戶密碼,你當(dāng)然不希望兩個用戶有相同的密碼。通過強制一個字段成為唯一值字段,你可以防止這種情況的發(fā)生。
注意:
當(dāng)你的內(nèi)存容量或硬盤空間不足時,也許你不想給一個表增加索引。對于包含索引的數(shù)據(jù)庫,SQL Sever需要一個可觀的額外空間。例如,要建立一個聚簇索引,需要大約1.2倍于數(shù)據(jù)大小的空間。要看一看一個表的索引在數(shù)據(jù)庫中所占的空間大小,你可以使用系統(tǒng)存儲過程sp_spaceused,對象名指定為被索引的表名。
聚簇索引和非聚簇索引
假設(shè)你已經(jīng)通過本書的索引找到了一個句子所在的頁碼。一旦已經(jīng)知道了頁碼后,你很可能漫無目的翻尋這本書,直至找到正確的頁碼。通過隨機的翻尋,你最終可以到達正確的頁碼。但是,有一種找到頁碼的更有效的方法。
首先,把書翻到大概一半的地方,如果要找的頁碼比半本書處的頁碼小,就書翻到四分之一處,否則,就把書翻到四分之三的地方。通過這種方法,你可以繼續(xù)把書分成更小的部分,直至找到正確的頁碼附近。這是找到書頁的非常有效的一種方法。
SQL Sever的表索引以類似的方式工作。一個表索引由一組頁組成,這些頁構(gòu)成了一個樹形結(jié)構(gòu)。根頁通過指向另外兩個頁,把一個表的記錄從邏輯上分成和兩個部分。而根頁所指向的兩個頁又分別把記錄分割成更小的部分。每個頁都把記錄分成更小的分割,直至到達葉級頁。
索引有兩種類型:聚簇索引和非聚簇索引。在聚簇索引中,索引樹的葉級頁包含實際的數(shù)據(jù):記錄的索引順序與物理順序相同。在非聚簇索引中,葉級頁指向表中的記錄:記錄的物理順序與邏輯順序沒有必然的聯(lián)系。
聚簇索引非常象目錄表,目錄表的順序與實際的頁碼順序是一致的。非聚簇索引則更象書的標準索引表,索引表中的順序通常與實際的頁碼順序是不一致的。一本書也許有多個索引。例如,它也許同時有主題索引和作者索引。同樣,一個表可以有多個非聚簇索引。
通常情況下,你使用的是聚簇索引,但是你應(yīng)該對兩種類型索引的優(yōu)缺點都有所理解。
每個表只能有一個聚簇索引,因為一個表中的記錄只能以一種物理順序存放。通常你要對一個表按照標識字段建立聚簇索引。但是,你也可以對其它類型的字段建立聚簇索引,如字符型,數(shù)值型和日期時間型字段。
從建立了聚簇索引的表中取出數(shù)據(jù)要比建立了非聚簇索引的表快。當(dāng)你需要取出一定范圍內(nèi)的數(shù)據(jù)時,用聚簇索引也比用非聚簇索引好。例如,假設(shè)你用一個表來記錄訪問者在你網(wǎng)點上的活動。如果你想取出在一定時間段內(nèi)的登錄信息,你應(yīng)該對這個表的DATETIME型字段建立聚簇索引。
對聚簇索引的主要限制是每個表只能建立一個聚簇索引。但是,一個表可以有不止一個非聚簇索引。實際上,對每個表你最多可以建立249個非聚簇索引。你也可以對一個表同時建立聚簇索引和非聚簇索引。
假如你不僅想根據(jù)日期,而且想根據(jù)用戶名從你的網(wǎng)點活動日志中取數(shù)據(jù)。在這種情況下,同時建立一個聚簇索引和非聚簇索引是有效的。你可以對日期時間字段建立聚簇索引,對用戶名字段建立非聚簇索引。如果你發(fā)現(xiàn)你需要更多的索引方式,你可以增加更多的非聚簇索引。
非聚簇索引需要大量的硬盤空間和內(nèi)存。另外,雖然非聚簇索引可以提高從表中取數(shù)據(jù)的速度,它也會降低向表中插入和更新數(shù)據(jù)的速度。每當(dāng)你改變了一個建立了非聚簇索引的表中的數(shù)據(jù)時,必須同時更新索引。因此你對一個表建立非聚簇索引時要慎重考慮。如果你預(yù)計一個表需要頻繁地更新數(shù)據(jù),那么不要對它建立太多非聚簇索引。另外,如果硬盤和內(nèi)存空間有限,也應(yīng)該限制使用非聚簇索引的數(shù)量。
索引屬性
這兩種類型的索引都有兩個重要屬性:你可以用兩者中任一種類型同時對多個字段建立索引(復(fù)合索引);兩種類型的索引都可以指定為唯一索引。
你可以對多個字段建立一個復(fù)合索引,甚至是復(fù)合的聚簇索引。假如有一個表記錄了你的網(wǎng)點訪問者的姓和名字。如果你希望根據(jù)完整姓名從表中取數(shù)據(jù),你需要建立一個同時對姓字段和名字字段進行的索引。這和分別對兩個字段建立單獨的索引是不同的。當(dāng)你希望同時對不止一個字段進行查詢時,你應(yīng)該建立一個對多個字段的索引。如果你希望對各個字段進行分別查詢,你應(yīng)該對各字段建立獨立的索引。
兩種類型的索引都可以被指定為唯一索引。如果對一個字段建立了唯一索引,你將不能向這個字段輸入重復(fù)的值。一個標識字段會自動成為唯一值字段,但你也可以對其它類型的字段建立唯一索引。假設(shè)你用一個表來保存你的網(wǎng)點的用戶密碼,你當(dāng)然不希望兩個用戶有相同的密碼。通過強制一個字段成為唯一值字段,你可以防止這種情況的發(fā)生。
相關(guān)文章
用非動態(tài)SQL Server SQL語句來對動態(tài)查詢進行執(zhí)行
此文章主要向大家講述的是非動態(tài)SQL ServerSQL語句執(zhí)行動態(tài)查詢,在實際操作中我嘗試在一個存儲過程中,來進行傳遞一系列以逗號劃定界限的值,來對結(jié)果集進行限制。但是無論什么時候,我在IN子句中使用變量,都會得到錯誤信息2017-06-06mssql無數(shù)據(jù)庫日志文件恢復(fù)數(shù)據(jù)庫的方法
因各種原因我們需要注意恢復(fù)數(shù)據(jù)庫,如果剛好有沒有數(shù)據(jù)庫日志文件,那就不妨用下面的方法2008-09-09SQL入侵恢復(fù)xp_cmdshell方法總結(jié)
恢復(fù)xp_cmdshell SQL Server阻止了對組件 'xp_cmdshell' 的過程'sys.xp_cmdshell' 啟用2010-08-08淺述SQL Server的語句類別 數(shù)據(jù)庫范式 系統(tǒng)數(shù)據(jù)庫組成
本文著重講解了SQL語句的組成以及數(shù)據(jù)庫的三個范式,對系統(tǒng)數(shù)據(jù)庫的組成進行簡短的介紹。有興趣的朋友可以看下2016-12-12SQLServer 數(shù)據(jù)庫備份過程中經(jīng)常遇到的九種情況
SQLServer 數(shù)據(jù)庫備份過程中經(jīng)常遇到各種問題,大家可以參照下面的問題,來分析下,快速的解決問題。2009-07-07sqlserver利用存儲過程去除重復(fù)行的sql語句
以前弄過類似,去除相同信息的方法,現(xiàn)在找不到了,不過今天又花一些時間給弄出來了,記錄一下2010-06-06