當前位置:首頁 » 參考文獻 » 資料庫索引使用

資料庫索引使用

發布時間: 2021-03-22 20:06:10

A. 資料庫建立索引怎麼利用索引查詢

1.合理使用索引
索引是資料庫中重要的數據結構,它的根本目的就是為了提高查詢效率。現在大多數的資料庫產品都採用IBM最先提出的ISAM索引結構。
索引的使用要恰到好處,其使用原則如下:
在經常進行連接,但是沒有指定為外鍵的列上建立索引,而不經常連接的欄位則由優化器自動生成索引。
在頻繁進行排序或分組(即進行group by或order by操作)的列上建立索引。
在條件表達式中經常用到的不同值較多的列上建立檢索,在不同值少的列上不要建立索引。比如在雇員表的「性別」列上只有「男」與「女」兩個不同值,因此就無必要建立索引。如果建立索引不但不會提高查詢效率,反而會嚴重降低更新速度。
如果待排序的列有多個,可以在這些列上建立復合索引(compound index)。
使用系統工具。如Informix資料庫有一個tbcheck工具,可以在可疑的索引上進行檢查。在一些資料庫伺服器上,索引可能失效或者因為頻繁操作而 使得讀取效率降低,如果一個使用索引的查詢不明不白地慢下來,可以試著用tbcheck工具檢查索引的完整性,必要時進行修復。另外,當資料庫表更新大量 數據後,刪除並重建索引可以提高查詢速度。
(1)在下面兩條select語句中:
SELECT * FROM table1 WHERE field1<=10000 AND field1>=0;
SELECT * FROM table1 WHERE field1>=0 AND field1<=10000;
如果數據表中的數據field1都>=0,則第一條select語句要比第二條select語句效率高的多,因為第二條select語句的第一個條件耗費了大量的系統資源。
第一個原則:在where子句中應把最具限制性的條件放在最前面。
(2)在下面的select語句中:
SELECT * FROM tab WHERE a=… AND b=… AND c=…;
若有索引index(a,b,c),則where子句中欄位的順序應和索引中欄位順序一致。
第二個原則:where子句中欄位的順序應和索引中欄位順序一致。
——————————————————————————
以下假設在field1上有唯一索引I1,在field2上有非唯一索引I2。
——————————————————————————
(3) SELECT field3,field4 FROM tb WHERE field1='sdf' 快
SELECT * FROM tb WHERE field1='sdf' 慢[/cci]
因為後者在索引掃描後要多一步ROWID表訪問。
(4) SELECT field3,field4 FROM tb WHERE field1>='sdf' 快
SELECT field3,field4 FROM tb WHERE field1>'sdf' 慢
因為前者可以迅速定位索引。
(5) SELECT field3,field4 FROM tb WHERE field2 LIKE 'R%' 快
SELECT field3,field4 FROM tb WHERE field2 LIKE '%R' 慢,
因為後者不使用索引。
(6) 使用函數如:
SELECT field3,field4 FROM tb WHERE upper(field2)='RMN'不使用索引。
如果一個表有兩萬條記錄,建議不使用函數;如果一個表有五萬條以上記錄,嚴格禁止使用函數!兩萬條記錄以下沒有限制。
(7) 空值不在索引中存儲,所以
SELECT field3,field4 FROM tb WHERE field2 IS[NOT] NULL不使用索引。
(8) 不等式如
SELECT field3,field4 FROM tb WHERE field2!='TOM'不使用索引。
相似地,
SELECT field3,field4 FROM tb WHERE field2 NOT IN('M','P')不使用索引。
(9) 多列索引,只有當查詢中索引首列被用於條件時,索引才能被使用。
(10) MAX,MIN等函數,使用索引。
SELECT max(field2) FROM tb 所以,如果需要對欄位取max,min,sum等,應該加索引。
一次只使用一個聚集函數,如:
SELECT 「min」=min(field1), 「max」=max(field1) FROM tb
不如:SELECT 「min」=(SELECT min(field1) FROM tb) , 「max」=(SELECT max(field1) FROM tb)
(11) 重復值過多的索引不會被查詢優化器使用。而且因為建了索引,修改該欄位值時還要修改索引,所以更新該欄位的操作比沒有索引更慢。
(12) 索引值過大(如在一個char(40)的欄位上建索引),會造成大量的I/O開銷(甚至會超過表掃描的I/O開銷)。因此,盡量使用整數索引。 Sp_estspace可以計算表和索引的開銷。
(13) 對於多列索引,ORDER BY的順序必須和索引的欄位順序一致。
(14) 在sybase中,如果ORDER BY的欄位組成一個簇索引,那麼無須做ORDER BY。記錄的排列順序是與簇索引一致的。
(15) 多表聯結(具體查詢方案需要通過測試得到)
where子句中限定條件盡量使用相關聯的欄位,且盡量把相關聯的欄位放在前面。
SELECT a.field1,b.field2 FROM a,b WHERE a.field3=b.field3
field3上沒有索引的情況下:
對a作全表掃描,結果排序
對b作全表掃描,結果排序
結果合並。
對於很小的表或巨大的表比較合適。
field3上有索引
按照表聯結的次序,b為驅動表,a為被驅動表
對b作全表掃描
對a作索引范圍掃描
如果匹配,通過a的rowid訪問
(16) 避免一對多的join。如:
SELECT tb1.field3,tb1.field4,tb2.field2 FROM tb1,tb2 WHERE tb1.field2=tb2.field2 AND tb1.field2=『BU1032』 AND tb2.field2= 『aaa』
不如:
declare @a varchar(80)
SELECT @a=field2 FROM tb2 WHERE field2=『aaa』
SELECT tb1.field3,tb1.field4,@a FROM tb1 WHERE field2= 『aaa』
(16) 子查詢
用exists/not exists代替in/not in操作
比較:
SELECT a.field1 FROM a WHERE a.field2 IN(SELECT b.field1 FROM b WHERE b.field2=100)
SELECT a.field1 FROM a WHERE EXISTS( SELECT 1 FROM b WHERE a.field2=b.field1 AND b.field2=100)
SELECT field1 FROM a WHERE field1 NOT IN( SELECT field2 FROM b)
SELECT field1 FROM a WHERE NOT EXISTS( SELECT 1 FROM b WHERE b.field2=a.field1)
(17) 主、外鍵主要用於數據約束,sybase中創建主鍵時會自動創建索引,外鍵與索引無關,提高性能必須再建索引。
(18) char類型的欄位不建索引比int類型的欄位不建索引更糟糕。建索引後性能只稍差一點。
(19) 使用count(*)而不要使用count(column_name),避免使用count(DISTINCT column_name)。
(20) 等號右邊盡量不要使用欄位名,如:
SELECT * FROM tb WHERE field1 = field3
(21) 避免使用or條件,因為or不使用索引。
2.避免使用order by和group by字句。
因為使用這兩個子句會佔用大量的臨時空間(tempspace),如果一定要使用,可用視圖、人工生成臨時表的方法來代替。
如果必須使用,先檢查memory、tempdb的大小。
測試證明,特別要避免一個查詢里既使用join又使用group by,速度會非常慢!
3.盡量少用子查詢,特別是相關子查詢。因為這樣會導致效率下降。
一個列的標簽同時在主查詢和where子句中的查詢中出現,那麼很可能當主查詢中的列值改變之後,子查詢必須重新查詢一次。查詢嵌套層次越多,效率越低,因此應當盡量避免子查詢。如果子查詢不可避免,那麼要在子查詢中過濾掉盡可能多的行。
4.消除對大型錶行數據的順序存取
在 嵌套查詢中,對表的順序存取對查詢效率可能產生致命的影響。
比如採用順序存取策略,一個嵌套3層的查詢,如果每層都查詢1000行,那麼這個查詢就要查詢 10億行數據。
避免這種情況的主要方法就是對連接的列進行索引。
例如,兩個表:學生表(學號、姓名、年齡……)和選課表(學號、課程號、成績)。如果兩個 表要做連接,就要在「學號」這個連接欄位上建立索引。
還可以使用並集來避免順序存取。盡管在所有的檢查列上都有索引,但某些形式的where子句強迫優化器使用順序存取。
下面的查詢將強迫對orders表執行順序操作:
SELECT * FROM orders WHERE (customer_num=104 AND order_num>1001) OR order_num=1008
雖然在customer_num和order_num上建有索引,但是在上面的語句中優化器還是使用順序存取路徑掃描整個表。因為這個語句要檢索的是分離的行的集合,所以應該改為如下語句:
SELECT * FROM orders WHERE customer_num=104 AND order_num>1001
UNION
SELECT * FROM orders WHERE order_num=1008
這樣就能利用索引路徑處理查詢。
5.避免困難的正規表達式
MATCHES和LIKE關鍵字支持通配符匹配,技術上叫正規表達式。但這種匹配特別耗費時間。例如:SELECT * FROM customer WHERE zipcode LIKE 「98_ _ _」
即使在zipcode欄位上建立了索引,在這種情況下也還是採用順序掃描的方式。如果把語句改為SELECT * FROM customer WHERE zipcode >「98000」,在執行查詢時就會利用索引來查詢,顯然會大大提高速度。
另外,還要避免非開始的子串。例如語句:SELECT * FROM customer WHERE zipcode[2,3] >「80」,在where子句中採用了非開始子串,因而這個語句也不會使用索引。
6.使用臨時表加速查詢
把表的一個子集進行排序並創建臨時表,有時能加速查詢。它有助於避免多重排序操作,而且在其他方面還能簡化優化器的工作。例如:
SELECT cust.name,rcvbles.balance,……other COLUMNS
FROM cust,rcvbles
WHERE cust.customer_id = rcvlbes.customer_id
AND rcvblls.balance>0
AND cust.postcode>「98000」
ORDER BY cust.name
如果這個查詢要被執行多次而不止一次,可以把所有未付款的客戶找出來放在一個臨時文件中,並按客戶的名字進行排序:
SELECT cust.name,rcvbles.balance,……other COLUMNS
FROM cust,rcvbles
WHERE cust.customer_id = rcvlbes.customer_id
AND rcvblls.balance>;0
ORDER BY cust.name
INTO TEMP cust_with_balance
然後以下面的方式在臨時表中查詢:
SELECT * FROM cust_with_balance
WHERE postcode>「98000」
臨時表中的行要比主表中的行少,而且物理順序就是所要求的順序,減少了磁碟I/O,所以查詢工作量可以得到大幅減少。
注意:臨時表創建後不會反映主表的修改。在主表中數據頻繁修改的情況下,注意不要丟失數據。
7.用排序來取代非順序存取
非順序磁碟存取是最慢的操作,表現在磁碟存取臂的來回移動。SQL語句隱藏了這一情況,使得我們在寫應用程序時很容易寫出要求存取大量非順序頁的查詢。

