sql重建表索引
❶ sql server鎬庝箞寤虹珛緔㈠紩
浠涔堟槸緔㈠紩
鎷挎眽璇瀛楀吀鐨勭洰褰曢〉錛堢儲寮曪級鎵撴瘮鏂癸細姝e傛眽璇瀛楀吀涓鐨勬眽瀛楁寜欏靛瓨鏀句竴鏍鳳紝SQL Server涓鐨勬暟鎹璁板綍涔熸槸鎸夐〉瀛樻斁鐨勶紝姣忛〉瀹歸噺涓鑸涓4K 銆備負浜嗗姞蹇鏌ユ壘鐨勯熷害錛屾眽璇瀛楋紙璇嶏級鍏鎬竴鑸閮芥湁鎸夋嫾闊熾佺瑪鐢匯佸嚲鏃侀儴棣栫瓑鎺掑簭鐨勭洰褰曪紙緔㈠紩錛夛紝鎴戜滑鍙浠ラ夋嫨鎸夋嫾闊蟲垨絎旂敾鏌ユ壘鏂瑰紡錛屽揩閫熸煡鎵懼埌闇瑕佺殑瀛楋紙璇嶏級銆
鍚岀悊錛孲QL Server鍏佽哥敤鎴峰湪琛ㄤ腑鍒涘緩緔㈠紩錛屾寚瀹氭寜鏌愬垪棰勫厛鎺掑簭錛屼粠鑰屽ぇ澶ф彁楂樻煡璇㈤熷害銆
• SQL Server涓鐨勬暟鎹涔熸槸鎸夐〉錛 4KB 錛夊瓨鏀
• 緔㈠紩錛氭槸SQL Server緙栨帓鏁版嵁鐨勫唴閮ㄦ柟娉曘傚畠涓篠QL Server鎻愪緵涓縐嶆柟娉曟潵緙栨帓鏌ヨ㈡暟鎹銆
• 緔㈠紩欏碉細鏁版嵁搴撲腑瀛樺偍緔㈠紩鐨勬暟鎹欏碉紱緔㈠紩欏電被浼間簬奼夎瀛楋紙璇嶏級鍏鎬腑鎸夋嫾闊蟲垨絎旂敾鎺掑簭鐨勭洰褰曢〉銆
• 緔㈠紩鐨勪綔鐢錛氶氳繃浣跨敤緔㈠紩錛屽彲浠ュぇ澶ф彁楂樻暟鎹搴撶殑媯緔㈤熷害錛屾敼鍠勬暟鎹搴撴ц兘銆
緔㈠紩綾誨瀷
• 鍞涓緔㈠紩錛氬敮涓緔㈠紩涓嶅厑璁鎬袱琛屽叿鏈夌浉鍚岀殑緔㈠紩鍊
• 涓婚敭緔㈠紩錛氫負琛ㄥ畾涔変竴涓涓婚敭灝嗚嚜鍔ㄥ壋寤轟富閿緔㈠紩錛屼富閿緔㈠紩鏄鍞涓緔㈠紩鐨勭壒孌婄被鍨嬨備富閿緔㈠紩瑕佹眰涓婚敭涓鐨勬瘡涓鍊兼槸鍞涓鐨勶紝騫朵笖涓嶈兘涓虹┖
• 鑱氶泦緔㈠紩(Clustered)錛氳〃涓鍚勮岀殑鐗╃悊欏哄簭涓庨敭鍊肩殑閫昏緫錛堢儲寮曪級欏哄簭鐩稿悓錛屾瘡涓琛ㄥ彧鑳芥湁涓涓
• 闈炶仛闆嗙儲寮(Non-clustered)錛氶潪鑱氶泦緔㈠紩鎸囧畾琛ㄧ殑閫昏緫欏哄簭銆傛暟鎹瀛樺偍鍦ㄤ竴涓浣嶇疆錛岀儲寮曞瓨鍌ㄥ湪鍙︿竴涓浣嶇疆錛岀儲寮曚腑鍖呭惈鎸囧悜鏁版嵁瀛樺偍浣嶇疆鐨勬寚閽堛傚彲浠ユ湁澶氫釜錛屽皬浜249涓
緔㈠紩綾誨瀷錛氬啀嬈$敤奼夎瀛楀吀鎵撴瘮鏂癸紝甯屾湜澶у惰兘澶熸槑鐧借仛闆嗙儲寮曞拰闈炶仛闆嗙儲寮曡繖涓や釜姒傚康銆
鍞涓緔㈠紩錛
鍞涓緔㈠紩涓嶅厑璁鎬袱琛屽叿鏈夌浉鍚岀殑緔㈠紩鍊箋
濡傛灉鐜版湁鏁版嵁涓瀛樺湪閲嶅嶇殑閿鍊礆紝鍒欏ぇ澶氭暟鏁版嵁搴撻兘涓嶅厑璁稿皢鏂板壋寤虹殑鍞涓緔㈠紩涓庤〃涓璧蜂繚瀛樸傚綋鏂版暟鎹灝嗕嬌琛ㄤ腑鐨勯敭鍊奸噸澶嶆椂錛屾暟鎹搴撲篃鎷掔粷鎺ュ彈姝ゆ暟鎹銆備緥濡傦紝濡傛灉鍦╯tuInfo琛ㄤ腑鐨勫﹀憳鍛樿韓浠借瘉鍙(stuID) 鍒椾笂鍒涘緩浜嗗敮涓緔㈠紩錛屽垯鎵鏈夊﹀憳鐨勮韓浠借瘉鍙蜂笉鑳介噸澶嶃
鎻愮ず錛氬壋寤轟簡鍞涓綰︽潫錛屽皢鑷鍔ㄥ壋寤哄敮涓緔㈠紩銆傚敖綆″敮涓緔㈠紩鏈夊姪浜庢壘鍒頒俊鎮錛屼絾涓轟簡鑾峰緱鏈浣蟲ц兘錛屽緩璁浣跨敤涓婚敭綰︽潫鎴栧敮涓綰︽潫銆
涓婚敭緔㈠紩錛
鍦ㄦ暟鎹搴撳叧緋誨浘涓涓鴻〃瀹氫箟涓涓涓婚敭灝嗚嚜鍔ㄥ壋寤轟富閿緔㈠紩錛屼富閿緔㈠紩鏄鍞涓緔㈠紩鐨勭壒孌婄被鍨嬨備富閿緔㈠紩瑕佹眰涓婚敭涓鐨勬瘡涓鍊兼槸鍞涓鐨勩傚綋鍦ㄦ煡璇涓浣跨敤涓婚敭緔㈠紩鏃訛紝瀹冭繕鍏佽稿揩閫熻塊棶鏁版嵁銆
鑱氶泦緔㈠紩錛坈lustered index錛
鍦ㄨ仛闆嗙儲寮曚腑錛岃〃涓鍚勮岀殑鐗╃悊欏哄簭涓庨敭鍊肩殑閫昏緫錛堢儲寮曪級欏哄簭鐩稿悓銆傝〃鍙鑳藉寘鍚涓涓鑱氶泦緔㈠紩銆備緥濡傦細奼夎瀛楋紙璇嶏級鍏擱粯璁ゆ寜鎷奸煶鎺掑簭緙栨帓瀛楀吀涓鐨勬瘡欏甸〉鐮併傛嫾闊沖瓧姣峚錛宐錛宑錛宒鈥︹x錛寉錛寊灝辨槸緔㈠紩鐨勯昏緫欏哄簭錛岃岄〉鐮1錛2錛3鈥︹﹀氨鏄鐗╃悊欏哄簭銆傞粯璁ゆ寜鎷奸煶鎺掑簭鐨勫瓧鍏革紝鍏剁儲寮曢『搴忓拰閫昏緫欏哄簭鏄涓鑷寸殑銆傚嵆鎷奸煶欏哄簭杈冨悗鐨勫瓧錛堣瘝錛夊瑰簲鐨勯〉鐮佷篃杈冨ぇ銆傚傛嫾闊抽梙a鍦板瑰簲鐨勫瓧(璇)欏電爜灝辨瘮鎷奸煶閫梑a鍦 瀵瑰簲鐨勫瓧(璇)欏電爜闈犲悗銆
闈炶仛闆嗙儲寮(Non-clustered)
濡傛灉涓嶆槸鑱氶泦緔㈠紩錛岃〃涓鍚勮岀殑鐗╃悊欏哄簭涓庨敭鍊肩殑閫昏緫欏哄簭涓嶅尮閰嶃傝仛闆嗙儲寮曟瘮闈炶仛闆嗙儲寮曪紙nonclustered index錛夋湁鏇村揩鐨勬暟鎹璁塊棶閫熷害銆備緥濡傦紝鎸夌瑪鐢繪帓搴忕殑緔㈠紩灝辨槸闈炶仛闆嗙儲寮曪紝閫1鍦扮敾鐨勫瓧錛堣瘝錛夊瑰簲鐨勯〉鐮佸彲鑳芥瘮閫3鍦扮敾鐨勫瓧錛堣瘝錛夊瑰簲鐨勯〉鐮佸ぇ錛堥潬鍚庯級銆
鎻愮ず錛歋QL Server涓錛屼竴涓琛ㄥ彧鑳藉壋寤1涓鑱氶泦緔㈠紩錛屽氫釜闈炶仛闆嗙儲寮曘傝劇疆鏌愬垪涓轟富閿錛岃ュ垪灝遍粯璁や負鑱氶泦緔㈠紩
濡備綍鍒涘緩緔㈠紩
浣跨敤T-SQL璇鍙ュ壋寤虹儲寮曠殑璇娉曪細
CREATE [UNIQUE] [CLUSTERED|NONCLUSTERED]
INDEX index_name
ON table_name (column_name鈥)
[WITH FILLFACTOR=x]
q UNIQUE琛ㄧず鍞涓緔㈠紩錛屽彲閫
q CLUSTERED銆丯ONCLUSTERED琛ㄧず鑱氶泦緔㈠紩榪樻槸闈炶仛闆嗙儲寮曪紝鍙閫
q FILLFACTOR琛ㄧず濉鍏呭洜瀛愶紝鎸囧畾涓涓0鍒100涔嬮棿鐨勫礆紝璇ュ兼寚紺虹儲寮曢〉濉婊$殑絀洪棿鎵鍗犵殑鐧懼垎姣
鍦╯tuMarks琛ㄧ殑writtenExam鍒楀壋寤虹儲寮曪細
USE stuDB
GO
IF EXISTS (SELECT name FROM sysindexes
WHERE name = 'IX_writtenExam')
DROP INDEX stuMarks.IX_writtenExam
/*--絎旇瘯鍒楀壋寤洪潪鑱氶泦緔㈠紩錛氬~鍏呭洜瀛愪負30錛--*/
CREATE NONCLUSTERED INDEX IX_writtenExam
ON stuMarks(writtenExam)
WITH FILLFACTOR= 30
GO
/*-----鎸囧畾鎸夌儲寮 IX_writtenExam 鏌ヨ----*/
SELECT * FROM stuMarks (INDEX=IX_writtenExam)
WHERE writtenExam BETWEEN 60 AND 90
鉶界劧鎴戜滑鍙浠ユ寚瀹歋QL Server鎸夊摢涓緔㈠紩榪涜屾暟鎹鏌ヨ錛屼絾涓鑸涓嶉渶瑕佹垜浠浜哄伐鎸囧畾銆係QL Server灝嗕細鏍規嵁鎴戜滑鍒涘緩鐨勭儲寮曪紝鑷鍔ㄤ紭鍖栨煡璇銆
緔㈠紩鐨勪紭緙虹偣
• 浼樼偣
鈥 鍔犲揩璁塊棶閫熷害
鈥 鍔犲己琛岀殑鍞涓鎬
• 緙虹偣
鈥 甯︾儲寮曠殑琛ㄥ湪鏁版嵁搴撲腑闇瑕佹洿澶氱殑瀛樺偍絀洪棿
鈥 鎿嶇旱鏁版嵁鐨勫懡浠ら渶瑕佹洿闀跨殑澶勭悊鏃墮棿錛屽洜涓哄畠浠闇瑕佸圭儲寮曡繘琛屾洿鏂
鍒涘緩緔㈠紩鐨勬寚瀵煎師鍒
• 璇鋒寜鐓т笅鍒楁爣鍑嗛夋嫨寤虹珛緔㈠紩鐨勫垪銆
鈥 璇ュ垪鐢ㄤ簬棰戠箒鎼滅儲
鈥 璇ュ垪鐢ㄤ簬瀵規暟鎹榪涜屾帓搴
• 璇蜂笉瑕佷嬌鐢ㄤ笅闈㈢殑鍒楀壋寤虹儲寮曪細
鈥 鍒椾腑浠呭寘鍚鍑犱釜涓嶅悓鐨勫箋
鈥 琛ㄤ腑浠呭寘鍚鍑犺屻備負灝忓瀷琛ㄥ壋寤虹儲寮曞彲鑳戒笉澶鍒掔畻錛屽洜涓篠QL Server鍦ㄧ儲寮曚腑鎼滅儲鏁版嵁鎵鑺辯殑鏃墮棿姣斿湪琛ㄤ腑閫愯屾悳緔㈡墍鑺辯殑鏃墮棿鏇撮暱
❷ 奼傝В錛屽叧浜嶴QL緇欒〃鍒涘緩緔㈠紩鍜岃嗗浘鐨勯棶棰橈紝鍚勪綅甯甯蹇
緔㈠紩鐨勪嬌鐢ㄦ槸鏁版嵁搴撹嚜鍔ㄥ畬鎴愮殑錛屼笉闇瑕佺壒鍒璋冪敤錛佷嬌鐢ㄧ儲寮曞彲浠ュ姞蹇鏌ヨ㈤熷害錛屽彲浠ュ弬鑰冧互涓嬬殑鐧懼害鐧劇戣存槑錛
浣跨敤緔㈠紩鍙蹇閫熻塊棶琛ㄤ腑鐨勭壒瀹氫俊鎮銆傜儲寮曟槸瀵規暟鎹搴撹〃涓涓鍒楁垨澶氬垪鐨勫艱繘琛屾帓搴忕殑涓縐嶇粨鏋勶紝渚嬪 employee 琛ㄧ殑濮擄紙name錛夊垪銆傚傛灉瑕佹寜濮撴煡鎵劇壒瀹氳亴鍛橈紝涓庡繀欏繪悳緔㈣〃涓鐨勬墍鏈夎岀浉姣旓紝緔㈠紩浼氬府鍔╂偍鏇村揩鍦拌幏寰楄ヤ俊鎮銆
銆銆鍦ㄥ叧緋繪暟鎹搴撲腑錛岀儲寮曟槸涓縐嶄笌琛ㄦ湁鍏崇殑鏁版嵁搴撶粨鏋勶紝瀹冨彲浠ヤ嬌瀵瑰簲浜庤〃鐨凷QL璇鍙ユ墽琛屽緱鏇村揩銆傜儲寮曠殑浣滅敤鐩稿綋浜庡浘涔︾殑鐩褰曪紝鍙浠ユ牴鎹鐩褰曚腑鐨勯〉鐮佸揩閫熸壘鍒版墍闇鐨勫唴瀹廣傚綋琛ㄤ腑鏈夊ぇ閲忚板綍鏃訛紝鑻ヨ佸硅〃榪涜屾煡璇錛岀涓縐嶆悳緔淇℃伅鏂瑰紡鏄鍏ㄨ〃鎼滅儲錛屾槸灝嗘墍鏈夎板綍涓涓鍙栧嚭錛屽拰鏌ヨ㈡潯浠惰繘琛屼竴涓瀵規瘮錛岀劧鍚庤繑鍥炴弧瓚蟲潯浠剁殑璁板綍錛岃繖鏍峰仛浼氭秷鑰楀ぇ閲忔暟鎹搴撶郴緇熸椂闂達紝騫墮犳垚澶ч噺紓佺洏I/O鎿嶄綔錛涚浜岀嶅氨鏄鍦ㄨ〃涓寤虹珛緔㈠紩錛岀劧鍚庡湪緔㈠紩涓鎵懼埌絎﹀悎鏌ヨ㈡潯浠剁殑緔㈠紩鍊礆紝鏈鍚庨氳繃淇濆瓨鍦ㄧ儲寮曚腑鐨凴OWID錛堢浉褰撲簬欏電爜錛夊揩閫熸壘鍒拌〃涓瀵瑰簲鐨勮板綍銆
銆銆緔㈠紩鏄涓涓鍗曠嫭鐨勩佺墿鐞嗙殑鏁版嵁搴撶粨鏋勶紝瀹冩槸鏌愪釜琛ㄤ腑涓鍒楁垨鑻ュ共鍒楀肩殑闆嗗悎鍜岀浉搴旂殑鎸囧悜琛ㄤ腑鐗╃悊鏍囪瘑榪欎簺鍊肩殑鏁版嵁欏電殑閫昏緫鎸囬拡娓呭崟銆
銆銆緔㈠紩鎻愪緵鎸囧悜瀛樺偍鍦ㄨ〃鐨勬寚瀹氬垪涓鐨勬暟鎹鍊肩殑鎸囬拡錛岀劧鍚庢牴鎹鎮ㄦ寚瀹氱殑鎺掑簭欏哄簭瀵硅繖浜涙寚閽堟帓搴忋傛暟鎹搴撲嬌鐢ㄧ儲寮曠殑鏂瑰紡涓庢偍浣跨敤涔︾睄涓鐨勭儲寮曠殑鏂瑰紡寰堢浉浼礆細瀹冩悳緔㈢儲寮曚互鎵懼埌鐗瑰畾鍊礆紝鐒跺悗欏烘寚閽堟壘鍒板寘鍚璇ュ肩殑琛屻
銆銆鍦ㄦ暟鎹搴撳叧緋誨浘涓錛屾偍鍙浠ュ湪閫夊畾琛ㄧ殑鈥滅儲寮/閿鈥濆睘鎬ч〉涓鍒涘緩銆佺紪杈戞垨鍒犻櫎姣忎釜緔㈠紩綾誨瀷銆傚綋淇濆瓨緔㈠紩鎵闄勫姞鍒扮殑琛錛屾垨淇濆瓨璇ヨ〃鎵鍦ㄧ殑鍏崇郴鍥炬椂錛岀儲寮曞皢淇濆瓨鍦ㄦ暟鎹搴撲腑銆
涓鑸鏁版嵁搴撳湪寤虹珛鏃剁殑榛樿ょ儲寮曟槸涓婚敭錛屼絾鏄鍦ㄤ嬌鐢ㄦ煡璇㈣繃紼嬩腑鏈変簺瀛楁靛線寰浣滀負緇忓父鐨勬緔㈡潯浠訛紝姣旀柟璇村叆搴撴椂闂淬佸撳悕銆佺嶇被絳夈傚傛灉涓嶅熀浜庝富閿鐨勬煡璇㈢粡甯稿彂鐢熺殑璇濓紝鍦ㄨ繖浜涙煡璇㈠瓧孌典笂寤虹珛緔㈠紩鍙浠ュ姞蹇鏌ヨ㈤熷害錛屾彁浜ょ▼搴忕殑鍙嶅簲鎬ц兘錛
瀵逛簬瑙嗗浘錛屼竴涓鏄綆鍗曟柟渚挎煡璇錛屽悓鏃朵篃鎻愰珮瀹夊叏鎬э紝鍙鍙傝冪櫨搴︾櫨縐戜粙緇
銆銆* 綆鍗曟с傜湅鍒扮殑灝辨槸闇瑕佺殑銆傝嗗浘涓嶄粎鍙浠ョ畝鍖栫敤鎴峰規暟鎹鐨勭悊瑙o紝涔熷彲浠ョ畝鍖栦粬浠鐨勬搷浣溿傞偅浜涜緇忓父浣跨敤鐨勬煡璇㈠彲浠ヨ瀹氫箟涓鴻嗗浘錛屼粠鑰屼嬌寰楃敤鎴蜂笉蹇呬負浠ュ悗鐨勬搷浣滄瘡嬈℃寚瀹氬叏閮ㄧ殑鏉′歡銆
銆銆* 瀹夊叏鎬с傞氳繃瑙嗗浘鐢ㄦ埛鍙鑳芥煡璇㈠拰淇鏀逛粬浠鎵鑳借佸埌鐨勬暟鎹銆傛暟鎹搴撲腑鐨勫叾瀹冩暟鎹鍒欐棦鐪嬩笉瑙佷篃鍙栦笉鍒般傛暟鎹搴撴巿鏉冨懡浠ゅ彲浠ヤ嬌姣忎釜鐢ㄦ埛瀵規暟鎹搴撶殑媯緔㈤檺鍒跺埌鐗瑰畾鐨勬暟鎹搴撳硅薄涓婏紝浣嗕笉鑳芥巿鏉冨埌鏁版嵁搴撶壒瀹氳屽拰鐗瑰畾鐨勫垪涓娿傞氳繃瑙嗗浘錛岀敤鎴峰彲浠ヨ闄愬埗鍦ㄦ暟鎹鐨勪笉鍚屽瓙闆嗕笂錛
銆銆浣跨敤鏉冮檺鍙琚闄愬埗鍦ㄥ彟涓瑙嗗浘鐨勪竴涓瀛愰泦涓婏紝鎴栨槸涓浜涜嗗浘鍜屽熀琛ㄥ悎騫跺悗鐨勫瓙闆嗕笂銆
銆銆* 閫昏緫鏁版嵁鐙絝嬫с傝嗗浘鍙甯鍔╃敤鎴峰睆钄界湡瀹炶〃緇撴瀯鍙樺寲甯︽潵鐨勫獎鍝嶃
❸ sqlserver 怎麼建索引
(1)在SQL Server Management Studio中,選擇並右擊要創建索引的表,從彈出菜單中選擇「設計」,打開表設計器。右鍵單擊表設計器,從彈出菜單中選擇「索引/鍵」命令,打開「索引/鍵」對話框。對話框中列出了已經存在的索引,如下圖所示。
(2)單擊「添加」按鈕。在「選定的主/唯一鍵或索引」框顯示系統分配給新索引的名稱。
(3)在「列」屬性下選擇要創建索引的列。可以選擇多達16列。為獲得最佳性能,最好只選擇一列或兩列。對所選的每一列,可指出索引是按升序還是降序組織列值。
(4)如果要創建唯一索引,則在「是唯一的」屬性中選擇「是」。
(5)設置完成後,單擊「確定」按鈕。
(6)當保存表時,索引即創建在資料庫中。
使用CREATE INDEX語句創建索引:
復制內容到剪貼板
代碼:
CREATE[ UNIQUE ] [ CLUSTERED | NONCLUSTERED ] INDEX索引名
ON {表名|視圖名} (列名[ ASC | DESC ] [ ,...n ] )
例:
在資料庫HrSystem中為表Employees創建基於IDCard列的唯一索引IX_Employees,可以使用以下命令:
復制內容到剪貼板
代碼:
USE HrSystem
GO
CREATE UNIQUE NONCLUSTERED INDEX [IX_Employees]ONdbo.Employees(IdCard)
GO
例:
為表Employees創建基於列IDCard的唯一、聚集索引IX_Employees1,可以使用以下命令:
復制內容到剪貼板
代碼:
USE HrSystem
GO
CREATE UNIQUE CLUSTERED INDEX [IX_Employees1] ON [dbo].[Employees](IdCard)
GO
需要注意的是,在一個表中只允許存在一個聚集索引。因此,如果表Employees中已經存在一個聚集索引,則執行上面的語句時將會提示下面的錯誤信息。
消息1902,級別16,狀態3,第1行
無法對表'dbo.Employees'創建多個聚集索引。請在創建新聚集索引前刪除現有的聚集索引'PK__Employee__263E2DD300551192'。 例:
對表Employees的列Emp_name按照降序創建索引,可以使用以下命令:
復制內容到剪貼板
代碼:
USE HrSystem
GO
CREATENONCLUSTERED INDEX [IX_Employees2] ON [dbo].[Employees]
(
[Emp_name] DESC
)
GO
在CREATE INDEX語句中使用INCLUDE子句,可以在創建索引時定義包含的非鍵列,其語法結構如下:
復制內容到剪貼板
代碼:
CREATENONCLUSTERED INDEX 索引名
ON { 表名| 視圖名 } ( 列名 [ ASC | DESC ] [ ,...n ] )
INCLUDE (<列名1>, <列名2>, [,… n])
例: 在表Employees上創建非聚集索引IX_Wage,索引中的鍵列為Wage,非鍵列為Emp_name、Sex和Title,具體語句如下:
復制內容到剪貼板
代碼:
USEHrSystem
GO
CREATENONCLUSTERED INDEX IX_Wage
ON Employees ( Wage )
INCLUDE (Emp_name, Sex, Title)
GO
例: 在創建索引IX_Wage後,當表Employees中的數據量比較大時,執行下面的SELECT語句將會明顯地改進查詢效率。
復制內容到剪貼板
代碼:
USEHrSystem
GO
SELECTEmp_name, Sex, Title, Wage
FROMEmployees
WHEREWage BETWEEN 1000 AND 3000
GO
修改索引:
在SQL Server Management Studio中,選擇並右擊要創建索引的表,從彈出的菜單中選擇「設計表」,打開表設計器。右鍵單擊表設計器,從彈出菜單中選擇「索引/鍵」命令,打開「索引/鍵」對話框,並查看已經存在的索引及修改索引的屬性信息。
也可以使用ALTER INDEX語句修改索引,其基本語法如下:
復制內容到剪貼板
代碼:
ALTER INDEX { 索引名| ALL }
ON <表名|視圖名>
{ REBUILD | DISABLE | REORGANIZE }[ ; ]
ALTER INDEX語句的參數比較復雜,這里只介紹它的基本使用情況。參數說明如下:
REBUILD指定重新生成索引。 DISABLE指定將索引標記為已禁用。 REORGANIZE指定將重新組織的索引葉級。
例:
要禁用索引IX_Employees,可以使用下面的語句:
復制內容到剪貼板
代碼:
USE HrSystem
GO
ALTERINDEX IX_Employees ON Employees DISABLE
GO
刪除索引:
在SQL Server Management Studio中,選擇並右擊要創建索引的表,從彈出的菜單中選擇「設計表」。打開表設計器。右鍵單擊表設計器,從彈出菜單中選擇「索引/鍵」命令,在打開的「索引/鍵」對話框中列出了已經存在的索引。單擊「刪除」按鈕,即可刪除索引信息。
復制內容到剪貼板
代碼:
DROP INDEX 表名.索引名|視圖名.索引名[ ,...n ]
總結:
o(1)索引並非越多越好,一個表中如果有大量的索引,不僅佔用大量的磁碟空間,而且會影響INSERT、DELETE、UPDATE等語句的性能。因為當表中數據更改的同時,索引也會進行調整和更新。
o(2)避免對經常更新的表進行過多的索引,並且索引中的列盡可能少。而對經常用於查詢的欄位應該創建索引,但要避免添加不必要的欄位。
o(3)數據量小的表最好不要使用索引,由於數據較少,查詢花費的時間可能比遍歷索引的時間還要短,索引可能不會產生優化效果。
o(4)在條件表達式中經常用到的、不同值較多的列上建立索引,在不同值少的列上不要建立索引。比如在學生表的「性別」欄位上只有「男」與「女」兩個不同值,因此就無須建立索引。如果建立索引,不但不會提高查詢效率,反而會嚴重降低更新速度。
o(5)當唯一性是某種數據本身的特徵時,指定唯一索引。使用唯一索引能夠確保定義的列的數據完整性,提高查詢速度。
o(6)在頻繁進行排序或分組(即進行GROUPBY或ORDERBY操作)的列上建立索引,如果待排序的列有多個,可以在這些列上建立組合索引。
❹ sql server merger into如何建索引
第一步,我們打開資料庫,找到一個表,打開索引文件夾,你會發現已經有一個索引了,它是表的主鍵。
第二步,我們選擇索引文件夾,右鍵單擊選擇新建索引選項。
第三步,在彈出的新建索引界面,如果你的索引類型選擇聚集的話,會提示你已經存在聚集索引,這是因為主鍵默認就是聚集索引。
第四步,然後添加索引列,同時在索引新建界面給索引起一個索引名稱,勾選唯一。
索引創建好了以後,你就會在索引文件夾下面看到你剛才創建的索引了。
❺ SQL表欄位如何建立索引難道就是添加SQL查詢語句
1、創建測試表,
create table test_index(id varchar2(20), v_date date);
❻ 如何重建SQL索引 要具體的命令
USE TableName
DECLARE @TableName varchar(255)
DECLARE TableCursor CURSOR FOR
SELECT table_name FROM information_schema.tables
WHERE table_type = 'base table'
OPEN TableCursor
FETCH NEXT FROM TableCursor INTO @TableName
WHILE @@FETCH_STATUS = 0
BEGIN
DBCC DBREINDEX(@TableName,' ',90)
FETCH NEXT FROM TableCursor INTO @TableName
END
CLOSE TableCursor
DEALLOCATE TableCursor
❼ 在PL-SQL中如何給oracle資料庫重建索引
重建索引有多種方式,如drop and re-create、rebuild、rebuild online等。下面簡單比較空襲這幾種方式異同以及優缺點:
首先建立測試表及數據:
SQL> CREATE TABLE TEST AS SELECT CITYCODE C1 FROM CITIZENINFO2;
Table created
SQL> ALTER TABLE TEST MODIFY C1 NOT NULL;
Table altered
SQL> SELECT COUNT(1) FROM TEST;
COUNT(1)
----------
16000000
一、drop and re-create和rebuild
首先看看正常建立索引時,對表的加鎖情況。
suk@ORACLE9I> @show_sid
SID
----------
14
suk@ORACLE9I> CREATE INDEX IDX_TEST_C1 ON TEST(C1);
索引已創建。
SQL> SELECT OBJECT_NAME,LMODE FROM V$LOCK L,DBA_OBJECTS O WHERE O.OBJECT_ID=L.ID1 AND L.TYPE='TM' AND SID=14;
OBJECT_NAME LMODE
------------------------------ ----------
OBJ$ 3
TEST 4
可見,普通情況下建立索引時,oracle會對基表加share鎖,由於share鎖和 row-X是不兼容的,也就是說,在建立索引期間,無法對基表進行DML操作。
對於刪除重建索引的方法就不介紹了,它與上面的描述是一樣的,下面我們看看用rebuild的方式建立索引有什麼特別。
suk@ORACLE9I> ALTER INDEX IDX_TEST_C1 REBUILD;
索引已更改。
另開一個會話,查詢此時test的加鎖情況:
SQL> SELECT OBJECT_NAME,LMODE FROM V$LOCK L,DBA_OBJECTS O WHERE O.OBJECT_ID=L.ID1 AND L.TYPE='TM' AND SID=14;
OBJECT_NAME LMODE
------------------------------ ----------
TEST 4
可見,rebuild的方式對基表的加鎖方式與CREATE時是一樣的。
另開一個會話,在索引正在rebuild時,執行如下SQL:
suk@ORACLE9I> SET AUTOTRACE TRACE
suk@ORACLE9I> SELECT /*+ INDEX(TEST) */ COUNT(1) FROM TEST WHERE ROWNUM<10;
執行計劃
----------------------------------------------------------
0 SELECT STATEMENT ptimizer=CHOOSE (Cost=26 Card=1)
1 0 SORT (AGGREGATE)
2 1 COUNT (STOPKEY)
3 2 INDEX (FULL SCAN) OF 'IDX_TEST_C1' (NON-UNIQUE) (Cost=
26 Card=1986621)
可以看到索引在重建時,查詢仍然可以使用舊索引。實際上,oracle在rebuild時,在創建新索引過程中,並不會刪除舊索引,直到新索引rebuild成功。
從這點可以知道rebuild比刪除重建的一個好處是不肆和會影響原有的SQL查詢,但也正由於此,用rebuild方式建立索引需要相應表空間的空閑空間是刪除重建方式的2倍。
重建索引有多種方式,如drop and re-create、rebuild、rebuild online等。下面簡單比較這幾種方式異同以及裂虧盯優缺點:
相關文章:
oracle重建索引(一)
二、rebuild 和rebuild online
首先我們跟蹤一下rebuild online的過程。
另開一個會話查看鎖的信息:
SQL> SELECT OBJECT_NAME,LMODE FROM V$LOCK L,DBA_OBJECTS O WHERE O.OBJECT_ID=L.ID1 AND L.TYPE='TM' AND SID=14;
OBJECT_NAME LMODE
------------------------------ ----------
SYS_JOURNAL_10499 4
TEST 2
SQL> INSERT INTO TEST VALUES(11);
1 row inserted
SQL> COMMIT;
Commit complete
可以看到,在rebuild online期間,oracle對基表加的是RS所,此時我們可以對基表進行DML操作。但奇怪的話在相同的session中有一個SYS_JOURNAL_10499表被加SHARE鎖,這個表是干什麼用的呢?
我們看看trace文件,有這樣的信息:
create table "SUK"."SYS_JOURNAL_10499" (C0 NUMBER(6,0), opcode char(1),
partno number, rid rowid, primary key( C0 , rid )) organization index
TABLESPACE "TEST"
CREATE UNIQUE INDEX "SUK"."SYS_IOT_TOP_10605" on
"SUK"."SYS_JOURNAL_10499"("C0","RID") INDEX ONLY TOPLEVEL TABLESPACE "TEST"
NOPARALLEL
drop table "SUK"."SYS_JOURNAL_10499"
我們在查查10499是什麼東西:
SQL> SELECT OBJECT_NAME,OBJECT_TYPE FROM DBA_OBJECTS WHERE OBJECT_ID=10499;
OBJECT_NAME OBJECT_TYPE
------------------------------ ------------------
IDX_TEST_C1 INDEX
從這些信息可以推測:表SYS_JOURNAL_10499就是實現在重建索引時不阻塞DML操作而設計的,它存儲的是在索引重建期間發生在基表的數據變化。可以推測,CREATE INDEX .... ONLINE應該也有一張類似的表。
實際上,oracle之所以在創建索引時鎖表阻止DML操作就是為了防止不能索引新變化的數據,在online方式重建時,有了臨時表SYS_JOURNAL_XXXX,oracle就可以放心大膽地讓用戶操作了,因為所有重建索引期間的數據變化信息都會保留在SYS_JOURNAL_XXX表中,當索引重建完後再加上SYS_JOURNAL_XXX記錄的數據,就不會漏索引數據了。(XXX是被重建的索引對應的OBJECT_ID)
導讀:
重建索引有多種方式,如drop and re-create、rebuild、rebuild online等。下面簡單比較這幾種方式異同以及優缺點:
相關文章:
oracle重建索引(一)
oracle重建索引(二)
三、rebuild和rebuild online的數據源
網上一直有這樣一個說法:重建索引是以原索引作為數據源的。那麼,這種說法是否准確呢?我們做實驗來驗證一下:
suk@ORACLE9I> COL SEGMENT_NAME FORMAT A30
--首先看看錶和索引的大小
suk@ORACLE9I> SELECT SEGMENT_NAME,BYTES FROM USER_SEGMENTS WHERE SEGMENT_NAME IN ('TEST','IDX_TEST_C1');
SEGMENT_NAME BYTES
------------------------------ ----------
TEST 201326592
IDX_TEST_C1 293601280
suk@ORACLE9I> EXPLAIN PLAN FOR ALTER INDEX IDX_TEST_C1 REBUILD;
已解釋。
suk@ORACLE9I> SELECT * FROM TABLE(DBMS_XPLAN.DISPLAY());
PLAN_TABLE_OUTPUT
----------------------------------------------------------------------------------------------------
-----------------------------------------------------------------------
| Id | Operation | Name | Rows | Bytes | Cost |
-----------------------------------------------------------------------
| 0 | ALTER INDEX STATEMENT | | | | |
| 1 | INDEX BUILD NON UNIQUE| IDX_TEST_C1 | | | |
| 2 | SORT CREATE INDEX | | | | |
| 3 | TABLE ACCESS FULL | TEST | | | |
-----------------------------------------------------------------------
Note: rule based optimization
已選擇11行。
--從執行計劃可以看出,當索引比表大時,rebuild索引用的數據源是基表。
suk@ORACLE9I> EXPLAIN PLAN FOR ALTER INDEX IDX_TEST_C1 REBUILD ONLINE;
已解釋。
suk@ORACLE9I> SELECT * FROM TABLE(DBMS_XPLAN.DISPLAY());
PLAN_TABLE_OUTPUT
----------------------------------------------------------------------------------------------------
-----------------------------------------------------------------------
| Id | Operation | Name | Rows | Bytes | Cost |
-----------------------------------------------------------------------
| 0 | ALTER INDEX STATEMENT | | | | |
| 1 | INDEX BUILD NON UNIQUE| IDX_TEST_C1 | | | |
| 2 | SORT CREATE INDEX | | | | |
| 3 | TABLE ACCESS FULL | TEST | | | |
-----------------------------------------------------------------------
Note: rule based optimization
已選擇11行。
--從執行計劃可以看出,當索引比表大時,rebuild online索引用的數據源是基表。
--我們為TEST添加一列,使得表比索引大
suk@ORACLE9I> ALTER TABLE TEST ADD(C2 CHAR(30) DEFAULT '1');
表已更改。
suk@ORACLE9I> SELECT SEGMENT_NAME,BYTES FROM USER_SEGMENTS WHERE SEGMENT_NAME IN ('TEST','IDX_TEST_C
1');
SEGMENT_NAME BYTES
------------------------------ ----------
TEST 1476395008
IDX_TEST_C1 293601280
suk@ORACLE9I> EXPLAIN PLAN FOR ALTER INDEX IDX_TEST_C1 REBUILD;
已解釋。
suk@ORACLE9I> SELECT * FROM TABLE(DBMS_XPLAN.DISPLAY());
PLAN_TABLE_OUTPUT
----------------------------------------------------------------------------------------------------
-----------------------------------------------------------------------
| Id | Operation | Name | Rows | Bytes | Cost |
-----------------------------------------------------------------------
| 0 | ALTER INDEX STATEMENT | | | | |
| 1 | INDEX BUILD NON UNIQUE| IDX_TEST_C1 | | | |
| 2 | SORT CREATE INDEX | | | | |
| 3 | INDEX FAST FULL SCAN| IDX_TEST_C1 | | | |
-----------------------------------------------------------------------
Note: rule based optimization
已選擇11行。
--從執行計劃可以看出,當表比索引大時,執行計劃已經改變,rebuild索引是以索引作為數據源的。
suk@ORACLE9I> EXPLAIN PLAN FOR ALTER INDEX IDX_TEST_C1 REBUILD ONLINE;
已解釋。
suk@ORACLE9I> SELECT * FROM TABLE(DBMS_XPLAN.DISPLAY());
PLAN_TABLE_OUTPUT
----------------------------------------------------------------------------------------------------
-----------------------------------------------------------------------
| Id | Operation | Name | Rows | Bytes | Cost |
-----------------------------------------------------------------------
| 0 | ALTER INDEX STATEMENT | | | | |
| 1 | INDEX BUILD NON UNIQUE| IDX_TEST_C1 | | | |
| 2 | SORT CREATE INDEX | | | | |
| 3 | TABLE ACCESS FULL | TEST | | | |
-----------------------------------------------------------------------
Note: rule based optimization
已選擇11行。
--從執行計劃可以看出,當表比索引大時,rebuild online仍然以基表作為數據源。
rebuild模式下,因為表數據不會產生變化,oracle主要考慮性能問題,把更快掃描完成的段作為數據源。在上面的例子中,我們並沒有對表進行分析,故oracle應該根據數據段的大小來決定那個作為數據源的。一般索引欄位比較多,或者對索引欄位的DML操作較多,可能會導致索引比表大,這時oracle就會使用基表作為新索引的數據源進行rebuild了。
而在rebuild online模式下,因為允許DML操作,而表數據變化的同時索引也會跟著變化,為了索引與基表數據的一致性,比如採用基表數據作為數據源,而不能用原索引數據作為數據源。
我們用反證法證明不能用原索引作為新索引的數據源。
例如:
T1發出rebuild online命令
T2刪除某條數據,刪數據的同時,oracle會自動維護了舊索引
T3掃描經過T2數據所在索引節點
T4插入一條記錄,新記錄對應的索引節點剛好重用了T2刪除的數據對應的索引節點空間
如果是這樣的話,新建的索引將不包含T4插入的記錄的信息。所以,rebuild online情況下新索引的數據源不能是原索引。
rebuild online情況下,如果非用原索引作為新索引的數據源的話,用中間表記錄索引變化的方法應該是可以實現的,但由於數據變化會同時引起索引變化的特定決定了這種方法將異常復雜及效率底下,所以oracle不考慮舊索引作為新索引的數據源是有道理的。
結論:
1、rebuild會阻塞對基表的DML操作,但不會影響rebuild期間查詢對原有索引的使用。
2、rebuild的數據源可能是基表,也可能是原索引。取決於基表和原索引的大小,那個小,rebuild時就會用那個作為數據源。這也說明了網上盛傳的rebuild以原索引作為資料庫的說法是不完全正確的。
3、rebuild online運行用戶在索引重建期間執行DML操作。
4、rebuild online的數據源是基表