数据库索引的作用和优点缺点以及索引的11中用法
為什么要?jiǎng)?chuàng)建索引呢?這是因?yàn)?#xff0c;創(chuàng)建索引可以大大提高系統(tǒng)的性能。?
第一,通過(guò)創(chuàng)建唯一性索引,可以保證數(shù)據(jù)庫(kù)表中每一行數(shù)據(jù)的唯一性。?
第二,可以大大加快 數(shù)據(jù)的檢索速度,這也是創(chuàng)建索引的最主要的原因。?
第三,可以加速表和表之間的連接,特別是在實(shí)現(xiàn)數(shù)據(jù)的參考完整性方面特別有意義。?
第四,在使用分組和排序 子句進(jìn)行數(shù)據(jù)檢索時(shí),同樣可以顯著減少查詢中分組和排序的時(shí)間。?
第五,通過(guò)使用索引,可以在查詢的過(guò)程中,使用優(yōu)化隱藏器,提高系統(tǒng)的性能。
也許會(huì)有人要問(wèn):增加索引有如此多的優(yōu)點(diǎn),為什么不對(duì)表中的每一個(gè)列創(chuàng)建一個(gè)索引呢?這種想法固然有其合理性,然而也有其片面性。雖然,索引有許多優(yōu)點(diǎn), 但是,為表中的每一個(gè)列都增加索引,是非常不明智的。這是因?yàn)?#xff0c;增加索引也有許多不利的一個(gè)方面。
第一,創(chuàng)建索引和維護(hù)索引要耗費(fèi)時(shí)間,這種時(shí)間隨著數(shù)據(jù) 量的增加而增加。?
第二,索引需要占物理空間,除了數(shù)據(jù)表占數(shù)據(jù)空間之外,每一個(gè)索引還要占一定的物理空間,如果要建立聚簇索引,那么需要的空間就會(huì)更大。?
第三,當(dāng)對(duì)表中的數(shù)據(jù)進(jìn)行增加、刪除和修改的時(shí)候,索引也要?jiǎng)討B(tài)的維護(hù),這樣就降低了數(shù)據(jù)的維護(hù)速度。
索引是建立在數(shù)據(jù)庫(kù)表中的某些列的上面。因此,在創(chuàng)建索引的時(shí)候,應(yīng)該仔細(xì)考慮在哪些列上可以創(chuàng)建索引,在哪些列上不能創(chuàng)建索引。一般來(lái)說(shuō),應(yīng)該在這些列上創(chuàng)建索引,例如:
在經(jīng)常需要搜索的列上,可以加快搜索的速度;?
在作為主鍵的列上,強(qiáng)制該列的唯一性和組織表中數(shù)據(jù)的排列結(jié)構(gòu);?
在經(jīng)常用在連接的列上,這 些列主要是一些外鍵,可以加快連接的速度;?
在經(jīng)常需要根據(jù)范圍進(jìn)行搜索的列上創(chuàng)建索引,因?yàn)樗饕呀?jīng)排序,其指定的范圍是連續(xù)的;?
在經(jīng)常需要排序的列上創(chuàng) 建索引,因?yàn)樗饕呀?jīng)排序,這樣查詢可以利用索引的排序,加快排序查詢時(shí)間;?
在經(jīng)常使用在WHERE子句中的列上面創(chuàng)建索引,加快條件的判斷速度。
同樣,對(duì)于有些列不應(yīng)該創(chuàng)建索引。一般來(lái)說(shuō),不應(yīng)該創(chuàng)建索引的的這些列具有下列特點(diǎn):
第一,對(duì)于那些在查詢中很少使用或者參考的列不應(yīng)該創(chuàng)建索引。這是因 為,既然這些列很少使用到,因此有索引或者無(wú)索引,并不能提高查詢速度。相反,由于增加了索引,反而降低了系統(tǒng)的維護(hù)速度和增大了空間需求。?
第二,對(duì)于那 些只有很少數(shù)據(jù)值的列也不應(yīng)該增加索引。這是因?yàn)?#xff0c;由于這些列的取值很少,例如人事表的性別列,在查詢的結(jié)果中,結(jié)果集的數(shù)據(jù)行占了表中數(shù)據(jù)行的很大比 例,即需要在表中搜索的數(shù)據(jù)行的比例很大。增加索引,并不能明顯加快檢索速度。?
第三,對(duì)于那些定義為text, image和bit數(shù)據(jù)類型的列不應(yīng)該增加索引。這是因?yàn)?#xff0c;這些列的數(shù)據(jù)量要么相當(dāng)大,要么取值很少。?
第四,當(dāng)修改性能遠(yuǎn)遠(yuǎn)大于檢索性能時(shí),不應(yīng)該創(chuàng)建索 引。這是因?yàn)?#xff0c;修改性能和檢索性能是互相矛盾的。當(dāng)增加索引時(shí),會(huì)提高檢索性能,但是會(huì)降低修改性能。當(dāng)減少索引時(shí),會(huì)提高修改性能,降低檢索性能。因 此,當(dāng)修改性能遠(yuǎn)遠(yuǎn)大于檢索性能時(shí),不應(yīng)該創(chuàng)建索引。
創(chuàng)建索引的方法和索引的特征?
創(chuàng)建索引的方法?
創(chuàng)建索引有多種方法,這些方法包括直接創(chuàng)建索引的方法和間接創(chuàng)建索引的方法。直接創(chuàng)建索引,例如使用CREATE INDEX語(yǔ)句或者使用創(chuàng)建索引向?qū)?#xff0c;間接創(chuàng)建索引,例如在表中定義主鍵約束或者唯一性鍵約束時(shí),同時(shí)也創(chuàng)建了索引。雖然,這兩種方法都可以創(chuàng)建索引,但 是,它們創(chuàng)建索引的具體內(nèi)容是有區(qū)別的。?
使用CREATE INDEX語(yǔ)句或者使用創(chuàng)建索引向?qū)?lái)創(chuàng)建索引,這是最基本的索引創(chuàng)建方式,并且這種方法最具有柔性,可以定制創(chuàng)建出符合自己需要的索引。在使用這種方式 創(chuàng)建索引時(shí),可以使用許多選項(xiàng),例如指定數(shù)據(jù)頁(yè)的充滿度、進(jìn)行排序、整理統(tǒng)計(jì)信息等,這樣可以優(yōu)化索引。使用這種方法,可以指定索引的類型、唯一性和復(fù)合 性,也就是說(shuō),既可以創(chuàng)建聚簇索引,也可以創(chuàng)建非聚簇索引,既可以在一個(gè)列上創(chuàng)建索引,也可以在兩個(gè)或者兩個(gè)以上的列上創(chuàng)建索引。
通過(guò)定義主鍵約束或者唯一性鍵約束,也可以間接創(chuàng)建索引。主鍵約束是一種保持?jǐn)?shù)據(jù)完整性的邏輯,它限制表中的記錄有相同的主鍵記錄。在創(chuàng)建主鍵約束 時(shí),系 統(tǒng)自動(dòng)創(chuàng)建了一個(gè)唯一性的聚簇索引。雖然,在邏輯上,主鍵約束是一種重要的結(jié)構(gòu),但是,在物理結(jié)構(gòu)上,與主鍵約束相對(duì)應(yīng)的結(jié)構(gòu)是唯一性的聚簇索引。換句話 說(shuō),在物理實(shí)現(xiàn)上,不存在主鍵約束,而只存在唯一性的聚簇索引。同樣,在創(chuàng)建唯一性鍵約束時(shí),也同時(shí)創(chuàng)建了索引,這種索引則是唯一性的非聚簇索引。因此, 當(dāng)使用約束創(chuàng)建索引時(shí),索引的類型和特征基本上都已經(jīng)確定了,由用戶定制的余地比較小。
當(dāng)在表上定義主鍵或者唯一性鍵約束時(shí),如果表中已經(jīng)有了使用CREATE INDEX語(yǔ)句創(chuàng)建的標(biāo)準(zhǔn)索引時(shí),那么主鍵約束或者唯一性鍵約束創(chuàng)建的索引覆蓋以前創(chuàng)建的標(biāo)準(zhǔn)索引。也就是說(shuō),主鍵約束或者唯一性鍵約束創(chuàng)建的索引的優(yōu)先 級(jí)高于使用CREATE INDEX語(yǔ)句創(chuàng)建的索引。
索引的特征?
索引有兩個(gè)特征,即唯一性索引和復(fù)合索引。?
唯一性索引保證在索引列中的全部數(shù)據(jù)是唯一的,不會(huì)包含冗余數(shù)據(jù)。如果表中已經(jīng)有一個(gè)主鍵約束或者唯一性鍵約束,那么當(dāng)創(chuàng)建表或者修改表時(shí),SQL Server自動(dòng)創(chuàng)建一個(gè)唯一性索引。然而,如果必須保證唯一性,那么應(yīng)該創(chuàng)建主鍵約束或者唯一性鍵約束,而不是創(chuàng)建一個(gè)唯一性索引。當(dāng)創(chuàng)建唯一性索引 時(shí),應(yīng)該認(rèn)真考慮這些規(guī)則:當(dāng)在表中創(chuàng)建主鍵約束或者唯一性鍵約束時(shí),SQL Server自動(dòng)創(chuàng)建一個(gè)唯一性索引;如果表中已經(jīng)包含有數(shù)據(jù),那么當(dāng)創(chuàng)建索引時(shí),SQL Server檢查表中已有數(shù)據(jù)的冗余性;每當(dāng)使用插入語(yǔ)句插入數(shù)據(jù)或者使用修改語(yǔ)句修改數(shù)據(jù)時(shí),SQL Server檢查數(shù)據(jù)的冗余性:如果有冗余值,那么SQL Server取消該語(yǔ)句的執(zhí)行,并且返回一個(gè)錯(cuò)誤消息;確保表中的每一行數(shù)據(jù)都有一個(gè)唯一值,這樣可以確保每一個(gè)實(shí)體都可以唯一確認(rèn);只能在可以保證實(shí)體 完整性的列上創(chuàng)建唯一性索引,例如,不能在人事表中的姓名列上創(chuàng)建唯一性索引,因?yàn)槿藗兛梢杂邢嗤男彰?/span>
復(fù)合索引就是一個(gè)索引創(chuàng)建在兩個(gè)列或者多個(gè)列上。在搜索時(shí),當(dāng)兩個(gè)或者多個(gè)列作為一個(gè)關(guān)鍵值時(shí),最好在這些列上創(chuàng)建復(fù)合索引。當(dāng)創(chuàng)建復(fù)合索引時(shí),應(yīng) 該考慮 這些規(guī)則:最多可以把16個(gè)列合并成一個(gè)單獨(dú)的復(fù)合索引,構(gòu)成復(fù)合索引的列的總長(zhǎng)度不能超過(guò)900字節(jié),也就是說(shuō)復(fù)合列的長(zhǎng)度不能太長(zhǎng);在復(fù)合索引中,所 有的列必須來(lái)自同一個(gè)表中,不能跨表建立復(fù)合列;在復(fù)合索引中,列的排列順序是非常重要的,因此要認(rèn)真排列列的順序,原則上,應(yīng)該首先定義最唯一的列,例 如在(COL1,COL2)上的索引與在(COL2,COL1)上的索引是不相同的,因?yàn)閮蓚€(gè)索引的列的順序不同;為了使查詢優(yōu)化器使用復(fù)合索引,查詢語(yǔ) 句中的WHERE子句必須參考復(fù)合索引中第一個(gè)列;當(dāng)表中有多個(gè)關(guān)鍵列時(shí),復(fù)合索引是非常有用的;使用復(fù)合索引可以提高查詢性能,減少在一個(gè)表中所創(chuàng)建的 索引數(shù)量。
索引是個(gè)既穩(wěn)定又開放的信息結(jié)構(gòu),它有十一種功能。
1 分解功能
把文獻(xiàn)中的資料單元(如篇名、機(jī)構(gòu)、短語(yǔ)、概念、物名、地名、書名、人名、字詞、符號(hào)等)一一分解,這就是索引的分解功能。它是索引工作的起跑線和索引編纂的基礎(chǔ),沒(méi)有對(duì)文獻(xiàn)內(nèi)容的這種分解功能,就沒(méi)有索引。
過(guò)去有些反對(duì)索引的人說(shuō),索引是把古人的著書“凌遲碎割”。他們對(duì)索引法的反對(duì),實(shí)出于對(duì)流傳已久的那種落后的皓首窮經(jīng)的陋習(xí)的偏愛(ài)和對(duì)新的治學(xué)方 法的無(wú)知,洪業(yè)曾鄙視他們?yōu)榕P于涸轍的鮒魚,以升斗之水濟(jì)命,而不知西江水之可羨。雖然如此,但他們所謂的索引是把古人著書“凌遲碎割”的形象說(shuō)法,卻從 反面十分正確地道破了索引的分解功能。
分解功能是索引作用于文獻(xiàn)的特殊功能,是它和其他檢索工作不同之處。
2 梳理功能
每種文獻(xiàn)都包容著許多不同性質(zhì)的資料單元,它們?cè)谖墨I(xiàn)中基本呈無(wú)序的狀態(tài)。把這些無(wú)序狀態(tài)的資料單元按外表特征或內(nèi)容性質(zhì)進(jìn)行各歸其類的整理,這就 是索引的梳理功能。章學(xué)誠(chéng)早就發(fā)現(xiàn)了這種功能,他在給《族孫守一論史表》信中要求其在治二十四史年表時(shí)一并把廿二史列傳中的人名編成索引,兩者互為經(jīng)緯, 這樣便可使考古之士,于紛如亂絲之資料中,忽得梳通櫛理。
梳理功能是索引分解的后繼。如果只有分解功能而沒(méi)有梳理的功能,那么分解功能就沒(méi)有價(jià)值。
梳理是對(duì)資料單元的初分。如是字序,只要按筆劃或音序歸類即可;如是類序只要按大類歸納即可。就像小姑娘梳頭,先把長(zhǎng)發(fā)梳順,而編什么辮子或梳什么發(fā)型則是下一步的要求了。
3 組合功能
把梳理后的資料單元按照分類的要求,嚴(yán)密地組織它們的類別層次以及類目下的專題和同類目下款目的序列關(guān)系;或按字序的要求,嚴(yán)密地把標(biāo)目的結(jié)構(gòu)正裝 或倒裝、考慮限定詞對(duì)標(biāo)目的限定和修飾的級(jí)數(shù)、或考慮字序和類序相結(jié)合的可能。此外,不論是類序或字序都要考慮參照系統(tǒng)的建立方案,使相關(guān)款目形成網(wǎng)絡(luò), 使用戶檢索的眼界得以拓寬。這些,都是索引的組合功能。
過(guò)去,國(guó)外的同行曾把圣經(jīng)的頁(yè)邊索引以“串珠”命名;我國(guó)有人曾把本草的方劑編成索引,以“針線”命名,“串珠”和“針線”是索引組合功能很形象的描繪。它使文獻(xiàn)資料單元成為一串串的明珠,成為被針線貫穿起來(lái)的資料單元的珍品。
4 結(jié)網(wǎng)功能
對(duì)某個(gè)領(lǐng)域的文獻(xiàn)進(jìn)行有計(jì)劃的索引編纂,利用類型的結(jié)構(gòu)從各種不同的角度和層次對(duì)這些文獻(xiàn)的內(nèi)容進(jìn)行縱橫交錯(cuò)和多維的揭示和組合,使之形成一個(gè)檢索這些文獻(xiàn)中的各種不同性質(zhì)的資料單元的網(wǎng)絡(luò)。這就是索引的結(jié)網(wǎng)功能。
由“主表”和“詞族索引”、“范疇索引”、“英漢對(duì)照索引”等所組成的《漢語(yǔ)主題詞表》是由幾種不同性質(zhì)的索引構(gòu)建的一個(gè)主題詞間的聯(lián)系、辨析主題 詞詞義和被標(biāo)引的文獻(xiàn)主題概念是否精確的一個(gè)隱含的語(yǔ)義網(wǎng)絡(luò),它對(duì)文獻(xiàn)中的資料單元產(chǎn)生族性檢索和擴(kuò)大檢索途徑的作用。這個(gè)網(wǎng)絡(luò)的結(jié)構(gòu)和作用就是運(yùn)用索引 結(jié)網(wǎng)功能的一個(gè)范例。
《古今圖書集成》囊括了清初以前絕大部分的文獻(xiàn),是我國(guó)現(xiàn)存最大的一部類書,廣西大學(xué)林仲湘等根據(jù)它的特點(diǎn),分別編了經(jīng)線索引、緯線索引、圖表索 引、人物傳記索引、職方典匯考引和禽蟲草木三典釋名索引,從該書的各級(jí)類目和內(nèi)容等不同角度交叉編結(jié)了一個(gè)嚴(yán)密的揭示網(wǎng)絡(luò),這又是索引結(jié)網(wǎng)功能的具體運(yùn)用 的例證。
5 揭示功能
分解功能只是客觀地對(duì)文獻(xiàn)進(jìn)行解剖,而揭示功能有較強(qiáng)的目的性,它最常出現(xiàn)的是按專業(yè)的需要挑選某些資料單元。
在主題索引的編制中,主題概念的分析和主題詞的選用,包括對(duì)隱性主題的析出是這種功能的體現(xiàn)。
各種專題索引或各種專業(yè)的文摘索引也是索引揭示功能的運(yùn)用。清朝徐克祺稱贊蔡烈先的《本草萬(wàn)方針線》為鏡考、為燭照,這是對(duì)索引揭示功能很生動(dòng)的形容。
6 鑒別功能
文獻(xiàn)是作者思維的物化,包含了作者用以施展其聰明才智的特有的言語(yǔ)軌跡及其思想氣質(zhì)。在文獻(xiàn)的出版史中,出于各種不同的動(dòng)機(jī)和原因,真?zhèn)沃鳢B出, 為杜偽辨真,不少人引經(jīng)據(jù)典,注疏考證,一字之微,動(dòng)千萬(wàn)言,甚至引發(fā)了??睂W(xué)的出現(xiàn)。近年來(lái)又產(chǎn)生了利用索引進(jìn)行鑒別的方法,通過(guò)逐字索引分解被鑒別的 文獻(xiàn),即同時(shí)從兩種版本中分析作者用字(詞)的規(guī)律和頻率以甄別其真?zhèn)巍?/span>
英國(guó)的女研究學(xué)家凱洛萊因·斯彼琴曾對(duì)莎士比亞的劇作進(jìn)行過(guò)有趣的用詞統(tǒng)計(jì)和分析,她發(fā)現(xiàn),莎氏使用的許多詩(shī)意的語(yǔ)言都和大自然以及鄉(xiāng)村生活有關(guān)。 又有人在研究司馬遷的《史記·貨殖列傳》時(shí),發(fā)現(xiàn)這篇不到5000字的文章竟使用49次“富”字,由此得出,致“富”是這篇論文的主題。這些事例證明通過(guò) 對(duì)文獻(xiàn)中用詞的解剖可以發(fā)現(xiàn)作者的特有氣質(zhì)和語(yǔ)言習(xí)慣,索引可利用這種潛在的規(guī)律辨析文獻(xiàn)的真?zhèn)巍?/span>
7 追蹤功能
索引像只嗅覺(jué)靈敏的警犬一樣能追蹤各種領(lǐng)域的事物在文獻(xiàn)中留下來(lái)的痕跡。
一部舊時(shí)代報(bào)紙的索引,能追蹤那個(gè)時(shí)代的重大歷史事件,并清晰地再現(xiàn)這些重大的歷史事件脈絡(luò);一部類書的索引,能追蹤許多名人的各方面的成就和言行;一種專業(yè)期刊的刊后索引,能追蹤當(dāng)年該專業(yè)學(xué)科研究的動(dòng)態(tài);一部跨多年度的報(bào)刊回溯索引,就是一部多功能的追蹤記錄。
追蹤,是索引的功能之一。
8 導(dǎo)航功能
導(dǎo)航就是指引,它帶有較強(qiáng)的評(píng)價(jià)取向,索引具有這種功能。
過(guò)去,我國(guó)有一些所謂新產(chǎn)品,在技術(shù)人員的積極努力下問(wèn)市了,但到國(guó)際市場(chǎng)上卻被打回票,因?yàn)檫@種新產(chǎn)品在別的國(guó)家已成老產(chǎn)品。技術(shù)人員的情報(bào)鼻子不靈,其中原因之一是不查閱有關(guān)的索引,不依靠這個(gè)情報(bào)導(dǎo)航工具,以致迷失了生產(chǎn)的方向。
在哲學(xué)社會(huì)科學(xué)的領(lǐng)域中,索引經(jīng)常能提供在某個(gè)時(shí)期某個(gè)專業(yè)的理論動(dòng)向和水平的第一手材料,許多科研工作者就依靠索引的導(dǎo)航,找到自己出發(fā)的港灣和要達(dá)到的彼岸。
洪業(yè)在《引得說(shuō)》中指出:“引得者,予學(xué)者以游翔于載籍之舟車也。舟車愈善,則其所游愈廣,所入愈深。”這就是索引的導(dǎo)航功能。
9 執(zhí)簡(jiǎn)功能
您感到在信息爆炸的文獻(xiàn)環(huán)境中很難伸展自己的科研手腳吧?那么,請(qǐng)您先為自己的研究對(duì)象編編索引,那就可以執(zhí)簡(jiǎn)御繁了。我國(guó)的史學(xué)家顧頡剛曾說(shuō): “我常想暫不辦學(xué)術(shù)研究所而先辦材料整理所。”“索引,也是研究的基礎(chǔ)的一種,它能給您一個(gè)鑰匙,使您在許多頭緒不清的材料中找出頭緒,而得到你所需要的 東西?!?/span>
國(guó)外盛行的那種快速反映科研情報(bào)的KWIC、KWOC,就是發(fā)揮索引執(zhí)簡(jiǎn)功能的工具,把眾多科研期刊中的關(guān)鍵詞以最簡(jiǎn)要的格式顯現(xiàn),使用戶能享受 “索引在手,千刊掌握”的好處,而避免花去一半的科研時(shí)間在眾多的資料堆中苦苦求索。因而,不少科研工作者贊譽(yù)索引有“天增歲月人增壽”的妙用。
10 檢索功能
索引誕生在文獻(xiàn)檢索困難的歷史背景里,它的檢索功能隨索引的誕生同步而生。在近二千年的索引發(fā)展史中,檢索功能的變化和發(fā)展就是它的主要內(nèi)容。所以,檢索功能是索引最基本的功能。
任何文獻(xiàn)記錄或工作記錄一旦和索引方法掛上鉤,它就會(huì)從山窮水盡疑無(wú)路的困境中解脫出來(lái),很快得到檢索方便的好處,機(jī)關(guān)或企業(yè)中人事檔案和工資單的 人員的索引就是如此。又如,最令旅游者頭疼的是,到了一個(gè)旅游點(diǎn),買了地圖,但要尋找一個(gè)地區(qū)、一條街道或里弄,那真像大海撈針一樣的困難。當(dāng)這幅地圖加 上了地名索引后,所要之地名便一檢即得了。
11 預(yù)測(cè)功能
索引中有不少數(shù)學(xué)現(xiàn)象,如從引文索引中統(tǒng)計(jì)到被引作者的論文頻率,便基本上能預(yù)測(cè)到這個(gè)專業(yè)的學(xué)術(shù)帶頭人的出現(xiàn);從題錄索引中統(tǒng)計(jì)的課題內(nèi)容,便可 預(yù)測(cè)到學(xué)術(shù)界未來(lái)研究的動(dòng)向;從統(tǒng)計(jì)索引中出現(xiàn)的各種產(chǎn)品名稱的頻率,便能預(yù)測(cè)到市場(chǎng)將出現(xiàn)的熱門商品。這些都是索引的預(yù)測(cè)功能。
索引的創(chuàng)建及使用(sqlserver 2000)
為給定表或視圖創(chuàng)建索引。?
只有表或視圖的所有者才能為表創(chuàng)建索引。表或視圖的所有者可以隨時(shí)創(chuàng)建索引,無(wú)論表中是否有數(shù)據(jù)??梢酝ㄟ^(guò)指定限定的數(shù)據(jù)庫(kù)名稱,為另一個(gè)數(shù)據(jù)庫(kù)中的表或視圖創(chuàng)建索引。
語(yǔ)法?
CREATE [ UNIQUE ] [ CLUSTERED | NONCLUSTERED ] INDEX index_name?
ON { table | view } ( column [ ASC | DESC ] [ ,…n ] )?
[ WITH < index_option > [ ,…n] ]?
[ ON filegroup ]
< index_option > ::=?
{ PAD_INDEX |?
FILLFACTOR = fillfactor |?
IGNORE_DUP_KEY |?
DROP_EXISTING |?
STATISTICS_NORECOMPUTE |?
SORT_IN_TEMPDB?
}
參數(shù)?
UNIQUE
為表或視圖創(chuàng)建唯一索引(不允許存在索引值相同的兩行)。視圖上的聚集索引必須是 UNIQUE 索引。
在創(chuàng)建索引時(shí),如果數(shù)據(jù)已存在,Microsoft? SQL Server? 會(huì)檢查是否有重復(fù)值,并在每次使用 INSERT 或 UPDATE 語(yǔ)句添加數(shù)據(jù)時(shí)進(jìn)行這種檢查。如果存在重復(fù)的鍵值,將取消 CREATE INDEX 語(yǔ)句,并返回錯(cuò)誤信息,給出第一個(gè)重復(fù)值。當(dāng)創(chuàng)建 UNIQUE 索引時(shí),有多個(gè) NULL 值被看作副本。
如果存在唯一索引,那么會(huì)產(chǎn)生重復(fù)鍵值的 UPDATE 或 INSERT 語(yǔ)句將回滾,SQL Server 將顯示錯(cuò)誤信息。即使 UPDATE 或 INSERT 語(yǔ)句更改了許多行但只產(chǎn)生了一個(gè)重復(fù)值,也會(huì)出現(xiàn)這種情況。如果在有唯一索引并且指定了 IGNORE_DUP_KEY 子句情況下輸入數(shù)據(jù),則只有違反 UNIQUE 索引的行才會(huì)失敗。在處理 UPDATE 語(yǔ)句時(shí),IGNORE_DUP_KEY 不起作用。
SQL Server 不允許為已經(jīng)包含重復(fù)值的列創(chuàng)建唯一索引,無(wú)論是否設(shè)置了 IGNORE_DUP_KEY。如果嘗試這樣做,SQL Server 會(huì)顯示錯(cuò)誤信息;重復(fù)值必須先刪除,才能為這些列創(chuàng)建唯一索引。
CLUSTERED
創(chuàng)建一個(gè)對(duì)象,其中行的物理排序與索引排序相同,并且聚集索引的最低一級(jí)(葉級(jí))包含實(shí)際的數(shù)據(jù)行。一個(gè)表或視圖只允許同時(shí)有一個(gè)聚集索引。
具有聚集索引的視圖稱為索引視圖。必須先為視圖創(chuàng)建唯一聚集索引,然后才能為該視圖定義其它索引。
在創(chuàng)建任何非聚集索引之前創(chuàng)建聚集索引。創(chuàng)建聚集索引時(shí)重建表上現(xiàn)有的非聚集索引。
如果沒(méi)有指定 CLUSTERED,則創(chuàng)建非聚集索引。
說(shuō)明 因?yàn)榘凑斩x,聚集索引的葉級(jí)與其數(shù)據(jù)頁(yè)相同,所以創(chuàng)建聚集索引時(shí)使用 ON filegroup 子句實(shí)際上會(huì)將表從創(chuàng)建該表時(shí)所用的文件移到新的文件組中。在特定的文件組上創(chuàng)建表或索引之前,應(yīng)確認(rèn)哪些文件組可用并且有足夠的空間供索引使用。文件組 的大小必須至少是整個(gè)表所需空間的 1.2 倍,這一點(diǎn)很重要。
NONCLUSTERED
創(chuàng)建一個(gè)指定表的邏輯排序的對(duì)象。對(duì)于非聚集索引,行的物理排序獨(dú)立于索引排序。非聚集索引的葉級(jí)包含索引行。每個(gè)索引行均包含非聚集鍵值和一個(gè)或 多個(gè)行定位器(指向包含該值的行)。如果表沒(méi)有聚集索引,行定位器就是行的磁盤地址。如果表有聚集索引,行定位器就是該行的聚集索引鍵。
每個(gè)表最多可以有 249 個(gè)非聚集索引(無(wú)論這些非聚集索引的創(chuàng)建方式如何:是使用 PRIMARY KEY 和 UNIQUE 約束隱式創(chuàng)建,還是使用 CREATE INDEX 顯式創(chuàng)建)。每個(gè)索引均可以提供對(duì)數(shù)據(jù)的不同排序次序的訪問(wèn)。
對(duì)于索引視圖,只能為已經(jīng)定義了聚集索引的視圖創(chuàng)建非聚集索引。因此,索引視圖中非聚集索引的行定位器一定是行的聚集鍵。
index_name
是索引名。索引名在表或視圖中必須唯一,但在數(shù)據(jù)庫(kù)中不必唯一。索引名必須遵循標(biāo)識(shí)符規(guī)則。
table
包含要?jiǎng)?chuàng)建索引的列的表??梢赃x擇指定數(shù)據(jù)庫(kù)和表所有者。
view
要建立索引的視圖的名稱。必須使用 SCHEMABINDING 定義視圖才能在視圖上創(chuàng)建索引。視圖定義也必須具有確定性。如果選擇列表中的所有表達(dá)式、WHERE 和 GROUP BY 子句都具有確定性,則視圖也具有確定性。而且,所有鍵列必須是精確的。只有視圖的非鍵列可能包含浮點(diǎn)表達(dá)式(使用 float 數(shù)據(jù)類型的表達(dá)式),而且 float 表達(dá)式不能在視圖定義的其它任何位置使用。
若要在確定性視圖中查找列,請(qǐng)使用 COLUMNPROPERTY 函數(shù)(IsDeterministic 屬性)。該函數(shù)的 IsPrecise 屬性可用來(lái)確定鍵列是否精確。
必須先為視圖創(chuàng)建唯一的聚集索引,才能為該視圖創(chuàng)建非聚集索引。
在 SQL Server 企業(yè)版或開發(fā)版中,查詢優(yōu)化器可使用索引視圖加快查詢的執(zhí)行速度。要使優(yōu)化程序考慮將該視圖作為替換,并不需要在查詢中引用該視圖。
在創(chuàng)建索引視圖或?qū)⑴c索引視圖的表中的行進(jìn)行操作時(shí),有 7 個(gè) SET 選項(xiàng)必須指派特定的值。SET 選項(xiàng) ARITHABORT、CONCAT_NULL_YIELDS_NULL、QUOTED_IDENTIFIER、ANSI_NULLS、 ANSI_PADDING 和 ANSI_WARNING 必須為 ON。SET 選項(xiàng) NUMERIC_ROUNDABORT 必須為 OFF。
如果與上述設(shè)置有所不同,對(duì)索引視圖所引用的任何表執(zhí)行的數(shù)據(jù)修改語(yǔ)句 (INSERT、UPDATE、DELETE) 都將失敗,SQL Server 會(huì)顯示一條錯(cuò)誤信息,列出所有違反設(shè)置要求的 SET 選項(xiàng)。此外,對(duì)于涉及索引視圖的 SELECT 語(yǔ)句,如果任何 SET 選項(xiàng)的值不是所需的值,則 SQL Server 在處理該 SELECT 語(yǔ)句時(shí)不考慮索引視圖替換。在受上述 SET 選項(xiàng)影響的情況中,這將確保查詢結(jié)果的正確性。
如果應(yīng)用程序使用 DB-Library 連接,則必須為服務(wù)器上的所有 7 個(gè) SET 選項(xiàng)指派所需的值。(默認(rèn)情況下,OLE DB 和 ODBC 連接已經(jīng)正確設(shè)置了除 ARITHABORT 外所有需要的 SET 選項(xiàng)。)
如果并非所有上述 SET 選項(xiàng)均有所需的值,則某些操作(例如 BCP、復(fù)制或分布式查詢)可能無(wú)法對(duì)參與索引視圖的表執(zhí)行更新。在大多數(shù)情況下,將 ARITHABORT 設(shè)置為 ON(通過(guò)服務(wù)器配置選項(xiàng)中的 user options)可以避免這一問(wèn)題。
強(qiáng)烈建議在服務(wù)器的任一數(shù)據(jù)庫(kù)中創(chuàng)建計(jì)算列上的第一個(gè)索引視圖或索引后,盡早在服務(wù)器范圍內(nèi)將 ARITHABORT 用戶選項(xiàng)設(shè)置為 ON。
有關(guān)索引視圖注意事項(xiàng)和限制的更多信息,請(qǐng)參見注釋部分。
column
應(yīng)用索引的列。指定兩個(gè)或多個(gè)列名,可為指定列的組合值創(chuàng)建組合索引。在 table 后的圓括號(hào)中列出組合索引中要包括的列(按排序優(yōu)先級(jí)排列)。
說(shuō)明 由 ntext、text 或 image 數(shù)據(jù)類型組成的列不能指定為索引列。另外,視圖不能包括任何 text、ntext 或 image 列,即使在 CREATE INDEX 語(yǔ)句中沒(méi)有引用這些列。
當(dāng)兩列或多列作為一個(gè)單位搜索最好,或者許多查詢只引用索引中指定的列時(shí),應(yīng)使用組合索引。最多可以有 16 個(gè)列組合到一個(gè)組合索引中。組合索引中的所有列必須在同一個(gè)表中。組合索引值允許的最大大小為 900 字節(jié)。也就是說(shuō),組成組合索引的固定大小列的總長(zhǎng)度不得超過(guò) 900 字節(jié)。有關(guān)組合索引中可變類型列的更多信息,請(qǐng)參見注釋部分。
[ASC | DESC]
確定具體某個(gè)索引列的升序或降序排序方向。默認(rèn)設(shè)置為 ASC。
n
表示可以為特定索引指定多個(gè) columns 的占位符。
PAD_INDEX
指定索引中間級(jí)中每個(gè)頁(yè)(節(jié)點(diǎn))上保持開放的空間。PAD_INDEX 選項(xiàng)只有在指定了 FILLFACTOR 時(shí)才有用,因?yàn)?PAD_INDEX 使用由 FILLFACTOR 所指定的百分比。默認(rèn)情況下,給定中間級(jí)頁(yè)上的鍵集,SQL Server 將確保每個(gè)索引頁(yè)上的可用空間至少可以容納一個(gè)索引允許的最大行。如果為 FILLFACTOR 指定的百分比不夠大,無(wú)法容納一行,SQL Server 將在內(nèi)部使用允許的最小值替代該百分比。
說(shuō)明 中間級(jí)索引頁(yè)上的行數(shù)永遠(yuǎn)都不會(huì)小于兩行,無(wú)論 FILLFACTOR 的值有多小。
FILLFACTOR = fillfactor
指定在 SQL Server 創(chuàng)建索引的過(guò)程中,各索引頁(yè)葉級(jí)的填滿程度。如果某個(gè)索引頁(yè)填滿,SQL Server 就必須花時(shí)間拆分該索引頁(yè),以便為新行騰出空間,這需要很大的開銷。對(duì)于更新頻繁的表,選擇合適的 FILLFACTOR 值將比選擇不合適的 FILLFACTOR 值獲得更好的更新性能。FILLFACTOR 的原始值將在 sysindexes 中與索引一起存儲(chǔ)。
如果指定了 FILLFACTOR,SQL Server 會(huì)向上舍入每頁(yè)要放置的行數(shù)。例如,發(fā)出 CREATE CLUSTERED INDEX …FILLFACTOR = 33 將創(chuàng)建一個(gè) FILLFACTOR 為 33% 的聚集索引。假設(shè) SQL Server 計(jì)算出每頁(yè)空間的 33% 為 5.2 行。SQL Server 將其向上舍入,這樣,每頁(yè)就放置 6 行。
說(shuō)明 顯式的 FILLFACTOR 設(shè)置只是在索引首次創(chuàng)建時(shí)應(yīng)用。SQL Server 并不會(huì)動(dòng)態(tài)保持頁(yè)上可用空間的指定百分比。
用戶指定的 FILLFACTOR 值可以從 1 到 100。如果沒(méi)有指定值,默認(rèn)值為 0。如果 FILLFACTOR 設(shè)置為 0,則只填滿葉級(jí)頁(yè)??梢酝ㄟ^(guò)執(zhí)行 sp_configure 更改默認(rèn)的 FILLFACTOR 設(shè)置。
只有不會(huì)出現(xiàn) INSERT 或 UPDATE 語(yǔ)句時(shí)(例如對(duì)只讀表),才可以使用 FILLFACTOR 100。如果 FILLFACTOR 為 100,SQL Server 將創(chuàng)建葉級(jí)頁(yè) 100% 填滿的索引。如果在創(chuàng)建 FILLFACTOR 為 100% 的索引之后執(zhí)行 INSERT 或 UPDATE,會(huì)對(duì)每次 INSERT 操作以及有可能每次 UPDATE 操作進(jìn)行頁(yè)拆分。
如果 FILLFACTOR 值較小(0 除外),就會(huì)使 SQL Server 創(chuàng)建葉級(jí)頁(yè)不完全填充的新索引。例如,如果已知某個(gè)表包含的數(shù)據(jù)只是該表最終要包含的數(shù)據(jù)的一小部分,那么為該表創(chuàng)建索引時(shí),FILLFACTOR 為 10 會(huì)是合理的選擇。FILLFACTOR 值較小還會(huì)使索引占用較多的存儲(chǔ)空間。
下表說(shuō)明如何在已指定 FILLFACTOR 的情況下填充索引頁(yè)。
FILLFACTOR 中間級(jí)頁(yè) 葉級(jí)頁(yè)?
0 一個(gè)可用項(xiàng) 100% 填滿?
1% -99 一個(gè)可用項(xiàng) <= FILLFACTOR% 填滿?
100% 一個(gè)可用項(xiàng) 100% 填滿
一個(gè)可用項(xiàng)是指頁(yè)上可以容納另一個(gè)索引項(xiàng)的空間。
重要 用某個(gè) FILLFACTOR 值創(chuàng)建聚集索引會(huì)影響數(shù)據(jù)占用存儲(chǔ)空間的數(shù)量,因?yàn)?SQL Server 在創(chuàng)建聚集索引時(shí)會(huì)重新分布數(shù)據(jù)。
IGNORE_DUP_KEY
控制當(dāng)嘗試向?qū)儆谖ㄒ痪奂饕牧胁迦胫貜?fù)的鍵值時(shí)所發(fā)生的情況。如果為索引指定了 IGNORE_DUP_KEY,并且執(zhí)行了創(chuàng)建重復(fù)鍵的 INSERT 語(yǔ)句,SQL Server 將發(fā)出警告消息并忽略重復(fù)的行。
如果沒(méi)有為索引指定 IGNORE_DUP_KEY,SQL Server 會(huì)發(fā)出一條警告消息,并回滾整個(gè) INSERT 語(yǔ)句。
下表顯示何時(shí)可使用 IGNORE_DUP_KEY。
索引類型 選項(xiàng)?
聚集 不允許?
唯一聚集 允許使用 IGNORE_DUP_KEY?
非聚集 不允許?
唯一非聚集 允許使用 IGNORE_DUP_KEY
DROP_EXISTING
指定應(yīng)除去并重建已命名的先前存在的聚集索引或非聚集索引。指定的索引名必須與現(xiàn)有的索引名相同。因?yàn)榉蔷奂饕奂I,所以在除去聚集索引時(shí),必須重建非聚集索引。如果重建聚集索引,則必須重建非聚集索引,以便使用新的鍵集。
為已經(jīng)具有非聚集索引的表重建聚集索引時(shí)(使用相同或不同的鍵集), DROP_EXISTING 子句可以提高性能。DROP_EXISTING 子句代替了先對(duì)舊的聚集索引執(zhí)行 DROP INDEX 語(yǔ)句,然后再對(duì)新的聚集索引執(zhí)行 CREATE INDEX 語(yǔ)句的過(guò)程。非聚集索引只需重建一次,而且還只是在鍵不同的情況下才需要。
如果鍵沒(méi)有改變(提供的索引名和列與原索引相同),則 DROP_EXISTING 子句不會(huì)重新對(duì)數(shù)據(jù)進(jìn)行排序。在必須壓縮索引時(shí),這樣做會(huì)很有用。
無(wú)法使用 DROP_EXISTING 子句將聚集索引轉(zhuǎn)換成非聚集索引;不過(guò),可以將唯一聚集索引更改為非唯一索引,反之亦然。
說(shuō)明 當(dāng)執(zhí)行帶 DROP_EXISTING 子句的 CREATE INDEX 語(yǔ)句時(shí),SQL Server 假定索引是一致的(即索引沒(méi)有損壞)。指定索引中的行應(yīng)按 CREATE INDEX 語(yǔ)句中引用的指定鍵排序。
STATISTICS_NORECOMPUTE
指定過(guò)期的索引統(tǒng)計(jì)不會(huì)自動(dòng)重新計(jì)算。若要恢復(fù)自動(dòng)更新統(tǒng)計(jì),可執(zhí)行沒(méi)有 NORECOMPUTE 子句的 UPDATE STATISTICS。
重要 如果禁用分布統(tǒng)計(jì)的自動(dòng)重新計(jì)算,可能會(huì)妨礙 SQL Server 查詢優(yōu)化器為涉及該表的查詢選取最佳執(zhí)行計(jì)劃。
SORT_IN_TEMPDB
指定用于生成索引的中間排序結(jié)果將存儲(chǔ)在 tempdb 數(shù)據(jù)庫(kù)中。如果 tempdb 與用戶數(shù)據(jù)庫(kù)不在同一磁盤集,則此選項(xiàng)可能減少創(chuàng)建索引所需的時(shí)間,但會(huì)增加創(chuàng)建索引時(shí)使用的磁盤空間。
有關(guān)更多信息,請(qǐng)參見 tempdb 和索引創(chuàng)建。
ON filegroup
在給定的 filegroup 上創(chuàng)建指定的索引。該文件組必須已經(jīng)通過(guò)執(zhí)行 CREATE DATABASE 或 ALTER DATABASE 創(chuàng)建。
注釋?
為表或索引分配空間時(shí),每次遞增一個(gè)擴(kuò)展盤區(qū)(8 個(gè) 8 KB 的頁(yè))。每填滿一個(gè)擴(kuò)展盤區(qū),就會(huì)再分配一個(gè)。如果表非常小或是空表,其索引將使用單頁(yè)分配,直到向索引添加了 8 頁(yè)后,再轉(zhuǎn)而進(jìn)行擴(kuò)展盤區(qū)分配。若要獲得有關(guān)索引已分配和占用的空間數(shù)量的報(bào)表,請(qǐng)使用 sp_spaceused。
創(chuàng)建聚集索引要求數(shù)據(jù)庫(kù)中的可用空間大約為數(shù)據(jù)大小的 1.2 倍。該空間不包括現(xiàn)有表占用的空間;將對(duì)數(shù)據(jù)進(jìn)行復(fù)制以創(chuàng)建聚集索引,舊的無(wú)索引數(shù)據(jù)將在索引創(chuàng)建完成后刪除。使用 DROP_EXISTING 子句時(shí),聚集索引所需的空間數(shù)量與現(xiàn)有索引的空間要求相同。所需的額外空間可能還受指定的 FILLFACTOR 的影響。
在 SQL Server 2000 中創(chuàng)建索引時(shí),可以使用 SORT_IN_TEMPDB 選項(xiàng)指示數(shù)據(jù)庫(kù)引擎在 tempdb 中存儲(chǔ)中間索引排序結(jié)果。如果 tempdb 在不同于用戶數(shù)據(jù)庫(kù)所在的磁盤集上,則此選項(xiàng)可能減少創(chuàng)建索引所需的時(shí)間,但會(huì)增加用于創(chuàng)建索引的磁盤空間。除在用戶數(shù)據(jù)庫(kù)中創(chuàng)建索引所需的空間外, tempdb 還必須有大約相同的額外空間來(lái)存儲(chǔ)中間排序結(jié)果。有關(guān)更多信息,請(qǐng)參見 tempdb 和索引創(chuàng)建。
CREATE INDEX 語(yǔ)句同其它查詢一樣優(yōu)化。SQL Server 查詢處理器可以選擇掃描另一個(gè)索引,而不是執(zhí)行表掃描,以節(jié)省 I/O 操作。在某些情況下,可以不必排序。
在運(yùn)行 SQL Server 企業(yè)管理器和程序員版的多處理器計(jì)算機(jī)上,CREATE INDEX 自動(dòng)使用多個(gè)處理器執(zhí)行掃描和排序,與其它查詢的操作方式相同。執(zhí)行一條 CREATE INDEX 語(yǔ)句所使用的處理器數(shù)由配置選項(xiàng) max degree of parallelism 和當(dāng)前的工作負(fù)荷決定。如果 SQL Server 檢測(cè)到系統(tǒng)正忙,則在開始執(zhí)行語(yǔ)句之前,CREATE INDEX 操作的并發(fā)程度會(huì)自動(dòng)降低。
自上一次文件組備份以來(lái)受 CREATE INDEX 語(yǔ)句影響的全部文件組必須作為一個(gè)單位備份。有關(guān)文件和文件組備份的更多信息,請(qǐng)參見 BACKUP。
備份和 CREATE INDEX 操作不相互防礙。如果正在進(jìn)行備份,則在完整日志記錄模式中創(chuàng)建索引,而這可能需要額外的日志空間。
若要顯示有關(guān)對(duì)象索引的報(bào)表,請(qǐng)執(zhí)行 sp_helpindex。
可以為臨時(shí)表創(chuàng)建索引。在除去表或終止會(huì)話時(shí),所有索引和觸發(fā)器都將被除去。
索引中的可變類型列?
索引鍵允許的最大大小為 900 字節(jié),不過(guò) SQL Server 2000 允許在可能包含大量可變類型列的列上創(chuàng)建索引,而這些列的最大大小超過(guò) 900 字節(jié)。
在創(chuàng)建索引時(shí),SQL Server 檢查下列條件:
所有參與索引定義的固定數(shù)據(jù)列的總長(zhǎng)度必須小于或等于 900 字節(jié)。當(dāng)所要?jiǎng)?chuàng)建的索引只由固定數(shù)據(jù)列構(gòu)成時(shí),固定數(shù)據(jù)列的總計(jì)大小必須小于或等于 900 字節(jié)。否則將不能創(chuàng)建索引,且 SQL Server 將返回錯(cuò)誤。
如果索引定義由固定類型列和可變類型列組成,且固定數(shù)據(jù)列滿足前面的條件(小于或等于 900 字節(jié)),則 SQL Server 仍要檢查可變類型列的總大小。如果可變類型列的最大大小與固定數(shù)據(jù)列大小的和大于 900 字節(jié),則 SQL Server 將創(chuàng)建索引,不過(guò)將給用戶返回警告消息以提醒用戶:如果隨后在可變類型列上的插入或更新操作導(dǎo)致總大小超過(guò) 900 字節(jié),則操作將失敗且用戶將收到運(yùn)行時(shí)錯(cuò)誤。同樣,如果索引定義只由可變類型列組成,且這些列的最大總大小大于 900 字節(jié),則 SQL Server 將創(chuàng)建索引,不過(guò)將返回警告消息。?
有關(guān)更多信息,請(qǐng)參見索引鍵的最大值。
在計(jì)算列和視圖上創(chuàng)建索引時(shí)的考慮?
在 SQL Server 2000 中,還可以在計(jì)算列和視圖上創(chuàng)建索引。在視圖上創(chuàng)建唯一聚集索引可以提高查詢性能,因?yàn)橐晥D存儲(chǔ)在數(shù)據(jù)庫(kù)中的方式與具有聚集索引的表的存儲(chǔ)方式相同。
UNIQUE 或 PRIMARY KEY 只要滿足所有索引條件,就可以包含計(jì)算列。具體說(shuō)來(lái)就是,計(jì)算列必須具有確定性、必須精確,且不能包含 text、ntext 或 image 列。有關(guān)確定性的更多信息,請(qǐng)參見確定性函數(shù)和非確定性函數(shù)。
在計(jì)算列或視圖上創(chuàng)建索引可能導(dǎo)致前面產(chǎn)生的 INSERT 或 UPDATE 操作失敗。當(dāng)計(jì)算列導(dǎo)致算術(shù)錯(cuò)誤時(shí)可能產(chǎn)生這樣的失敗。例如,雖然下表中的計(jì)算列 c 將導(dǎo)致算術(shù)錯(cuò)誤,但是 INSERT 語(yǔ)句仍有效:
CREATE TABLE t1 (a int, b int, c AS a/b)?
GO?
INSERT INTO t1 VALUES (‘1’, ‘0’)?
GO
相反,如果創(chuàng)建表之后在計(jì)算列 c 上創(chuàng)建索引,則上述 INSERT 語(yǔ)句將失敗。
CREATE TABLE t1 (a int, b int, c AS a/b)?
GO?
CREATE UNIQUE CLUSTERED INDEX Idx1 ON t1.c?
GO?
INSERT INTO t1 VALUES (‘1’, ‘0’)?
GO
在通過(guò)數(shù)字或 float 表達(dá)式定義的視圖上使用索引所得到的查詢結(jié)果,可能不同于不在視圖上使用索引的類似查詢所得到的結(jié)果。這種差異可能是由對(duì)基礎(chǔ)表進(jìn)行 INSERT、DELETE 或 UPDATE 操作時(shí)的舍入錯(cuò)誤引起的。
若要防止 SQL Server 使用索引視圖,請(qǐng)?jiān)诓樵冎邪?OPTION (EXPAND VIEWS) 提示。此外,任何所列選項(xiàng)設(shè)置不正確均會(huì)阻止優(yōu)化程序使用視圖上的索引。有關(guān) OPTION (EXPAND VIEWS) 提示的更多信息,請(qǐng)參見 SELECT。
對(duì)索引視圖的限制?
定義索引視圖的 SELECT 語(yǔ)句不得包含 TOP、DISTINCT、COMPUTE、HAVING 和 UNION 關(guān)鍵字。也不能包含子查詢。
SELECT 列表中不得包含星號(hào) ()、’table.’ 通配符列表、DISTINCT、COUNT(*)、COUNT()、基表中的計(jì)算列和標(biāo)量聚合。
非聚合 SELECT 列表中不能包含表達(dá)式。聚合 SELECT 列表(包含 GROUP BY 的查詢)中可能包含 SUM 和 COUNT_BIG();它一定包含 COUNT_BIG(*)。不允許有其它聚合函數(shù)(MIN、MAX、STDEV,…)。
使用 AVG 的復(fù)雜聚合無(wú)法參與索引視圖的 SELECT 列表。不過(guò),如果查詢使用這樣的聚合,則優(yōu)化程序?qū)⒛苁褂迷撍饕晥D,用 SUM 和 COUNT_BIG 的簡(jiǎn)單聚合組合代替 AVG。
若某列是從取值為 float 數(shù)據(jù)類型或使用 float 表達(dá)式進(jìn)行取值的表達(dá)式得到的,則不能作為索引視圖或表中計(jì)算列的索引鍵。這樣的列被視為是不精確的。使用 COLUMNPROPERTY 函數(shù)決定特定計(jì)算列或視圖中的列是否精確。
索引視圖受限于以下的附加限制:
索引的創(chuàng)建者必須擁有表。所有表、視圖和索引必須在同一數(shù)據(jù)庫(kù)中創(chuàng)建。
定義索引視圖的 SELECT 語(yǔ)句不得包含視圖、行集函數(shù)、行內(nèi)函數(shù)或派生表。同一物理表在該語(yǔ)句中只能出現(xiàn)一次。
在任何聯(lián)接表中,均不允許進(jìn)行 OUTER JOIN 操作。
搜索條件中不允許使用子查詢或者 CONTAINS 或 FREETEXT 謂詞。
如果視圖定義包含 GROUP BY 子句,則視圖的 SELECT 列表中必須包含所有分組依據(jù)列及 COUNT_BIG(*) 表達(dá)式。此外,CREATE UNIQUE CLUSTERED INDEX 子句中必須只包含這些列。?
可以創(chuàng)建索引的視圖的定義主體必須具有確定性且必須精確,這類似于計(jì)算列上的索引要求。請(qǐng)參見在計(jì)算列上創(chuàng)建索引。
權(quán)限?
CREATE INDEX 的權(quán)限默認(rèn)授予 sysadmin 固定服務(wù)器角色、db_ddladmin 和 db_owner 固定數(shù)據(jù)庫(kù)角色和表所有者且不能轉(zhuǎn)讓。
示例?
A. 使用簡(jiǎn)單索引?
下面的示例為 authors 表的 au_id 列創(chuàng)建索引。
SET NOCOUNT OFF?
USE pubs?
IF EXISTS (SELECT name FROM sysindexes?
WHERE name = ‘a(chǎn)u_id_ind’)?
DROP INDEX authors.au_id_ind?
GO?
USE pubs?
CREATE INDEX au_id_ind?
ON authors (au_id)?
GO
B. 使用唯一聚集索引?
下面的示例為 emp_pay 表的 employeeID 列創(chuàng)建索引,并且強(qiáng)制唯一性。因?yàn)橹付?CLUSTERED 子句,所以該索引將對(duì)磁盤上的數(shù)據(jù)進(jìn)行物理排序。
SET NOCOUNT ON?
USE pubs?
IF EXISTS (SELECT * FROM INFORMATION_SCHEMA.TABLES?
WHERE TABLE_NAME = ‘emp_pay’)?
DROP TABLE emp_pay?
GO?
USE pubs?
IF EXISTS (SELECT name FROM sysindexes?
WHERE name = ‘employeeID_ind’)?
DROP INDEX emp_pay.employeeID_ind?
GO?
USE pubs?
GO?
CREATE TABLE emp_pay?
(?
employeeID int NOT NULL,?
base_pay money NOT NULL,?
commission decimal(2, 2) NOT NULL?
)?
INSERT emp_pay?
VALUES (1, 500, .10)?
INSERT emp_pay?
VALUES (2, 1000, .05)?
INSERT emp_pay?
VALUES (3, 800, .07)?
INSERT emp_pay?
VALUES (5, 1500, .03)?
INSERT emp_pay?
VALUES (9, 750, .06)?
GO?
SET NOCOUNT OFF?
CREATE UNIQUE CLUSTERED INDEX employeeID_ind?
ON emp_pay (employeeID)?
GO
C. 使用簡(jiǎn)單組合索引?
下面的示例為 order_emp 表的 orderID 列和 employeeID 列創(chuàng)建索引。
SET NOCOUNT ON?
USE pubs?
IF EXISTS (SELECT * FROM INFORMATION_SCHEMA.TABLES?
WHERE TABLE_NAME = ‘order_emp’)?
DROP TABLE order_emp?
GO?
USE pubs?
IF EXISTS (SELECT name FROM sysindexes?
WHERE name = ‘emp_order_ind’)?
DROP INDEX order_emp.emp_order_ind?
GO?
USE pubs?
GO?
CREATE TABLE order_emp?
(?
orderID int IDENTITY(1000, 1),?
employeeID int NOT NULL,?
orderdate datetime NOT NULL DEFAULT GETDATE(),?
orderamount money NOT NULL?
)
INSERT order_emp (employeeID, orderdate, orderamount)?
VALUES (5, ‘4/12/98’, 315.19)?
INSERT order_emp (employeeID, orderdate, orderamount)?
VALUES (5, ‘5/30/98’, 1929.04)?
INSERT order_emp (employeeID, orderdate, orderamount)?
VALUES (1, ‘1/03/98’, 2039.82)?
INSERT order_emp (employeeID, orderdate, orderamount)?
VALUES (1, ‘1/22/98’, 445.29)?
INSERT order_emp (employeeID, orderdate, orderamount)?
VALUES (4, ‘4/05/98’, 689.39)?
INSERT order_emp (employeeID, orderdate, orderamount)?
VALUES (7, ‘3/21/98’, 1598.23)?
INSERT order_emp (employeeID, orderdate, orderamount)?
VALUES (7, ‘3/21/98’, 445.77)?
INSERT order_emp (employeeID, orderdate, orderamount)?
VALUES (7, ‘3/22/98’, 2178.98)?
GO?
SET NOCOUNT OFF?
CREATE INDEX emp_order_ind?
ON order_emp (orderID, employeeID)
D. 使用 FILLFACTOR 選項(xiàng)?
下面的示例使用 FILLFACTOR 子句,將其設(shè)置為 100。FILLFACTOR 為 100 將完全填滿每一頁(yè),只有確定表中的索引值永遠(yuǎn)不會(huì)更改時(shí),該選項(xiàng)才有用。
SET NOCOUNT OFF?
USE pubs?
IF EXISTS (SELECT name FROM sysindexes?
WHERE name = ‘zip_ind’)?
DROP INDEX authors.zip_ind?
GO?
USE pubs?
GO?
CREATE NONCLUSTERED INDEX zip_ind?
ON authors (zip)?
WITH FILLFACTOR = 100
E. 使用 IGNORE_DUP_KEY?
下面的示例為 emp_pay 表創(chuàng)建唯一聚集索引。如果輸入了重復(fù)的鍵,將忽略該 INSERT 或 UPDATE 語(yǔ)句。
SET NOCOUNT ON?
USE pubs?
IF EXISTS (SELECT * FROM INFORMATION_SCHEMA.TABLES?
WHERE TABLE_NAME = ‘emp_pay’)?
DROP TABLE emp_pay?
GO?
USE pubs?
IF EXISTS (SELECT name FROM sysindexes?
WHERE name = ‘employeeID_ind’)?
DROP INDEX emp_pay.employeeID_ind?
GO?
USE pubs?
GO?
CREATE TABLE emp_pay?
(?
employeeID int NOT NULL,?
base_pay money NOT NULL,?
commission decimal(2, 2) NOT NULL?
)?
INSERT emp_pay?
VALUES (1, 500, .10)?
INSERT emp_pay?
VALUES (2, 1000, .05)?
INSERT emp_pay?
VALUES (3, 800, .07)?
INSERT emp_pay?
VALUES (5, 1500, .03)?
INSERT emp_pay?
VALUES (9, 750, .06)?
GO?
SET NOCOUNT OFF?
GO?
CREATE UNIQUE CLUSTERED INDEX employeeID_ind?
ON emp_pay(employeeID)?
WITH IGNORE_DUP_KEY
F. 使用 PAD_INDEX 創(chuàng)建索引?
下面的示例為 authors 表中的作者標(biāo)識(shí)號(hào)創(chuàng)建索引。沒(méi)有 PAD_INDEX 子句,SQL Server 將創(chuàng)建填充 10% 的葉級(jí)頁(yè),但是葉級(jí)之上的頁(yè)幾乎被完全填滿。使用 PAD_INDEX 時(shí),中間級(jí)頁(yè)也填滿 10%。
說(shuō)明 如果沒(méi)有指定 PAD_INDEX,唯一聚集索引的索引頁(yè)上至少會(huì)出現(xiàn)兩項(xiàng)。
SET NOCOUNT OFF?
USE pubs?
IF EXISTS (SELECT name FROM sysindexes?
WHERE name = ‘a(chǎn)u_id_ind’)?
DROP INDEX authors.au_id_ind?
GO?
USE pubs?
CREATE INDEX au_id_ind?
ON authors (au_id)?
WITH PAD_INDEX, FILLFACTOR = 10
G. 為視圖創(chuàng)建索引?
下面的示例將創(chuàng)建一個(gè)視圖,并為該視圖創(chuàng)建索引。然后,引入兩個(gè)使用該索引視圖的查詢。
USE Northwind?
GO
–Set the options to support indexed views.?
SET NUMERIC_ROUNDABORT OFF?
GO?
SET ANSI_PADDING,ANSI_WARNINGS,CONCAT_NULL_YIELDS_NULL,ARITHABORT,QUOTED_IDENTIFIER,ANSI_NULLS ON?
GO
–Create view.?
CREATE VIEW V1?
WITH SCHEMABINDING?
AS?
SELECT SUM(UnitPrice*Quantity*(1.00-Discount)) AS Revenue, OrderDate, ProductID, COUNT_BIG(*) AS COUNT?
FROM dbo.[Order Details] od, dbo.Orders o?
WHERE od.OrderID=o.OrderID?
GROUP BY OrderDate, ProductID?
GO
–Create index on the view.?
CREATE UNIQUE CLUSTERED INDEX IV1 ON V1 (OrderDate, ProductID)?
GO
–This query will use the above indexed view.?
SELECT SUM(UnitPrice*Quantity*(1.00-Discount)) AS Rev, OrderDate, ProductID?
FROM dbo.[Order Details] od, dbo.Orders o?
WHERE od.OrderID=o.OrderID AND ProductID in (2, 4, 25, 13, 7, 89, 22, 34)?
AND OrderDate >= ‘05/01/1998’?
GROUP BY OrderDate, ProductID?
ORDER BY Rev DESC
–This query will use the above indexed view.?
SELECT OrderDate, SUM(UnitPrice*Quantity*(1.00-Discount)) AS Rev?
FROM dbo.[Order Details] od, dbo.Orders o?
WHERE od.OrderID=o.OrderID AND DATEPART(mm,OrderDate)= 3?
AND DATEPART(yy,OrderDate) = 1998?
GROUP BY OrderDate?
ORDER BY OrderDate ASC
原文地址http://www.cnblogs.com/mxmbk/articles/5226344.html
總結(jié)
以上是生活随笔為你收集整理的数据库索引的作用和优点缺点以及索引的11中用法的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: 快速掌握mysql,可备用查找相关用法(
- 下一篇: SQL分类:DDL/DML/DQL/DC