B. 資料庫中的"索引"用來做什麼用啊~

第二次回答:
問題補充:能不能具體點,新建一個索引就可以了嗎
基本上可以這么說,不過你也可以修改索引。

記住:
索引其實關鍵目的是為了加快檢索速度而建立的,所以,怎麼用索引是資料庫系統本身的事情,作為資料庫設計或使用者,設計並創建好索引然後體驗加上索引後的查詢變快的感覺就行了。所以,索引怎麼用就變為了「怎麼創建合適的索引」

以下回答是否符合你的要求?你還有什麼問題?

第一次回答:
一、索引是什麼

索引是與表或視圖關聯的磁碟上結構,可以加快從表或視圖中檢索行的速度。索引包含由表或視圖中的一列或多列生成的鍵。這些鍵存儲在一個結構(B 樹)中,使 SQL Server 可以快速有效地查找與鍵值關聯的行。

表或視圖可以包含以下類型的索引:

* 聚集
o 聚集索引根據數據行的鍵值在表或視圖中排序和存儲這些數據行。索引定義中包含聚集索引列。每個表只能有一個聚集索引,因為數據行本身只能按一個順序排序。
o 只有當表包含聚集索引時,表中的數據行才按排序順序存儲。如果表具有聚集索引,則該表稱為聚集表。如果表沒有聚集索引,則其數據行存儲在一個稱為堆的無序結構中。
* 非聚集
o 非聚集索引具有獨立於數據行的結構。非聚集索引包含非聚集索引鍵值,並且每個鍵值項都有指向包含該鍵值的數據行的指針。
o 從非聚集索引中的索引行指向數據行的指針稱為行定位器。行定位器的結構取決於數據頁是存儲在堆中還是聚集表中。對於堆,行定位器是指向行的指針。對於聚集表,行定位器是聚集索引鍵。
o 您可以向非聚集索引的葉級添加非鍵列以跳過現有的索引鍵限制(900 位元組和 16 鍵列),並執行完整范圍內的索引查詢。

聚集索引和非聚集索引都可以是唯一的。這意味著任何兩行都不能有相同的索引鍵值。另外,索引也可以不是唯一的,即多行可以共享同一鍵值。

每當修改了表數據後,都會自動維護表或視圖的索引。

索引和約束

對表列定義了 PRIMARY KEY 約束和 UNIQUE 約束時,會自動創建索引。例如,如果創建了表並將一個特定列標識為主鍵,則 資料庫引擎自動對該列創建 PRIMARY KEY 約束和索引。有關詳細信息,請參閱創建索引(資料庫引擎)。

二、索引有什麼用

與書中的索引一樣,資料庫中的索引使您可以快速找到表或索引視圖中的特定信息。索引包含從表或視圖中一個或多個列生成的鍵,以及映射到指定數據的存儲位置的指針。通過創建設計良好的索引以支持查詢,可以顯著提高資料庫查詢和應用程序的性能。索引可以減少為返回查詢結果集而必須讀取的數據量。索引還可以強製表中的行具有唯一性,從而確保表數據的數據完整性。

設計良好的索引可以減少磁碟 I/O 操作,並且消耗的系統資源也較少,從而可以提高查詢性能。對於包含 SELECT、UPDATE、DELETE 或 MERGE 語句的各種查詢,索引會很有用。例如,在 AdventureWorks 資料庫中執行的查詢 SELECT Title, HireDate FROM HumanResources.Employee WHERE EmployeeID = 250。執行此查詢時,查詢優化器評估可用於檢索數據的每個方法,然後選擇最有效的方法。可能採用的方法包括掃描表和掃描一個或多個索引(如果有)。

掃描表時,查詢優化器讀取表中的所有行,並提取滿足查詢條件的行。掃描表會有許多磁碟 I/O 操作,並佔用大量資源。但是,如果查詢的結果集是占表中較高百分比的行,掃描表會是最為有效的方法。

