成人免费xxxxx在线视频软件_久久精品久久久_亚洲国产精品久久久_天天色天天色_亚洲人成一区_欧美一级欧美三级在线观看

SQL Server非聚集索引能給我們帶來什么?

數(shù)據(jù)庫(kù) SQL Server 數(shù)據(jù)庫(kù)運(yùn)維
最近在做的一個(gè)項(xiàng)目,頁面訪問的時(shí)候很慢(大概幾秒鐘的樣子),然后用日志記錄的方式,來排查這個(gè)問題,最后發(fā)現(xiàn)是Entity Framework初始化的一個(gè)坑(大概要花 6-7 秒),詳見:《來,給Entity Framework熱熱身》,但是除了這個(gè)問題,還發(fā)現(xiàn)當(dāng)一些用戶數(shù)據(jù)量很大的時(shí)候,訪問也是有些慢,這個(gè)就不是 Entity Framework 的問題了(因?yàn)槌跏蓟淹瓿桑O旅媸枪P者解決問題的過程。

用 Sql Server Profiler 來跟蹤頁面訪問的時(shí) SQL 的執(zhí)行情況,因?yàn)閼?yīng)用程序很簡(jiǎn)單,頁面加載的時(shí)候,跟蹤檢測(cè)到三個(gè) SQL 執(zhí)行,看了下也沒什么問題(兩個(gè)獲取數(shù)量,一個(gè)獲取列表),數(shù)量獲取的 SQL,這個(gè)應(yīng)該執(zhí)行會(huì)很快,所以把分析焦點(diǎn)放在了那個(gè)獲取列表的 SQL 上,因?yàn)?SQL 沒什么問題,那應(yīng)該是關(guān)于這條 SQL 建的索引有問題。注:上面所說項(xiàng)目中大概有 100 萬的數(shù)據(jù)。

[[118947]]

關(guān)于數(shù)據(jù)庫(kù)中的索引概念,記得在很早之前整理了一篇博文《T-Sql(八)字段索引和數(shù)據(jù)加密》,現(xiàn)在來看,寫的真是一坨屎,概念講的再多沒個(gè)毛用,關(guān)鍵在于對(duì)實(shí)際應(yīng)用中產(chǎn)生問題的分析。在研究這個(gè)問題之前,搜了一些相關(guān)資料,主要來自園中的幾位 SQL Server 大神(CareySon、樺仔、聽風(fēng)吹雨等),稍微看了下,關(guān)于索引,主要是一些數(shù)據(jù)庫(kù)專業(yè)術(shù)語,看的不是很明白,作為程序員,我們知道索引分為聚集性索引和非聚集性索引,聚集性索引一般為主鍵(也可以不是),在創(chuàng)建表的時(shí)候會(huì)自動(dòng)創(chuàng)建,針對(duì)上面我那個(gè)應(yīng)用查詢問題,查詢條件是一些非主鍵字段,所以這邊探討下非聚集性索引。

我不會(huì)說一些數(shù)據(jù)庫(kù)概念,所以只能用做一些實(shí)踐來理解概念的意義,以下應(yīng)用場(chǎng)景中的用例是虛擬出來的,只是作為個(gè)人研究使用。

程序員應(yīng)該有刨根問底的怪癖,雖然這是個(gè)數(shù)據(jù)庫(kù)問題。

應(yīng)用場(chǎng)景

有一個(gè) Product 表,字段如下:

