sqlserver使用索引
Ⅰ sqlserver 索引
索引的基本結構
「索引(Index)提供查詢的速度」這是對索引的最基本的解釋,接下來我們將通過介紹索引的組成,讓大家對索引有更深入的理解。 索引是資料庫中的一個獨特的結構,由於它保存資料庫信息,那麼我們就需要給它分配磁碟空間和維護索引表。創建索引並不會改變表中的數據,它只是創建了一個新的數據結構指向數據表;打個比方,平時我們使用字典查字時,首先我們要知道查詢單詞起始字母,然後翻到目錄頁,接著查找單詞具體在哪一頁,這時我們目錄就是索引表,而目錄項就是索引了。
當然,索引比字典目錄更為復雜,因為資料庫必須處理插入,刪除和更新等操作,這些操作將導致索引發生變化。葉節點
假設我們磁碟上的數據是物理有序的,那麼資料庫在進行插入,刪除和更新操作時,必然會導致數據發生變化,如果我們要保存數據的連續和有序,那麼我們就需要移動數據的物理位置,這將增大磁碟的I/O,使得整個資料庫運行非常緩慢;使用索引的主要目的是使數據邏輯有序,使數據獨立於物理有序存儲。
為了實現數據邏輯有序,索引使用雙向鏈表的數據結構來保持數據邏輯順序,如果要在兩個節點中插入一個新的節點只需修改節點的前驅和後繼,而且無需修改新節點的物理位置。雙向鏈表(Doubly linked list)也叫雙鏈表,是鏈表的一種,它的每個數據結點中都有兩個指針,分別指向直接後繼和直接前驅。所以,從雙向鏈表中的任意一個結點開始,都可以很方便地訪問它的前驅結點和後繼結點。
理論上說,從雙向鏈表中刪除一個元素操作的時間復雜度是O(1),如果希望刪除一個具體有給定關鍵字的元素,那麼最壞的情況下的時間復雜度為O(n)。
在刪除的過程中,我們只需要將要刪除的節點的前節點和後節點相連,然後將要刪除的節點的前節點和後節點置為null即可。索引的類型
我們知道索引的類型有兩種:聚集索引和非聚集索引。
聚集索引:物理存儲按照索引排序。
非聚集索引:物理存儲不按照索引排序。了解更多知識點擊鏈接:http://www.jb51.net/article/30971.htm
Ⅱ sqlserver資料庫,表 索引,查詢效率問題
sqlserver的主鍵默認是聚集索引,如果你還需要查詢什麼數據,也可以建立非聚集索引,但是你要注意,非聚集索引需要佔額外的存儲空間,而且是用時間長了容易產生索引碎片。
所以比較好的索引建立准則是:用來做表連接的id列上鍵非聚集索引,真正用來查詢數據內容的列上建立聚集索引。
Ⅲ sqlserver一次查詢一張表中是不是只能使用到一個索引
不一定,如果是復雜查詢,有可能同時使用多個索引,至於查詢何時使用索引、使用哪些索引,是由資料庫管理系統根據當前的數據分布情況以及後台演算法決定的,用戶決定不了
Ⅳ sqlserver怎麼建立索引
--創建索引
CREATE NONCLUSTERED INDEX IX_TEST_TNAME --創建一個非聚集索引
ON TEST(TNAME) --為TEST表的TNAME欄位創建索引
WITH FILLFACTOR = 30 --填充因子為30%
GO
SELECT * FROM TEST(INDEX = IX_TEST_TNAME) WHERE TNAME = 'A' --指定按『IX_TE
Ⅳ sqlserver索引問題求高手解惑!
第一種是兩個欄位分別建立索引,在查詢時兩個欄位上的索引都能起到一定的作用
第二種是覆蓋索引,其索引效果只有第一欄位有效,其餘欄位只是作為「附屬品」,
如果只以outUnitId為條件查詢,若查詢出的欄位中包含inUnitId欄位,那麼第二個索引較快
若不包含則一樣,若兩個欄位同時為查詢條件,則第一個索引較快
Ⅵ sqlserver 怎麼建索引
表的主關鍵字自動建立唯一索引
select * from Ad_Meter
直接條件查詢的欄位
Ad_Meter 表中 作為條件查詢的 S_ip
select * from Ad_Meter where S_Ip='314111963400'
查詢中與其它表關聯的欄位
Ad_Meter 表的SYSID_Floor
select * from Ad_Meter m inner join Ad_Floor f on M.SYSID_Floor=f.SYSID_Floor
查詢中排序的欄位
Ad_Meter 的 s_ip ,按s_ip的倒序查詢
select * from Ad_Meter order by S_Ip desc
查詢中統計或分組統計的欄位
select MAX(SYSID_Floor) from Ad_Meter
select S_Ip ,COUNT (*) from Ad_Meter group by S_Ip
6
步驟二:直接條件查詢的欄位
select * from Ad_Meter where S_Ip='314111963400'
舉例建一個索引。
找到有添加索引的表 Ad_Meter,展開找到 索引,右鍵--》新建--》添加選擇作為索引的欄位--》確定
Ⅶ 如何用索引提高SQLServer性能
在關系型資料庫中使用索引能夠提高資料庫性能,這一點是非常明顯的。用的索引越多,從資料庫系統中得到數據的速度就越快。然而,需要注意的是,用的索引越多,向資料庫系統中插入新數據所花費的時間就越多。在本文中,你將了解到微軟的SQL Server資料庫所支持的各種不同類型的索引,在這里你將了解到如何使用不同的方法來實現索引,通過這些不同的實現方法,你在資料庫的讀性能方面得到的遠比在資料庫的整體性能方面的損失要多得多。索引的定義索引是資料庫的工具,通過使用索引,在資料庫中獲取數據的時候,就可以不用掃描資料庫中的所有數據記錄,這樣能夠提高系統獲取數據的性能。使用索引可以改變數據的組織方式,使得所有的數據都是按照相似的結構來組織的,這樣就可以很容易地實現數據的檢索訪問。索引是按照列來創建的,這樣就可以根據索引列中的值來幫助資料庫找到相應的數據。索引的類型微軟的SQL Server 支持兩種類型的索引:clustered 索引和nonclustered索引。Clustered 索引在數據表中按照物理順序存儲數據。因為在表中只有一個物理順序,所以在每個表中只能有一個clustered索引。在查找某個范圍內的數據時,Clustered索引是一種非常有效的索引,因為這些數據在存儲的時候已經按照物理順序排好序了。 Nonclustered索引不會影響到下面的物理存儲,但是它是由數據行指針構成的。如果已經存在一個clustered索引,在nonclustered中的索引指針將包含clustered索引的位置參考。這些索引比數據更緊促,而且對這些索引的掃描速度比對實際的數據表掃描要快得多。 得到更好的性能 雖然索引可以帶來性能上的優勢,但是同時也將帶來一定的代價。雖然SQL Server系統允許你在每個數據表中創建多達256個nonclustered索引,但是建議不要使用這么多的索引。因為索引需要在內存和物理磁碟驅動器上使用更多的存儲空間。在執行插入聲明的過程中可能會在一定程度上導致系統性能的下降,因為在插入數據的時候是需要根據索引的順序插入,而不是在第一個可用的位置直接插入數據,這樣一來,存在的索引越多將導致插入或者更新聲明所需要的時間就越多。 在使用SQL Server系統創建索引的時候,建議參照下面的創建准則來實現: 正確的選擇數據類型 在索引中使用某些數據類型可以提高資料庫系統的效率,例如,Int,bigint, smallint,和tinyint等這些數據類型都非常適合於用在索引中,因為他們都佔用相同大小的空間並且可以很容易地實現比較操作。其他的數據類型如char和varchar的效率都非常低,因為這些數據類型都不適合於執行數學操作,並且執行比較操作的時間都比上面提到數據類型要長。 確保在使用的過程中正確的利用索引值 在創建多列索引時,需要注意列的順序 資料庫將根據第一列索引的值來排列記錄,然後進一步根據第二列的值來排序,依次排序直到最後一個索引排序完畢。哪一列唯一數據值較少,哪一列就應該為第一個索引,這樣可以確保數據可以通過索引進一步交叉排序。 在clustered索引中限制列的數量 在clustered索引中用到的列越多,在nonclustered索引中包含的clustered索引參考位置就越多,需要存儲的數據也就越多。這樣將增加包含索引的數據表的大小,並且將增加基於索引的搜索時間。 避免頻繁更新clustered索引數據列 由於nonclustered 索引依賴於clustered 索引,所以如果構成clustered 索引的數據列頻繁更新,將導致在nonclustered中存儲的行定位器也將隨之頻繁更新。對於所有與這些列相關的查詢來說,如果發生記錄被鎖定的情況時,這將可能導致性能成本的增加。 分開操作(如果可能的話) 對於一個表來說,如果需要進行頻繁的執行插入、更新操作,同時還有大量讀操作的話,在可能的情況下嘗試將這個表分開操作。所有的插入和更新操作可以在一個沒有索引的表中操作,然後將其復制到另外一個表中,在這個表裡有大量的索引可以優化讀數據的能力。 適當的重建索引 Nonclustered索引包含clustered索引的指針,這樣一來Nonclustered索引將從屬於clustered 索引。當重建clustered索引時,首先是丟棄原來的索引,然後再使用CREATE INDEX 來創建索引,或者在使用CREATE INDEX 聲明的同時將DROP_EXISTING 子句作為重建索引的一部分。將丟棄和創建分為幾步將會導致多次重建nonclustered 索引,而不象使用DROP_EXISTING 子句那樣,只重建一次nonclustered 索引。 明智的使用填充因子 數據存儲在那些具有固定大小的連續內存頁面內。隨著新的記錄行的加入,數據內存頁將逐漸被填滿,系統就必須執行數據頁的拆分工作,通過這個拆分工作將部分數據轉移到下一個新的頁面當中。這樣的拆分之後,將加重系統的負擔,並且會導致存儲的數據支離破碎。填充因子可以維護數據之間的缺口,一般在創建索引的時候,該索引的填充因子就已經被設置好了。這樣一來,可以減少插入數據所引起的頁面分裂的次數。因為只是在創建索引的時候才維護空間的大小,在增加數據或者更新數據時不會去維護空間的大小。因此,要想能夠充分的利用填充因子,就必須周期性的重建索引。由填充因子所造成的缺口將導致讀性能的下降,因為隨著資料庫的擴張,越來越多的磁碟存取工作需要讀取數據。所以,在讀的次數超過寫的次數的時候,很重要的一點是考慮使用填充因子還是使用預設方式合適。 管理層的決策 通過有效的使用索引,可以在微軟的SQL Server系統中實現很好的查詢功能,但是使用索引的效率取決於幾種不同的實現決策。在索引的性能平衡方面,要做出正確的資料庫管理決策意味著需要在良好的性能和困境中抉擇。在特定的情況下,本文給出的一些建議將有助於你做出正確的決策。
Ⅷ SqlServer:索引是什麼,以及為什麼使用索引
收藏
問題反饋
索引
索引,使用索引可快速訪問資料庫表中的特定信息。索引是對資料庫表中一列或多列的值進行排序的一種結構。 在關系資料庫中,索引是一種與表有關的資料庫結構,它可以使對應於表的SQL語句執行得更快。索引的作用相當於圖書的目錄,可以根據目錄中的頁碼快速找到所需的內容。當表中有大量記錄時,若要對表進行查詢,第一種搜索信息方式是全表搜索,是將所有記錄一一取出,和查詢條件進行一一對比,然後返回滿足條件的記錄,這樣做會消耗大量資料庫系統時間,並造成大量磁碟I/O操作;第二種就是在表中建立索引,然後在索引中找到符合查詢條件的索引值,最後通過保存在索引中的ROWID(相當於頁碼)快速找到表中對應的記錄。 索引是一個單獨的、物理的資料庫結構,它是某個表中一列或若干列值的集合和相應的指向表中物理標識這些值的數據頁的邏輯指針清單。 索引提供指向存儲在表的指定列中的數據值的指針,然後根據您指定的排序順序對這些指針排序。資料庫使用索引的方式與您使用書籍中的索引的方式很相似:它搜索索引以找到特定值,然後順指針找到包含該值的行。 在資料庫關系圖中,可以在選定表的「索引/鍵」屬性頁中創建、編輯或刪除每個索引類型。當保存索引所附加到的表,或保存該表所在的關系圖時,索引將保存在資料庫中。
Ⅸ sqlserver怎麼為表添加索引怎麼用
可以用create index創建索引,如create index test_idx on tablename(col1,col2)
系統優化時會自動選擇使整個查詢開銷最小的查詢計劃。如你的sql 為select * from tablename where col1 = @col1 and col2 = @col2 時一般都會用到索引。
Ⅹ SQLSERVER 怎樣 加索引 能顯著提高速度
SQLSERVER 怎樣 加索引 能顯著提高速度
1、評估索引本身的佔用空間,當索引相對於其數據本身過大可能會無明顯作用。這種情況
體現在:表很小,索引列過多,索引碎片過多。當索引在select 中不起作用時,你還必須
在insert 和update、delete 這些操作中去維護這些不起作用的數據。
2、In 語句不一定不能使用索引,where id in(1,2)和where id =1 or id=2是等效的,這
里的in 和not in 的性能是相同的。而不能使用索引的原因是嵌套查詢: where id in(sel
ect 1 union select 2).