查詢優化器使用索引時,搜索索引鍵列,查找到查詢所需行的存儲位置,然後從該位置提取匹配行。通常,搜索索引比搜索表要快很多,因為索引與表不同,一般每行包含的列非常少,且行遵循排序順序。

查詢優化器在執行查詢時通常會選擇最有效的方法。但如果沒有索引,則查詢優化器必須掃描表。您的任務是設計並創建最適合您的環境的索引,以便查詢優化器可以從多個有效的索引中選擇。SQL Server 提供的資料庫引擎優化顧問可以幫助分析資料庫環境並選擇適當的索引。

三、索引怎麼用

索引其實關鍵目的是為了加快檢索速度而建立的,所以,怎麼用索引是資料庫系統本身的事情,作為資料庫設計或使用者,設計並創建好索引然後體驗加上索引後的查詢變快的感覺就行了。所以,索引怎麼用就變為了「怎麼創建合適的索引」,以下說明這個問題:

索引設計不佳和缺少索引是提高資料庫和應用程序性能的主要障礙。設計高效的索引對於獲得良好的資料庫和應用程序性能極為重要。為資料庫及其工作負荷選擇正確的索引是一項需要在查詢速度與更新所需開銷之間取得平衡的復雜任務。如果索引較窄,或者說索引關鍵字中只有很少的幾列,則需要的磁碟空間和維護開銷都較少。而另一方面,寬索引可覆蓋更多的查詢。您可能需要試驗若干不同的設計,才能找到最有效的索引。可以添加、修改和刪除索引而不影響資料庫架構或應用程序設計。因此,應試驗多個不同的索引而無需猶豫。

SQL Server 中的查詢優化器可在大多數情況下可靠地選擇最高效的索引。總體索引設計策略應為查詢優化器提供可供選擇的多個索引,並依賴查詢優化器做出正確的決定。這在多種情況下可減少分析時間並獲得良好的性能。若要查看查詢優化器對特定查詢使用的索引,請在 SQL Server Management Studio 中的「查詢」菜單上選擇「包括實際的執行計劃」。

不要總是將索引的使用等同於良好的性能,或者將良好的性能等同於索引的高效使用。如果只要使用索引就能獲得最佳性能,那查詢優化器的工作就簡單了。但事實上,不正確的索引選擇並不能獲得最佳性能。因此,查詢優化器的任務是只在索引或索引組合能提高性能時才選擇它,而在索引檢索有礙性能時則避免使用它。

建議的索引設計策略包括以下任務:

1. 了解資料庫本身的特徵。例如,它是頻繁修改數據的聯機事務處理 (OLTP) 資料庫,還是主要包含只讀數據的決策支持系統 (DSS) 或數據倉庫 (OLAP) 資料庫?
2. 了解最常用的查詢的特徵。例如,了解到最常用的查詢聯接兩個或多個表將有助於決定要使用的最佳索引類型。
3. 了解查詢中使用的列的特徵。例如,某個索引對於含有整數數據類型同時還是唯一的或非空的列是理想索引。篩選索引適用於具有定義完善的數據子集的列。
4. 確定哪些索引選項可在創建或維護索引時提高性能。例如,對現有某個大型表創建聚集索引將會受益於 ONLINE 索引選項。ONLINE 選項允許在創建索引或重新生成索引時繼續對基礎數據執行並發活動。
5. 確定索引的最佳存儲位置。非聚集索引可以與基礎表存儲在同一個文件組中,也可以存儲在不同的文件組中。索引的存儲位置可通過提高磁碟 I/O 性能來提高查詢性能。例如,將非聚集索引存儲在表文件組所在磁碟以外的某個磁碟上的一個文件組中可以提高性能,因為可以同時讀取多個磁碟。
或者,聚集索引和非聚集索引也可以使用跨越多個文件組的分區方案。在維護整個集合的完整性時,使用分區可以快速而有效地訪問或管理數據子集,從而使大型表或索引更易於管理。有關詳細信息,請參閱已分區表和已分區索引。在考慮分區時,應確定是否應對齊索引,即,是按實質上與表相同的方式進行分區,還是單獨分區。

# 設計索引。
索引設計是一項關鍵任務。索引設計包括確定要使用的列,選擇索引類型(例如聚集或非聚集),選擇適當的索引選項,以及確定文件組或分區方案布置。

# 確定最佳的創建方法。按照以下方法創建索引:

* 使用 CREATE TABLE 或 ALTER TABLE 對列定義 PRIMARY KEY 或 UNIQUE 約束
SQL Server 資料庫引擎自動創建唯一索引來強制 PRIMARY KEY 或 UNIQUE 約束的唯一性要求。默認情況下,創建的唯一聚集索引可以強制 PRIMARY KEY 約束,除非表中已存在聚集索引或指定了唯一的非聚集索引。默認情況下,創建的唯一非聚集索引可以強制 UNIQUE 約束,除非已明確指定唯一的聚集索引且表中不存在聚集索引。
還可以指定索引選項和索引位置、文件組或分區方案。
創建為 PRIMARY KEY 或 UNIQUE 約束的一部分的索引將自動給定與約束名稱相同的名稱。

* 使用 CREATE INDEX 語句或 SQL Server Management Studio 對象資源管理器中的「新建索引」對話框創建獨立於約束的索引
必須指定索引的名稱、表以及應用該索引的列。還可以指定索引選項和索引位置、文件組或分區方案。默認情況下,如果未指定聚集或唯一選項,將創建非聚集的非唯一索引。若要創建篩選索引,請使用可選的 WHERE 子句。

# 創建索引。
要考慮的一個重要因素是對空表還是對包含數據的表創建索引。對空表創建索引在創建索引時不會對性能產生任何影響,而向表中添加數據時,會對性能產生影響。
對大型表創建索引時應仔細計劃,這樣才不會影響資料庫性能。對大型表創建索引的首選方法是先創建聚集索引,然後創建任何非聚集索引。在對現有表創建索引時,請考慮將 ONLINE 選項設置為 ON。該選項設置為 ON 時,將不持有長期表鎖以繼續對基礎表的查詢或更新。

簡單的創建索引,可採用如下語句:
CREATE INDEX IX_ProctVendor_VendorID
ON Purchasing.ProctVendor (VendorID, VendorName);
GO

C. 設計資料庫中的索引有什麼作用

設計資料庫中的索引可以大大提高系統的性能:

1、通過創建唯一性索引,可以保證資料庫表中每一行數據的唯一性。

2、可以大大加快數據的檢索速度,這也是創建索引的最主要的原因。

3、可以加速表和表之間的連接,特別是在實現數據的參考完整性方面特別有意義。

4、在使用分組和排序 子句進行數據檢索時,同樣可以顯著減少查詢中分組和排序的時間。

5、通過使用索引,可以在查詢的過程中,使用優化隱藏器,提高系統的性能。

(3)資料庫索引使用擴展閱讀

索引是建立在資料庫表中的某些列的上面。因此,在創建索引的時候,應該仔細考慮在哪些列上可以創建索引,在哪些列上不能創建索引。一般來說,應該在這些列上創建索引,例如:

1、在經常需要搜索的列上,可以加快搜索的速度。

2、在作為主鍵的列上,強制該列的唯一性和組織表中數據的排列結構。