數(shù)據(jù)添加腳本:

  1. begin tran 
  2. declare @index int 
  3. set @index=0 
  4. while(@index<1000000
  5.   begin 
  6.    insert into [dbo].[Product]([Name],Remarks,ProviderID,[Time],[State])  
  7.    values('我是測(cè)試標(biāo)題1','我是測(cè)試備注1我是測(cè)試備注1我是測(cè)試備注1我是測(cè)試備注1我是測(cè)試備注1我是測(cè)試備注1',1,GETDATE(),0) 
  8.    insert into [dbo].[Product]([Name],Remarks,ProviderID,[Time],[State])  
  9.    values('我是測(cè)試標(biāo)題2','我是測(cè)試備注2我是測(cè)試備注2我是測(cè)試備注2我是測(cè)試備注2我是測(cè)試備注2我是測(cè)試備注2',1,GETDATE(),1) 
  10.    insert into [dbo].[Product]([Name],Remarks,ProviderID,[Time],[State])  
  11.    values('我是測(cè)試標(biāo)題3','我是測(cè)試備注3',3,GETDATE(),1) 
  12.    insert into [dbo].[Product]([Name],Remarks,ProviderID,[Time],[State])  
  13.    values('我是測(cè)試標(biāo)題4','我是測(cè)試備注4我是測(cè)試備注4我是測(cè)試備注4我是測(cè)試備注4我是測(cè)試備注4我是測(cè)試備注4',4,GETDATE(),1) 
  14.    set @index=@index+1 
  15.   end 
  16. commit 

Product 表中插入了四百萬的數(shù)據(jù),為了接近我們現(xiàn)實(shí)生產(chǎn)環(huán)境,所以對(duì)數(shù)據(jù)進(jìn)行了不同插入。

一般應(yīng)用環(huán)境查詢,有時(shí)候我們會(huì)針對(duì)一個(gè)字段進(jìn)行 where 查詢,有時(shí)候也會(huì) and 另一個(gè)字段進(jìn)行查詢,這個(gè)時(shí)候,關(guān)于這兩個(gè)字段的索引怎么建?還是不需要建?是分別建兩個(gè)?還是建一個(gè)組合的?其實(shí)說真的,可能看到這的數(shù)據(jù)庫(kù)大神會(huì)莞爾一笑,但是作為程序員,這些我真不知道,搜索的資料中也并沒有對(duì)這些雞毛蒜皮進(jìn)行的說明,沒辦法,只能自己瞎折騰下。我們下面要做是 ProviderID 和 State 的查詢操作,有分別查詢,也有組合查詢,然后我們?cè)賹?duì) Product 表建立這兩個(gè)字段的索引,看看有什么不同之處?還有就是針對(duì)不同的索引方式,查詢又會(huì)有什么不同?我們睜大眼睛來看一下。

問題分析

我再對(duì)上面的分析進(jìn)行說明下,首先,查詢主要為2種:

  1. where ProviderID=?

  2. where ProviderID=? and State=?

非聚集性索引的創(chuàng)建主要為3種:

  1. 不創(chuàng)建索引

  2. ProviderID 字段索引

  3. ProviderID 和 State 字段索引

針對(duì)這個(gè)應(yīng)用場(chǎng)景和上面的分析,會(huì)得出 3*2 六種結(jié)果,其實(shí)我最想知道的是下面的第三種,即創(chuàng)建一個(gè)組合字段索引,對(duì)單個(gè)字段的查詢會(huì)不會(huì)有影響?還有就是反過來,單個(gè)字段的索引創(chuàng)建,對(duì)組合字段查詢會(huì)不會(huì)有影響?當(dāng)然試過了才知道,看一下執(zhí)行結(jié)果。

執(zhí)行結(jié)果

測(cè)試腳本:

  1. declare @begin_date datetime 
  2. declare @end_date datetime 
  3. select @begin_date = getdate() 
  4. select * from [dbo].[Product] where ... 
  5. select @end_date = getdate() 
  6. select datediff(ms,@begin_date,@end_date) as '用時(shí)/毫秒' 

為了接近測(cè)試結(jié)果,每次語句執(zhí)行三次,然后再取平均值,截圖太麻煩了,這邊就直接貼下執(zhí)行結(jié)果。

不創(chuàng)建索引

  1. where ProviderID=1(二百萬數(shù)據(jù))
    執(zhí)行結(jié)果:13806毫秒,13380毫秒,12730毫秒
    平均結(jié)果:13305毫秒

  2. where ProviderID=1 and State=1(一百萬數(shù)據(jù))
    執(zhí)行結(jié)果:6556毫秒,6613毫秒,6706毫秒
    平均結(jié)果:6625毫秒

