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