3、在經常用在連接的列上,這 些列主要是一些外鍵,可以加快連接的速度。

4、在經常需要根據范圍進行搜索的列上創建索引,因為索引已經排序,其指定的范圍是連續的。

5、在經常需要排序的列上創 建索引,因為索引已經排序,這樣查詢可以利用索引的排序,加快排序查詢時間。

6、在經常使用在WHERE子句中的列上面創建索引,加快條件的判斷速度。

D. 在數據表中索引有什麼用,怎麼建立索引

引用於快速找出在抄某個列中有一特定值的行,不使用索引,MySQL必須從第一條記錄開始讀完整個表,直到找出相關的行,表越大,查詢數據所花費的時間就越多。建立索引的操作步驟如下:

1、首先我們打開一個要操作的數據表,如下圖所示,我們需要給name欄位添加索引。

E. mysql資料庫,索引是怎麼使用的

MySQL支持很多數據類型,選擇合適的數據類型存儲數據對性能有很大的影響。通常來說,可以遵循以下一些指導原則:
(1)越小的數據類型通常更好:越小的數據類型通常在磁碟、內存和CPU緩存中都需要更少的空間,處理起來更快。
(2)簡單的數據類型更好:整型數據比起字元,處理開銷更小,因為字元串的比較更復雜。在MySQL中,應該用內置的日期和時間數據類型,而不是用字元串來存儲時間;以及用整型數據類型存儲IP地址。
(3)盡量避免NULL:應該指定列為NOT NULL,除非你想存儲NULL。在MySQL中,含有空值的列很難進行查詢優化,因為它們使得索引、索引的統計信息以及比較運算更加復雜。你應該用0、一個特殊的值或者一個空串代替空值。

F. 資料庫中的常規索引怎麼使用

索引不需要你主動去調用的,一般當數據量比較大時(至少也要上萬),可以在經常作為where後面查詢的列上面見索引,這樣查詢速度就會快些!

G. 請問資料庫的索引創建後要怎麼用啊

應該建索引的欄位:1.經常作為查詢條件的欄位2.外鍵3.經常需要排序的欄位4.分組排序的欄位

應該少建或者不建索引的欄位有:1.表記錄太少,2.經常需要插入,刪除,修改的表,3.表中數據重復且分布平均的欄位

一些SQL的寫法會限制索引的使用:1.where子句中如果使用in、or、like、!= >,均會導致索引不能正常使用,將">"換成">and=chr(0)";2.使用函數時,該列就不能使用索引。3.比較不匹配數據類型時,該索引將會被忽略。

一些SQL語句優化的寫法:1.如果from是雙表的查詢時,大表放在前面,小表放在後面(基礎表)。最後面的表是基礎表。(只在基於規則的優化器中有效)2.如果三表查詢時,選擇交叉表(intersection table)作為基礎表.(只在基於規則的優化器中有效)3.寫where條件時,有索引欄位的判斷在前,其它欄位的判斷在後;如果where條件中用到復合索引,按照索引列在復合索引中出現的順序來依次寫where條件;4.查詢數量較大時,使用表連接代替IN,EXISTS,NOT IN,NOT EXISTS等。5.ORACLE採用自下而上的順序解析WHERE子句,那些可以過濾掉最大數量記錄的條件必須寫在WHERE子句的末尾.

H. 資料庫索引的作用

為什麼要創建索引呢?這是因為,創建索引可以大大提高系統的性能。第一,通過創建唯一性索引,可以保證資料庫表中每一行數據的唯一性。第二,可以大大加快 數據的檢索速度,這也是創建索引的最主要的原因。第三,可以加速表和表之間的連接,特別是在實現數據的參考完整性方面特別有意義。第四,在使用分組和排序 子句進行數據檢索時,同樣可以顯著減少查詢中分組和排序的時間。第五,通過使用索引,可以在查詢的過程中,使用優化隱藏器,提高系統的性能。

也許會有人要問:增加索引有如此多的優點,為什麼不對表中的每一個列創建一個索引呢?這種想法固然有其合理性,然而也有其片面性。雖然,索引有許多優點, 但是,為表中的每一個列都增加索引,是非常不明智的。這是因為,增加索引也有許多不利的一個方面。第一,創建索引和維護索引要耗費時間,這種時間隨著數據 量的增加而增加。第二,索引需要佔物理空間,除了數據表占數據空間之外,每一個索引還要佔一定的物理空間,如果要建立聚簇索引,那麼需要的空間就會更大。 第三,當對表中的數據進行增加、刪除和修改的時候,索引也要動態的維護,這樣就降低了數據的維護速度。

索引是建立在資料庫表中的某些列的上面。因此,在創建索引的時候,應該仔細考慮在哪些列上可以創建索引,在哪些列上不能創建索引。一般來說,應該在這些列 上創建索引,例如:在經常需要搜索的列上,可以加快搜索的速度;在作為主鍵的列上,強制該列的唯一性和組織表中數據的排列結構;在經常用在連接的列上,這 些列主要是一些外鍵,可以加快連接的速度;在經常需要根據范圍進行搜索的列上創建索引,因為索引已經排序,其指定的范圍是連續的;在經常需要排序的列上創 建索引,因為索引已經排序,這樣查詢可以利用索引的排序,加快排序查詢時間;在經常使用在WHERE子句中的列上面創建索引,加快條件的判斷速度。

同樣,對於有些列不應該創建索引。一般來說,不應該創建索引的的這些列具有下列特點:第一,對於那些在查詢中很少使用或者參考的列不應該創建索引。這是因 為,既然這些列很少使用到,因此有索引或者無索引,並不能提高查詢速度。相反,由於增加了索引,反而降低了系統的維護速度和增大了空間需求。第二,對於那 些只有很少數據值的列也不應該增加索引。這是因為,由於這些列的取值很少,例如人事表的性別列,在查詢的結果中,結果集的數據行佔了表中數據行的很大比 例,即需要在表中搜索的數據行的比例很大。增加索引,並不能明顯加快檢索速度。第三,對於那些定義為text, image和bit數據類型的列不應該增加索引。這是因為,這些列的數據量要麼相當大,要麼取值很少。第四,當修改性能遠遠大於檢索性能時,不應該創建索 引。這是因為,修改性能和檢索性能是互相矛盾的。當增加索引時,會提高檢索性能,但是會降低修改性能。當減少索引時,會提高修改性能,降低檢索性能。因 此,當修改性能遠遠大於檢索性能時,不應該創建索引。

創建索引的方法和索引的特徵
創建索引的方法 51aspx.com
創建索引有多種方法,這些方法包括直接創建索引的方法和間接創建索引的方法。直接創建索引,例如使用CREATE INDEX語句或者使用創建索引向導,間接創建索引,例如在表中定義主鍵約束或者唯一性鍵約束時,同時也創建了索引。雖然,這兩種方法都可以創建索引,但 是,它們創建索引的具體內容是有區別的。
使用CREATE INDEX語句或者使用創建索引向導來創建索引,這是最基本的索引創建方式,並且這種方法最具有柔性,可以定製創建出符合自己需要的索引。在使用這種方式 創建索引時,可以使用許多選項,例如指定數據頁的充滿度、進行排序、整理統計信息等,這樣可以優化索引。使用這種方法,可以指定索引的類型、唯一性和復合 性,也就是說,既可以創建聚簇索引,也可以創建非聚簇索引,既可以在一個列上創建索引,也可以在兩個或者兩個以上的列上創建索引。

