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

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

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

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

一.索引原理:

??

?? 為認識索引工作原理,首先有必要對數據表的基本結構作一次全面的復習。

??

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

?

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

1.聚集索引

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

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

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

2.非聚集索引

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

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

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

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

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

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

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

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

?

二。實例分析:

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

?

create database index_Test1 --創建測試用的索引數據庫
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,?
)

--插入數據

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

--默認情況下查詢前250000條數據的時間
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

?

經過測試,總結如下:

1.在默認情況下,即以gid為主健時,系統自動生成聚集索引,查詢25w數據花了3382ms

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

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

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

轉載于:https://www.cnblogs.com/chuncn/archive/2009/02/27/1399897.html

總結

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

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。