創(chuàng)建索引字段 ProviderID

  1. where ProviderID=1
    執(zhí)行結(jié)果:13986毫秒,13810毫秒,15853毫秒
    平均結(jié)果:14549毫秒

  2. where ProviderID=1 and State=1
    執(zhí)行結(jié)果:7153毫秒,7190毫秒,13950毫秒
    平均結(jié)果:7122毫秒

創(chuàng)建索引字段 ProviderID 和 State

  1. where ProviderID=1
    執(zhí)行結(jié)果:13840毫秒,14163毫秒,15853毫秒
    平均結(jié)果:14618毫秒

  2. where ProviderID=1 and State=1
    執(zhí)行結(jié)果:7033毫秒,7220毫秒,7023毫秒
    平均結(jié)果:7152毫秒

結(jié)果分析

雖然測(cè)試的有些不完整,但是看到結(jié)果,哥有些凌亂了(建了索引,性能反而會(huì)降低?),難道是我插入的數(shù)據(jù)有問題?還是創(chuàng)建索引有問題?還是我人品有問題???坐等數(shù)據(jù)庫(kù)大神指教。

原文鏈接:http://www.cnblogs.com/xishuai/p/3922964.html

 

責(zé)任編輯:彭凡 來源: 博客園
相關(guān)推薦

2021-03-09 10:11:26

區(qū)塊鏈技術(shù)數(shù)據(jù)

2010-09-28 10:17:53

WiFi

2010-07-19 16:26:05

SQL Server非

2022-06-05 15:02:57

邊緣計(jì)算云計(jì)算

2011-06-29 15:29:59

關(guān)鍵詞

2015-06-17 12:25:29

云計(jì)算

2010-07-20 12:46:23

SQL Server聚

2013-01-08 14:11:14

JavaJDK8lambda

2013-01-09 09:38:34

Java 8JDK8新版Java

2013-09-29 16:31:22

瀏覽器Chrome

2020-04-08 17:34:37

5G4G網(wǎng)絡(luò)

2021-03-17 14:22:09

VRAR虛擬現(xiàn)實(shí)技術(shù)

2011-04-22 14:45:45

SQL索引

2010-07-07 11:20:02

SQL Server聚

2016-12-20 15:42:47

AR教育

2022-11-28 07:25:52

MySQL聚集索引

2010-05-21 15:51:32

2010-07-20 13:20:26

SQL Server聚

2010-07-19 16:17:41

SQL Server聚

2015-11-11 09:16:30

點(diǎn)贊
收藏

51CTO技術(shù)棧公眾號(hào)

主站蜘蛛池模板: 91视频在线 | 日本久久视频 | 日本久久黄色 | 男人久久天堂 | 久草视频观看 | 成人精品一区亚洲午夜久久久 | 欧美精品a∨在线观看不卡 国产精品久久国产精品 | 国产91亚洲精品一区二区三区 | 51ⅴ精品国产91久久久久久 | 一级毛片免费视频观看 | 久久精品日产第一区二区三区 | 亚洲高清av | 夜夜骑av| 亚洲黄色一级毛片 | 久久99视频 | 亚洲色图插插插 | 中文字幕综合 | 情侣黄网站免费看 | 九九热精品在线视频 | 天天草天天 | 中文字幕在线精品 | 欧美一区二区三区精品免费 | 国产中文字幕网 | 免费视频久久久久 | 久久一二区 | 精品一区二区免费视频 | 中文字幕视频一区二区 | 国产精品欧美一区二区三区不卡 | 成年人精品视频在线观看 | 国产一区不卡 | 成人a在线观看 | www.五月天婷婷| 在线观看视频一区 | 日韩高清国产一区在线 | 亚洲午夜一区二区 | 免费av电影网站 | www.久草.com | 狠狠干美女 | 人人玩人人干 | 免费国产网站 | 国产在线视频在线观看 |