通過定義主鍵約束或者唯一性鍵約束,也可以間接創建索引。主鍵約束是一種保持數據完整性的邏輯,它限製表中的記錄有相同的主鍵記錄。在創建主鍵約束時,系 統自動創建了一個唯一性的聚簇索引。雖然,在邏輯上,主鍵約束是一種重要的結構,但是,在物理結構上,與主鍵約束相對應的結構是唯一性的聚簇索引。換句話 說,在物理實現上,不存在主鍵約束,而只存在唯一性的聚簇索引。同樣,在創建唯一性鍵約束時,也同時創建了索引,這種索引則是唯一性的非聚簇索引。因此, 當使用約束創建索引時,索引的類型和特徵基本上都已經確定了,由用戶定製的餘地比較小。

當在表上定義主鍵或者唯一性鍵約束時,如果表中已經有了使用CREATE INDEX語句創建的標准索引時,那麼主鍵約束或者唯一性鍵約束創建的索引覆蓋以前創建的標准索引。也就是說,主鍵約束或者唯一性鍵約束創建的索引的優先 級高於使用CREATE INDEX語句創建的索引。

索引的特徵
索引有兩個特徵,即唯一性索引和復合索引。
唯一性索引保證在索引列中的全部數據是唯一的,不會包含冗餘數據。如果表中已經有一個主鍵約束或者唯一性鍵約束,那麼當創建表或者修改表時,SQL Server自動創建一個唯一性索引。然而,如果必須保證唯一性,那麼應該創建主鍵約束或者唯一性鍵約束,而不是創建一個唯一性索引。當創建唯一性索引 時,應該認真考慮這些規則:當在表中創建主鍵約束或者唯一性鍵約束時,SQL Server自動創建一個唯一性索引;如果表中已經包含有數據,那麼當創建索引時,SQL Server檢查表中已有數據的冗餘性;每當使用插入語句插入數據或者使用修改語句修改數據時,SQL Server檢查數據的冗餘性:如果有冗餘值,那麼SQL Server取消該語句的執行,並且返回一個錯誤消息;確保表中的每一行數據都有一個唯一值,這樣可以確保每一個實體都可以唯一確認;只能在可以保證實體 完整性的列上創建唯一性索引,例如,不能在人事表中的姓名列上創建唯一性索引,因為人們可以有相同的姓名。

復合索引就是一個索引創建在兩個列或者多個列上。在搜索時,當兩個或者多個列作為一個關鍵值時,最好在這些列上創建復合索引。當創建復合索引時,應該考慮 這些規則:最多可以把16個列合並成一個單獨的復合索引,構成復合索引的列的總長度不能超過900位元組,也就是說復合列的長度不能太長;在復合索引中,所 有的列必須來自同一個表中,不能跨表建立復合列;在復合索引中,列的排列順序是非常重要的,因此要認真排列列的順序,原則上,應該首先定義最唯一的列,例 如在(COL1,COL2)上的索引與在(COL2,COL1)上的索引是不相同的,因為兩個索引的列的順序不同;為了使查詢優化器使用復合索引,查詢語 句中的WHERE子句必須參考復合索引中第一個列;當表中有多個關鍵列時,復合索引是非常有用的;使用復合索引可以提高查詢性能,減少在一個表中所創建的 索引數量。

索引的類型
根據索引的順序與數據表的物理順序是否相同,可以把索引分成兩種類型。一種是數據表的物理順序與索引順序相同的聚簇索引,另一種是數據表的物理順序與索引順序不相同的非聚簇索引。

聚簇索引的體系結構
索引的結構類似於樹狀結構,樹的頂部稱為葉級,樹的其它部分稱為非葉級,樹的根部在非葉級中。同樣,在聚簇索引中,聚簇索引的葉級和非葉級構成了一個樹狀 結構,索引的最低級是葉級。在聚簇索引中,表中的數據所在的數據頁是葉級,在葉級之上的索引頁是非葉級,索引數據所在的索引頁是非葉級。在聚簇索引中,數 據值的順序總是按照升序排列。

應該在表中經常搜索的列或者按照順序訪問的列上創建聚簇索引。當創建聚簇索引時,應該考慮這些因素:每一個表只能有一個聚簇索引,因為表中數據的物理順序 只能有一個;表中行的物理順序和索引中行的物理順序是相同的,在創建任何非聚簇索引之前創建聚簇索引,這是因為聚簇索引改變了表中行的物理順序,數據行按 照一定的順序排列,並且自動維護這個順序;關鍵值的唯一性要麼使用UNIQUE關鍵字明確維護,要麼由一個內部的唯一標識符明確維護,這些唯一性標識符是 系統自己使用的,用戶不能訪問;聚簇索引的平均大小大約是數據表的百分之五,但是,實際的聚簇索引的大小常常根據索引列的大小變化而變化;在索引的創建過 程中,SQL Server臨時使用當前資料庫的磁碟空間,當創建聚簇索引時,需要1.2倍的表空間的大小,因此,一定要保證有足夠的空間來創建聚簇索引。

當系統訪問表中的數據時,首先確定在相應的列上是否存在有索引和該索引是否對要檢索的數據有意義。如果索引存在並且該索引非常有意義,那麼系統使用該索引 訪問表中的記錄。系統從索引開始瀏覽到數據,索引瀏覽則從樹狀索引的根部開始。從根部開始,搜索值與每一個關鍵值相比較,確定搜索值是否大於或者等於關鍵 值。這一步重復進行,直到碰上一個比搜索值大的關鍵值,或者該搜索值大於或者等於索引頁上所有的關鍵值為止。

非聚簇索引的體系結構
非聚簇索引的結構也是樹狀結構,與聚簇索引的結構非常類似,但是也有明顯的不同。
在非聚簇索引中,葉級僅包含關鍵值,而沒有包含數據行。非聚簇索引表示行的邏輯順序。 非聚簇索引有兩種體系結構:一種體系結構是在沒有聚簇索引的表上創建非聚簇索引,另一種體系結構是在有聚簇索引的表上創建非聚簇索引。

如果一個數據表中沒有聚簇索引,那麼這個數據表也稱為數據堆。當非聚簇索引在數據堆的頂部創建時,系統使用索引頁中的行標識符指向數據頁中的記錄。行標識 符存儲了數據所在位置的信息。數據堆是通過使用索引分配圖(IAM)頁來維護的。IAM頁包含了數據堆所在簇的存儲信息。在系統表sysindexes 中,有一個指針指向了與數據堆相關的第一個IAM頁。系統使用IAM頁在數據堆中瀏覽和尋找可以插入新的記錄行的空間。這些數據頁和在這些數據頁中的記錄 沒有任何的順序並且也沒有鏈接在一起。在這些數據頁之間的唯一的連接是IAM中記錄的順序。當在數據堆上創建了非聚簇索引時,葉級中包含了指向數據頁的行 標識符。行標識符指定記錄行的邏輯順序,由文件ID、頁號和行ID組成。這些行的標識符維持唯一性。非聚簇索引的葉級頁的順序不同於表中數據的物理順序。 這些關鍵值在葉級中以升序維持。

