1、索引是甚么
索引是與表或視圖關(guān)聯(lián)的磁盤上結(jié)構(gòu),可以加快從表或視圖中檢索行的速度。索引包括由表或視圖中的1列或多列生成的鍵。這些鍵存儲(chǔ)在1個(gè)結(jié)構(gòu)(B 樹)中,使 SQL Server 可以快速有效地查找與鍵值關(guān)聯(lián)的行。
> 1.1表或視圖可以包括以下類型的索引:
聚集索引和非聚集索引都可以是唯1的。這意味著任何兩行都不能有相同的索引鍵值。另外,索引也能夠不是唯1的,即多行可以同享同1鍵值。
每當(dāng)修改了表數(shù)據(jù)后,都會(huì)自動(dòng)保護(hù)表或視圖的索引。
> 1.2索引和束縛
對(duì)表列定義了 PRIMARY KEY 束縛和 UNIQUE 束縛時(shí),會(huì)自動(dòng)創(chuàng)建索引。例如,如果創(chuàng)建了表并將1個(gè)特定列標(biāo)識(shí)為主鍵,則 數(shù)據(jù)庫引擎自動(dòng)對(duì)該列創(chuàng)建 PRIMARY KEY 束縛和索引。有關(guān)詳細(xì)信息,請(qǐng)參閱創(chuàng)建索引(數(shù)據(jù)庫引擎)。
2、索引有甚么用
與書中的索引1樣,數(shù)據(jù)庫中的索引使您可以快速找到表或索引視圖中的特定信息。索引包括從表或視圖中1個(gè)或多個(gè)列生成的鍵,和映照到指定數(shù)據(jù)的存儲(chǔ)位置的指針。通過創(chuàng)建設(shè)計(jì)良好的索引以支持查詢,可以顯著提高數(shù)據(jù)庫查詢和利用程序的性能。索引可以減少為返回查詢結(jié)果集而必須讀取的數(shù)據(jù)量。索引還可以強(qiáng)迫表中的行具有唯1性,從而確保表數(shù)據(jù)的數(shù)據(jù)完全性。
設(shè)計(jì)良好的索引可以減少磁盤 I/O 操作,并且消耗的系統(tǒng)資源也較少,從而可以提高查詢性能。對(duì)包括 SELECT、UPDATE、DELETE 或 MERGE 語句的各種查詢,索引會(huì)很有用。例如,在 AdventureWorks 數(shù)據(jù)庫中履行的查詢 SELECT Title, HireDate FROM HumanResources.Employee WHERE EmployeeID = 250。履行此查詢時(shí),查詢優(yōu)化器評(píng)估可用于檢索數(shù)據(jù)的每一個(gè)方法,然后選擇最有效的方法。可能采取的方法包括掃描表和掃描1個(gè)或多個(gè)索引(如果有)。
掃描表時(shí),查詢優(yōu)化器讀取表中的所有行,并提取滿足查詢條件的行。掃描表會(huì)有許多磁盤 I/O 操作,并占用大量資源。但是,如果查詢的結(jié)果集是占表中較高百分比的行,掃描表會(huì)是最為有效的方法。
查詢優(yōu)化器使用索引時(shí),搜索索引鍵列,查找到查詢所需行的存儲(chǔ)位置,然后從該位置提取匹配行。通常,搜索索引比搜索表要快很多,由于索引與表不同,1般每行包括的列非常少,且行遵守排序順序。
查詢優(yōu)化器在履行查詢時(shí)通常會(huì)選擇最有效的方法。但如果沒有索引,則查詢優(yōu)化器必須掃描表。您的任務(wù)是設(shè)計(jì)并創(chuàng)建最合適您的環(huán)境的索引,以便查詢優(yōu)化器可以從多個(gè)有效的索引當(dāng)選擇。SQL Server 提供的數(shù)據(jù)庫引擎優(yōu)化顧問可以幫助分析數(shù)據(jù)庫環(huán)境并選擇適當(dāng)?shù)乃饕?/p>
3、索引的優(yōu)勢(shì)
第1,通過創(chuàng)建唯1性索引,可以保證數(shù)據(jù)庫表中每行數(shù)據(jù)的唯1性。
第2,可以大大加快 數(shù)據(jù)的檢索速度,這也是創(chuàng)建索引的最主要的緣由。
第3,可以加速表和表之間的連接,特別是在實(shí)現(xiàn)數(shù)據(jù)的參考完全性方面特別成心義。
第4,在使用分組和排序 子句進(jìn)行數(shù)據(jù)檢索時(shí),一樣可以顯著減少查詢中分組和排序的時(shí)間。
第5,通過使用索引,可以在查詢的進(jìn)程中,使用優(yōu)化隱藏器,提高系統(tǒng)的性能。
4、索引既然這么有優(yōu)勢(shì),為何不每列都創(chuàng)建
第1,創(chuàng)建索引和保護(hù)索引要耗費(fèi)時(shí)間,這類時(shí)間隨著數(shù)據(jù) 量的增加而增加。
第2,索引需要占物理空間,除數(shù)據(jù)表占數(shù)據(jù)空間以外,每個(gè)索引還要占1定的物理空間,如果要建立聚簇索引,那末需要的空間就會(huì)更大。
第3,當(dāng)對(duì)表中的數(shù)據(jù)進(jìn)行增加、刪除和修改的時(shí)候,索引也要?jiǎng)討B(tài)的保護(hù),這樣就下降了數(shù)據(jù)的保護(hù)速度。
5、 創(chuàng)建索引的1些策略
一樣,對(duì)有些列不應(yīng)當(dāng)創(chuàng)建索引。
6、創(chuàng)建索引的方法
創(chuàng)建索引有多種方法,這些方法包括直接創(chuàng)建索引的方法和間接創(chuàng)建索引的方法。
間接創(chuàng)建索引,例如在表中定義主鍵束縛或唯1性鍵束縛時(shí),同時(shí)也創(chuàng)建了索引。
雖然,這兩種方法都可以創(chuàng)建索引,但 是,它們創(chuàng)建索引的具體內(nèi)容是有區(qū)分的。
使用CREATE INDEX語句或使用創(chuàng)建索引向?qū)韯?chuàng)建索引,這是最基本的索引創(chuàng)建方式,并且這類方法最具有柔性,可以定制創(chuàng)建出符合自己需要的索引。在使用這類方式 創(chuàng)建索引時(shí),可使用許多選項(xiàng),例如指定數(shù)據(jù)頁的充滿度、進(jìn)行排序、整理統(tǒng)計(jì)信息等,這樣可以優(yōu)化索引。使用這類方法,可以指定索引的類型、唯1性和復(fù)合 性,也就是說,既可以創(chuàng)建聚簇索引,也能夠創(chuàng)建非聚簇索引,既可以在1個(gè)列上創(chuàng)建索引,也能夠在兩個(gè)或兩個(gè)以上的列上創(chuàng)建索引。
通過定義主鍵束縛或唯1性鍵束縛,也能夠間接創(chuàng)建索引。主鍵束縛是1種保持?jǐn)?shù)據(jù)完全性的邏輯,它限制表中的記錄有相同的主鍵記錄。在創(chuàng)建主鍵束縛時(shí),系 統(tǒng)自動(dòng)創(chuàng)建了1個(gè)唯1性的聚簇索引。雖然,在邏輯上,主鍵束縛是1種重要的結(jié)構(gòu),但是,在物理結(jié)構(gòu)上,與主鍵束縛相對(duì)應(yīng)的結(jié)構(gòu)是唯1性的聚簇索引。換句話 說,在物理實(shí)現(xiàn)上,不存在主鍵束縛,而只存在唯1性的聚簇索引。一樣,在創(chuàng)建唯1性鍵束縛時(shí),也同時(shí)創(chuàng)建了索引,這類索引則是唯1性的非聚簇索引。因此, 當(dāng)使用束縛創(chuàng)建索引時(shí),索引的類型和特點(diǎn)基本上都已肯定了,由用戶定制的余地比較小。
當(dāng)在表上定義主鍵或唯1性鍵束縛時(shí),如果表中已有了使用CREATE INDEX語句創(chuàng)建的標(biāo)準(zhǔn)索引時(shí),那末主鍵束縛或唯1性鍵束縛創(chuàng)建的索引覆蓋之前創(chuàng)建的標(biāo)準(zhǔn)索引。也就是說,主鍵束縛或唯1性鍵束縛創(chuàng)建的索引的優(yōu)先 級(jí)高于使用CREATE INDEX語句創(chuàng)建的索引。
7、索引的特點(diǎn)
索引有兩個(gè)特點(diǎn),即唯1性索引和復(fù)合索引。
唯1性索引保證在索引列中的全部數(shù)據(jù)是唯1的,不會(huì)包括冗余數(shù)據(jù)。如果表中已有1個(gè)主鍵束縛或唯1性鍵束縛,那末當(dāng)創(chuàng)建表或修改表時(shí),SQL Server自動(dòng)創(chuàng)建1個(gè)唯1性索引。但是,如果必須保證唯1性,那末應(yīng)當(dāng)創(chuàng)建主鍵束縛或唯1性鍵束縛,而不是創(chuàng)建1個(gè)唯1性索引。當(dāng)創(chuàng)建唯1性索引 時(shí),應(yīng)當(dāng)認(rèn)真斟酌這些規(guī)則:當(dāng)在表中創(chuàng)建主鍵束縛或唯1性鍵束縛時(shí),SQL Server自動(dòng)創(chuàng)建1個(gè)唯1性索引;如果表中已包括有數(shù)據(jù),那末當(dāng)創(chuàng)建索引時(shí),SQL Server檢查表中已有數(shù)據(jù)的冗余性;每當(dāng)使用插入語句插入數(shù)據(jù)或使用修改語句修改數(shù)據(jù)時(shí),SQL Server檢查數(shù)據(jù)的冗余性:如果有冗余值,那末SQL Server取消該語句的履行,并且返回1個(gè)毛病消息;確保表中的每行數(shù)據(jù)都有1個(gè)唯1值,這樣可以確保每個(gè)實(shí)體都可以唯1確認(rèn);只能在可以保證實(shí)體 完全性的列上創(chuàng)建唯1性索引,例如,不能在人事表中的姓名列上創(chuàng)建唯1性索引,由于人們可以有相同的姓名。
復(fù)合索引就是1個(gè)索引創(chuàng)建在兩個(gè)列或多個(gè)列上。在搜索時(shí),當(dāng)兩個(gè)或多個(gè)列作為1個(gè)關(guān)鍵值時(shí),最好在這些列上創(chuàng)建復(fù)合索引。當(dāng)創(chuàng)建復(fù)合索引時(shí),應(yīng)當(dāng)斟酌 這些規(guī)則:最多可以把16個(gè)列合并成1個(gè)單獨(dú)的復(fù)合索引,構(gòu)成復(fù)合索引的列的總長度不能超過900字節(jié),也就是說復(fù)合列的長度不能太長;在復(fù)合索引中,所 有的列必須來自同1個(gè)表中,不能跨表建立復(fù)合列;在復(fù)合索引中,列的排列順序是非常重要的,因此要認(rèn)真排列列的順序,原則上,應(yīng)當(dāng)首先定義最唯1的列,例 如在(COL1,COL2)上的索引與在(COL2,COL1)上的索引是不相同的,由于兩個(gè)索引的列的順序不同;為了使查詢優(yōu)化器使用復(fù)合索引,查詢語 句中的WHERE子句必須參考復(fù)合索引中第1個(gè)列;當(dāng)表中有多個(gè)關(guān)鍵列時(shí),復(fù)合索引是非常有用的;使用復(fù)合索引可以提高查詢性能,減少在1個(gè)表中所創(chuàng)建的 索引數(shù)量。
上一篇 簡單的辦法安裝JDK