日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

索引原理及项目中如何使用索引实例分析

發(fā)布時間:2023/12/10 编程问答 27 豆豆
生活随笔 收集整理的這篇文章主要介紹了 索引原理及项目中如何使用索引实例分析 小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.

一.索引原理:

??

?? 為認(rèn)識索引工作原理,首先有必要對數(shù)據(jù)表的基本結(jié)構(gòu)作一次全面的復(fù)習(xí)。

??

當(dāng)一個新表被創(chuàng)建之時,系統(tǒng)將在磁盤中分配一段以8K為單位的連續(xù)空間,當(dāng)字段的值從內(nèi)存寫入磁盤時,就在這一既定空間隨機保存,當(dāng)一個8K用完的時候,SQLS指針會自動分配一個8K的空間。這里,每個8K空間被稱為一個數(shù)據(jù)頁(Page),又名頁面或數(shù)據(jù)頁面,并分配從0-7的頁號,每個文件的第0頁記錄引導(dǎo)信息,叫文件頭(File header);每8個數(shù)據(jù)頁(64K)的組合形成擴展區(qū)(Extent),稱為擴展。全部數(shù)據(jù)頁的組合形成堆(Heap)。
SQLS規(guī)定行不能跨越數(shù)據(jù)頁,所以,每行記錄的最大數(shù)據(jù)量只能為8K。這就是char和varchar這兩種字符串類型容量要限制在8K以內(nèi)的原因,存儲超過8K的數(shù)據(jù)應(yīng)使用text類型,實際上,text類型的字段值不能直接錄入和保存,它只是存儲一個指針,指向由若干8K的文本數(shù)據(jù)頁所組成的擴展區(qū),真正的數(shù)據(jù)正是放在這些數(shù)據(jù)頁中。
頁面有空間頁面和數(shù)據(jù)頁面之分。
當(dāng)一個擴展區(qū)的8個數(shù)據(jù)頁中既包含了空間頁面又包括了數(shù)據(jù)或索引頁面時,稱為混合擴展(Mixed Extent),每張表都以混合擴展開始;反之,稱為一致擴展(Uniform Extent),專門保存數(shù)據(jù)及索引信息。
表被創(chuàng)建之時,SQLS在混合擴展中為其分配至少一個數(shù)據(jù)頁面,隨著數(shù)據(jù)量的增長,SQLS可即時在混合擴展中分配出7個頁面,當(dāng)數(shù)據(jù)超過8個頁面時,則從一致擴展中分配數(shù)據(jù)頁面。
空間頁面專門負責(zé)數(shù)據(jù)空間的分配和管理,包括:PFS頁面(Page free space):記錄一個頁面是否已分配、位于混合擴展還是一致擴展以及頁面上還有多少可用空間等信息;GAM頁面(Global allocation map)和SGAM頁面(Secodary global allocation map):用來記錄空閑的擴展或含有空閑頁面的混合擴展的位置。SQLS綜合利用這三種類型的頁面文件在必要時為數(shù)據(jù)表創(chuàng)建新空間;

?

?? 實際上,您可以把索引理解為一種特殊的目錄。微軟的SQL SERVER提供了兩種索引:

1.聚集索引

其實,我們的漢語字典的正文本身就是一個聚集索引。比如,我們要查“安”字,就會很自然地翻開字典的前幾頁,因為“安”的拼音是“an.

字典的正文部分本身就是一個目錄,您不需要再去查其他目錄來找到您需要找的內(nèi)容。

我們把這種正文內(nèi)容本身就是一種按照一定規(guī)則排列的目錄稱為“聚集索引”。

2.非聚集索引

如果您認(rèn)識某個字,您可以快速地從自動中查到這個字。但您也可能會遇到您不認(rèn)識的字,不知道它的發(fā)音,這時候,您就不能按照剛才的方

法找到您要查的字,而需要去根據(jù)“偏旁部首”查到您要找的字,然后根據(jù)這個字后的頁碼直接翻到某頁來找到您要找的字。但您結(jié)合“部首

目錄”和“檢字表”而查到的字的排序并不是真正的正文的排序方法,比如您查“張”字,我們可以看到在查部首之后的檢字表中“張”的頁

碼是672頁,檢字表中“張”的上面是“馳”字,但頁碼卻是63頁,“張”的下面是“弩”字,頁面是390頁。很顯然,這些字并不是真正的分

別位于“張”字的上下方,現(xiàn)在您看到的連續(xù)的“馳、張、弩”三字實際上就是他們在非聚集索引中的排序,是字典正文中的字在非聚集索引

中的映射。我們可以通過這種方式來找到您所需要的字,但它需要兩個過程,先找到目錄中的結(jié)果,然后再翻到您所需要的頁碼。

我們把這種目錄純粹是目錄,正文純粹是正文的排序方式稱為“非聚集索引”。

通過以上例子,我們可以理解到什么是“聚集索引”和“非聚集索引”。

?

二。實例分析:

下面我們就來看一下在200萬條數(shù)據(jù)量的情況下各種查詢的速度表現(xiàn)(以25萬條數(shù)據(jù)為例說明)

?

create database index_Test1 --創(chuàng)建測試用的索引數(shù)據(jù)庫
GO
use index_Test1
GO
create table IndexTable1
(
?? gid int identity(1,1) primary key,
?? data datetime,
?? creater varchar(100) not null,
?? title varchar(100) not null,?
)

--插入數(shù)據(jù)

declare @i int
set @i=1
while @i<=2000000
begin
? insert into IndexTable1(data,creater,title) values(DATEADD(day, @i, getdate()),'mfm','這是測試索引的例子')
? set @i=@i+1
end

--默認(rèn)情況下查詢前250000條數(shù)據(jù)的時間
declare @timediff datetime
select @timediff=getdate()
select top 250000 * from IndexTable1
select datediff(ms,@timediff,GetDate()) as 耗時

--在主鍵上建立聚集索引,在data上建立非聚集索引(非常慢)
create CLUSTERED index gid_index on IndexTable1(data)

--也可以利用以下方法修改主健為非聚集索引
alter?? table?? IndexTable1? add?? constraint?? pk_dr?? primary?? key?? nonclustered(gid)?

--刪除已存在的索引
drop index IndexTable1.gid_index

?

經(jīng)過測試,總結(jié)如下:

1.在默認(rèn)情況下,即以gid為主健時,系統(tǒng)自動生成聚集索引,查詢25w數(shù)據(jù)花了3382ms

2.以gid為主健聚集索引,data建立為非聚集索引時,查詢25w數(shù)據(jù)花了5586ms

3.取消主健取集索引,建立data為取集索引時,查詢25w數(shù)據(jù)花了2274ms

本人機器配置是:本本迅弛雙核1.6g,512m內(nèi)存,獨顯128m,大家可以按照以上方法去一一測試。

轉(zhuǎn)載于:https://www.cnblogs.com/chuncn/archive/2009/02/27/1399897.html

總結(jié)

以上是生活随笔為你收集整理的索引原理及项目中如何使用索引实例分析的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯,歡迎將生活随笔推薦給好友。