當非聚簇索引創建在有聚簇索引的表上的時候,系統使用索引頁中的指向聚簇索引的聚簇鍵。聚簇鍵存儲了數據的位置信息。如果某一個表有聚簇索引,那麼非聚簇 索引的葉級包含了映射到聚簇鍵的聚簇鍵值,而不是映射到物理的行標識符。當系統訪問有非聚簇索引的表中數據時,並且這種非聚簇索引創建在聚簇索引上,那麼 它首先從非聚簇索引來找到指向聚簇索引的指針,然後通過使用聚簇索引來找到數據。
當需要以多種方式檢索數據時,非聚簇索引是非常有用的。當創建非聚簇索引時,要考慮這些情況:在預設情況下,所創建的索引是非聚簇索引;在每一個表上面,可以創建不多於249個非聚簇索引,而聚簇索引最多隻能有一個。
系統如何訪問表中的數據
一般地,系統訪問資料庫中的數據,可以使用兩種方法:表掃描和索引查找。第一種方法是表掃描,就是指系統將指針放置在該表的表頭數據所在的數據頁上,然後 按照數據頁的排列順序,一頁一頁地從前向後掃描該表數據所佔有的全部數據頁,直至掃描完表中的全部記錄。在掃描時,如果找到符合查詢條件的記錄,那麼就將 這條記錄挑選出來。最後,將全部挑選出來符合查詢語句條件的記錄顯示出來。第二種方法是使用索引查找。索引是一種樹狀結構,其中存儲了關鍵字和指向包含關 鍵字所在記錄的數據頁的指針。當使用索引查找時,系統沿著索引的樹狀結構,根據索引中關鍵字和指針,找到符合查詢條件的的記錄。最後,將全部查找到的符合 查詢語句條件的記錄顯示出來。
在SQL Server中,當訪問資料庫中的數據時,由SQL Server確定該表中是否有索引存在。如果沒有索引,那麼SQL Server使用表掃描的方法訪問資料庫中的數據。查詢處理器根據分布的統計信息生成該查詢語句的優化執行規劃,以提高訪問數據的效率為目標,確定是使用 表掃描還是使用索引。
索引的選項
在創建索引時,可以指定一些選項,通過使用這些選項,可以優化索引的性能。這些選項包括FILLFACTOR選項、PAD_INDEX選項和SORTED_DATA_REORG選項。
使用FILLFACTOR選項,可以優化插入語句和修改語句的性能。當某個索引頁變滿時,SQL Server必須花費時間分解該頁,以便為新的記錄行騰出空間。使用FILLFACTOR選項,就是在葉級索引頁上分配一定百分比的自由空間,以便減少頁 的分解時間。當在有數據的表中創建索引時,可以使用FILLFACTOR選項指定每一個葉級索引節點的填充的百分比。預設值是0,該數值等價於100。在 創建索引的時候,內部索引節點總是留有了一定的空間,這個空間足夠容納一個或者兩個表中的記錄。在沒有數據的表中,當創建索引的時候,不要使用該選項,因 為這時該選項是沒有實際意義的。另外,該選項的數值在創建時指定以後,不能動態地得到維護,因此,只應該在有數據的表中創建索引時才使用。
PAD_INDEX選項將FILLFACTOR選項的數值同樣也用於內部的索引節點,使內部的索引節點的填充度與葉級索引的節點中的填充度相同。如果沒有 指定FILLFACTOR選項,那麼單獨指定PAD_INDEX選項是沒有實際意義的,這是因為PAD_INDEX選項的取值是由FILLFACTOR選 項的取值確定的。
當創建聚簇索引時,SORTED_DATA_REORG選項清除排序,因此可以減少建立聚簇索引所需要的時間。當在一個已經變成碎塊的表上創建或者重建聚 簇索引時,使用SORTED_DATA_REORG選項可以壓縮數據頁。當重新需要在索引上應用填充度時,也使用該選項。當使用 SORTED_DATA_REORG選項時,應該考慮這些因素:SQL Server確認每一個關鍵值是否比前一個關鍵值高,如果都不高,那麼不能創建索引;SQL Server要求1.2倍的表空間來物理地重新組織數據;使用SORTED_DATA_REORG選項,通過清除排序進程而加快索引創建進程;從表中物理 地拷貝數據;當某一個行被刪除時,其所佔的空間可以重新利用;創建全部非聚簇索引;如果希望把葉級頁填充到一定的百分比,可以同時使用 FILLFACTOR選項和SORTED_DATA_REORG選項。
索引的維護
為了維護系統性能,索引在創建之後,由於頻繁地對數據進行增加、刪除、修改等操作使得索引頁發生碎塊,因此,必須對索引進行維護。
使用DBCC SHOWCONTIG語句,可以顯示表的數據和索引的碎塊信息。當執行DBCC SHOWCONTIG語句時,SQL Server瀏覽葉級上的整個索引頁,來確定表或者指定的索引是否嚴重碎塊。DBCC SHOWCONTIG語句還能確定數據頁和索引頁是否已經滿了。當對表進行大量的修改或者增加大量的數據之後,或者表的查詢非常慢時,應該在這些表上執行 DBCC SHOWCONTIG語句。當執行DBCC SHOWCONTIG語句時,應該考慮這些因素:當執行DBCC SHOWCONTIG語句時,SQL Server要求指定表的ID號或者索引的ID號,表的ID號或者索引的ID號可以從系統表sysindexes中得到;應該確定多長時間使用一次 DBCC SHOWCONTIG語句,這個時間長度要根據表的活動情況來定,每天、每周或者每月都可以。
使用DBCC DBREINDEX語句重建表的一個或者多個索引。當希望重建索引和當表上有主鍵約束或者唯一性鍵約束時,執行DBCC DBREINDEX語句。除此之外,執行DBCC DBREINDEX語句還可以重新組織葉級索引頁的存儲空間、刪除碎塊和重新計算索引統計。當使用執行DBCC DBREINDEX語句時,應該考慮這些因素:根據指定的填充度,系統重新填充每一個葉級頁;使用DBCC DBREINDEX語句重建主鍵約束或者唯一性鍵約束的索引;使用SORTED_DATA_REORG選項可以更快地創建聚簇索引,如果沒有排列關鍵值, 那麼不能使用DBCC DBREINDEX語句;DBCC DBREINDEX語句不支持系統表。另外,還可以使用資料庫維護規劃向導自動地進行重建索引的進程。
統計信息是存儲在SQL Server中的列數據的樣本。這些數據一般地用於索引列,但是還可以為非索引列創建統計。SQL Server維護某一個索引關鍵值的分布統計信息,並且使用這些統計信息來確定在查詢進程中哪一個索引是有用的。查詢的優化依賴於這些統計信息的分布准確 度。查詢優化器使用這些數據樣本來決定是使用表掃描還是使用索引。當表中數據發生變化時,SQL Server周期性地自動修改統計信息。索引統計被自動地修改,索引中的關鍵值顯著變化。統計信息修改的頻率由索引中的數據量和數據改變數確定。例如,如 果表中有10000行數據,1000行數據修改了,那麼統計信息可能需要修改。然而,如果只有50行記錄修改了,那麼仍然保持當前的統計信息。除了系統自 動修改之外,用戶還可以通過執行UPDATE STATISTICS語句或者sp_updatestats系統存儲過程來手工修改統計信息。使用UPDATE STATISTICS語句既可以修改表中的全部索引,也可以修改指定的索引。
使用SHOWPLAN和STATISTICS IO語句可以分析索引和查詢性能。使用這些語句可以更好地調整查詢和索引。SHOWPLAN語句顯示在連接表中使用的查詢優化器的每一步以及表明使用哪一 個索引訪問數據。使用SHOWPLAN語句可以查看指定查詢的查詢規劃。當使用SHOWPLAN語句時,應該考慮這些因素。SET SHOWPLAN_ALL語句返回的輸出結果比SET SHOWPLAN_TEXT語句返回的輸出結果詳細。然而,應用程序必須能夠處理SET SHOWPLAN_ALL語句返回的輸出結果。SHOWPLAN語句生成的信息只能針對一個會話。如果重新連接SQL Server,那麼必須重新執行SHOWPLAN語句。STATISTICS IO語句表明輸入輸出的數量,這些輸入輸出用來返回結果集和顯示指定查詢的邏輯的和物理的I/O的信息。可以使用這些信息來確定是否應該重寫查詢語句或者 重新設計索引。使用STATISTICS IO語句可以查看用來處理指定查詢的I/O信息。
就象SHOWPLAN語句一樣,優化器隱藏也用來調整查詢性能。優化器隱藏可以對查詢性能提供較小的改進,並且如果索引策略發生了改變,那麼這種優化器隱 藏就毫無用處了。因此,限制使用優化器隱藏,這是因為優化器隱藏更有效率和更有柔性。當使用優化器隱藏時,考慮這些規則:指定索引名稱、當 index_id為0時為使用表掃描、當index_id為1時為使用聚簇索引;優化器隱藏覆蓋查詢優化器,如果數據或者環境發生了變化,那麼必須修改優 化器隱藏。
索引調整向導
索引調整向導是一種工具,可以分析一系列資料庫的查詢語句,提供使用一系列資料庫索引的建議,優化整個查詢語句的性能。對於查詢語句,需要指定下列內容:
查詢語句,這是將要優化的工作量
包含了這些表的資料庫,在這些表中,可以創建索引,提高查詢性能
在分析中使用的表
在分析中,考慮的約束條件,例如索引可以使用的最大磁碟空間
這里指的工作量,可以來自兩個方面:使用SQL Server捕捉的軌跡和包含了SQL語句的文件。索引調整向導總是基於一個已經定義好的工作量。如果一個工作量不能反映正常的操作,那麼它建議使用的索 引不是實際的工作量上性能最好的索引。索引調整向導調用查詢分析器,使用所有可能的組合評定在這個工作量中每一個查詢語句的性能。然後,建議在整個工作量 上可以提高整個查詢語句的性能的索引。如果沒有供索引調整向導來分析的工作量,那麼可以使用圖解器立即創建它。一旦決定跟蹤一條正常資料庫活動的描述樣 本,向導能夠分析這種工作量和推薦能夠提高資料庫工作性能的索引配置。
索引調整向導對工作量進行分析之後,可以查看到一系列的報告,還可以使該向導立即創建所建議的最佳索引,或者使這項工作成為一種可以調度的作業,或者生成一個包含創建這些索引的SQL語句的文件。
索引調整向導允許為SQL Server資料庫選擇和創建一種理想的索引組合和統計,而不要求對資料庫結構、工作量或者SQL Server內部達到專家的理解程度。總之,索引調整向導能夠作到以下幾個方面的工作:
通過使用查詢優化器來分析工作量中的查詢任務,向有大量工作量的資料庫推薦一種最佳的索引混合方式
分析按照建議作出改變之後的效果,包括索引的用法、表間查詢的分布和大量工作中查詢的工作效果
為少量查詢任務推薦調整資料庫的方法
通過設定高級選項如磁碟空間約束、最大的查詢語句數量和每個索引的最多列的數量等,允許定製推薦方式
圖解器
圖解器能夠實時抓取在伺服器中運行的連續圖片,可以選取希望監測的項目和事件,包括Transact-SQL語句和批命令、對象的用法、鎖定、安全事件和 錯誤。圖解器能夠過濾這些事件,僅僅顯示用戶關心的問題。可以使用同一台伺服器或者其他伺服器重復已經記錄的跟蹤事件,重新執行那些已經作了記錄的命令。 通過集中處理這些事件,就能夠很容易監測和調試SQL Server中出現的問題。通過對特定事件的研究,監測和調試SQL Server問題變得簡單多了。
查詢處理器
查詢處理器是一種可以完成許多工作的多用途的工具。在查詢處理器中,可以互動式地輸入和執行各種Transact-SQL語句,並且在一個窗口中可以同時 查看Transact-SQL語句和其結果集;可以在查詢處理器中同時執行多個Transact-SQL語句,也可以執行腳本文件中的部分語句;提供了一 種圖形化分析查詢語句執行規劃的方法,可以報告由查詢處理器選擇的數據檢索方法,並且可以根據查詢規劃調整查詢語句的執行,提出執行可以提高性能的優化索 引建議,這種建議只是針對一條查詢語句的索引建議,只能提高這一條查詢語句的查詢性能。
系統為每一個索引創建一個分布頁,統計信息就是指存儲在分布頁上的某一個表中的一個或者多個索引的關鍵值的分布信息。當執行查詢語句時,為了提高查詢速度 和性能,系統可以使用這些分布信息來確定使用表的哪一個索引。查詢處理器就是依賴於這些分布的統計信息,來生成查詢語句的執行規劃。執行規劃的優化程度依 賴於這些分布統計信息的准確步驟的高低程度。如果這些分布的統計信息與索引的物理信息非常一致,那麼查詢處理器可以生成優化程度很高的執行規劃。相反,如 果這些統計信息與索引的實際存儲的信息相差比較大,那麼查詢處理器生成的執行規劃的優化程度則比較低。
查詢處理器從統計信息中提取索引關鍵字的分布信息,除了用戶可以手工執行UPDATE STATISTICS之外,查詢處理器還可以自動收集統計這些分布信息。這樣,就能夠充分保證查詢處理器使用最新的統計信息,保證執行規劃具有很高的優化 程度,減少了維護的需要。當然,使用查詢處理器生成的執行規劃,也有一些限制。例如,使用執行規劃只能提高單個查詢語句的性能,但是可能對整個系統的性能 產生正面的或者付面的影響,因此,要想提高整個系統的查詢性能,應該使用索引調整向導這樣的工具。
結論
在以前的SQL Server版本中,在一個查詢語句中,一個表上最多使用一個索引。而在SQL Server 7.0中,索引操作得到了增強。SQL Server現在使用索引插入和索引聯合演算法來實現在一個查詢語句中的可以使用多個索引。共享的行標識符用於連接同一個表上的兩個索引。如果某個表中有一 個聚簇索引,因此有一個聚簇鍵,那麼該表上的全部非聚簇索引的葉節點使用該聚簇鍵作為行定位器,而不是使用物理記錄標識符。如果表中沒有聚簇索引,那麼非 聚簇索引繼續使用物理記錄標識符指向數據頁。在上面的兩種情況中,行定位器是非常穩定的。當聚簇索引的葉節點分開時,由於行定位器是有效的,所以非聚簇索 引不需要被修改。如果表中沒有聚簇索引,那麼頁的分開就不會發生。而在以前的版本中,非聚簇索引使用物理記錄標識符如頁號和行號,作為行的定位器。例如, 如果聚簇索引(數據頁)發生分解時,許多記錄行被移動到了一個新的數據頁,因此有了多個新的物理記錄標識符。那麼,所有的非聚簇索引都必須使用這些新的物 理記錄標識符進行修改,這樣就需要耗費大量的時間和資源。
索引調整向導無論對熟練用戶還是新用戶,都是一個很好的工具。熟練用戶可以使用該向導創建一個基本的索引配置,然後在基本的索引配置上面進行調整和定製。新用戶可以使用該向導快速地創建優化的索引。
參考:

I. 資料庫索引有什麼作用和好處

資料庫索引是為了增加查詢速度而對表欄位附加的一種標識。見過很多人機械的理解索引的概念,認為增加索引只有好處沒有壞處。這里想把之前的索引學習筆記總結一下: 首先明白為什麼索引會增加速度,DB在執行一條Sql語句的時候,默認的方式是根據搜索條件進行全表掃描,遇到匹配條件的就加入搜索結果集合。如果我們對某一欄位增加索引,查詢時就會先去索引列表中一次定位到特定值的行數,大大減少遍歷匹配的行數,所以能明顯增加查詢的速度。那麼在任何時候都應該加索引么?這里有幾個反例:1、如果每次都需要取到所有表記錄,無論如何都必須進行全表掃描了,那麼是否加索引也沒有意義了。2、對非唯一的欄位,例如「性別」這種大量重復值的欄位,增加索引也沒有什麼意義。3、對於記錄比較少的表,增加索引不會帶來速度的優化反而浪費了存儲空間,因為索引是需要存儲空間的,而且有個致命缺點是對於update/insert/delete的每次執行,欄位的索引都必須重新計算更新。 那麼在什麼時候適合加上索引呢?我們看一個Mysql手冊中舉的例子,這里有一條sql語句: SELECT c.companyID, c.companyName FROM Companies c, User u WHERE c.companyID = u.fk_companyID AND c.numEmployees >= 0 AND c.companyName LIKE '%i%' AND u.groupID IN (SELECT g.groupID FROM Groups g WHERE g.groupLabel = 'Executive') 這條語句涉及3個表的聯接,並且包括了許多搜索條件比如大小比較,Like匹配等。在沒有索引的情況下Mysql需要執行的掃描行數是77721876行。而我們通過在companyID和groupLabel兩個欄位上加上索引之後,掃描的行數只需要134行。在Mysql中可以通過Explain Select來查看掃描次數。可以看出來在這種聯表和復雜搜索條件的情況下,索引帶來的性能提升遠比它所佔據的磁碟空間要重要得多。 那麼索引是如何實現的呢?大多數DB廠商實現索引都是基於一種數據結構——B樹。因為B樹的特點就是適合在磁碟等直接存儲設備上組織動態查找表。B樹的定義是這樣的:一棵m(m>=3)階的B樹是滿足下列條件的m叉樹: 1、每個結點包括如下作用域(j, p0, k1, p1, k2, p2, ... ki, pi) 其中j是關鍵字個數,p是孩子指針 2、所有葉子結點在同一層上,層數等於樹高h 3、每個非根結點包含的關鍵字個數滿足[m/2-1]<=j<=m-1 4、若樹非空,則根至少有1個關鍵字,若根非葉子,則至少有2棵子樹,至多有m棵子樹 看一個B樹的例子,針對26個英文字母的B樹可以這樣構造: 可以看到在這棵B樹搜索英文字母復雜度只為o(m),在數據量比較大的情況下,這樣的結構可以大大增加查詢速度。然而有另外一種數據結構查詢的虛度比B樹更快——散列表。Hash表的定義是這樣的:設所有可能出現的關鍵字集合為u,實際發生存儲的關鍵字記為k,而|k|比|u|小很多。散列方法是通過散列函數h將u映射到表T[0,m-1]的下標上,這樣u中的關鍵字為變數,以h為函數運算結果即為相應結點的存儲地址。從而達到可以在o(1)的時間內完成查找。
然而散列表有一個缺陷,那就是散列沖突,即兩個關鍵字通過散列函數計算出了相同的結果。設m和n分別表示散列表的長度和填滿的結點數,n/m為散列表的填裝因子,因子越大,表示散列沖突的機會越大。
因為有這樣的缺陷,所以資料庫不會使用散列表來做為索引的默認實現,Mysql宣稱會根據執行查詢格式嘗試將基於磁碟的B樹索引轉變為和合適的散列索引以追求進一步提高搜索速度。我想其它資料庫廠商也會有類似的策略,畢竟在資料庫戰場上,搜索速度和管理安全一樣是非常重要的競爭點。

J. 資料庫索引是什麼,有什麼用,怎麼用

1、資料庫索引是什麼,有什麼用

資料庫索引是對資料庫表中一列或多列的值進行排序的一種結構,使用索引可快速訪問資料庫表中的特定信息。如果想按特定職員的姓來查找他或她,則與在表中搜索所有的行相比,索引有助於更快地獲取信息。

索引的一個主要目的就是加快檢索表中數據的方法,亦即能協助信息搜索者盡快的找到符合限制條件的記錄ID的輔助數據結構。

2、資料庫索引的用法

當表中有大量記錄時,若要對表進行查詢,第一種搜索信息方式是全表搜索,是將所有記錄一一取出,和查詢條件進行一一對比,然後返回滿足條件的記錄,這樣做會消耗大量資料庫系統時間,並造成大量磁碟I/O操作;

第二種就是在表中建立索引,然後在索引中找到符合查詢條件的索引值,最後通過保存在索引中的ROWID(相當於頁碼)快速找到表中對應的記錄。

索引是一個單獨的、物理的資料庫結構,它是某個表中一列或若干列值的集合和相應的指向表中物理標識值的數據頁的邏輯指針清單。

(10)資料庫索引使用擴展閱讀:

一、索引的原理:

對要查詢的欄位建立索引其實就是把該欄位按照一定的方式排序;建立的索引只對該欄位有用,如果查詢的欄位改變,那麼這個索引也就無效了,比如圖書館的書是按照書名的第一個字母排序的,那麼你想要找作者叫張三的就不能用改索引了;還有就是如果索引太多會降低查詢的速度。

二、資料庫索引的特點:

1、避免進行資料庫全表的掃描,大多數情況,只需要掃描較少的索引頁和數據頁,而不是查詢所有數據頁。而且對於非聚集索引,有時不需要訪問數據頁即可得到數據。

2、聚集索引可以避免數據插入操作,集中於表的最後一個數據頁面。

3、在某些情況下,索引可以避免排序操作。

熱點內容
塗鴉論文 發布:2021-03-31 13:04:48 瀏覽:698
手機資料庫應用 發布:2021-03-31 13:04:28 瀏覽:353
版面217 發布:2021-03-31 13:04:18 瀏覽:587
知網不查的資源 發布:2021-03-31 13:03:43 瀏覽:713
基金贖回參考 發布:2021-03-31 13:02:08 瀏覽:489
懸疑故事範文 發布:2021-03-31 13:02:07 瀏覽:87
做簡單的自我介紹範文 發布:2021-03-31 13:01:48 瀏覽:537
戰略地圖參考 發布:2021-03-31 13:01:09 瀏覽:463
收支模板 發布:2021-03-31 13:00:43 瀏覽:17
電氣學術會議 發布:2021-03-31 13:00:32 瀏覽:731