婷婷综合国产,91蜜桃婷婷狠狠久久综合9色 ,九九九九九精品,国产综合av

主頁 > 知識庫 > 詳解SQL Server的聚焦過濾索引

詳解SQL Server的聚焦過濾索引

熱門標簽:我要地圖標注數量有限制嗎 電話機器人怎么代理商 電銷需要外呼系統嗎 互聯網電話外呼系統 千呼電話機器人可以試用嗎 安卡拉地圖標注app 零成本地圖標注賺錢 400電話辦理泰安 家庭農場地圖標注名稱怎樣起名

前言

這一節我們還是繼續講講索引知識,前面我們聚集索引、非聚集索引以及覆蓋索引等,在這其中還有一個過濾索引,通過索引過濾我們也能提高查詢性能,簡短的內容,深入的理解。

過濾索引,在查詢條件上創建非聚集索引(1)

過濾索引是SQL 2008的新特性,被應用在表中的部分行,所以利用過濾索引能夠提高查詢,相對于全表掃描它能減少索引維護和索引存儲的代價。當我們在索引上應用WHERE條件時就是過濾索引。也就是滿足如下格式:

CREATE NONCLUSTERED INDEX index name>
ON table> (columns>)
WHERE criteria>;
GO

下面我們來看一個簡單的查詢

USE AdventureWorks2012
GO
SELECT SalesOrderDetailID, UnitPrice
FROM Sales.SalesOrderDetail
WHERE UnitPrice > 2000
GO

上述列中未建立任何索引,當然除了SalesOrderDetailID默認創建的聚集索引,這種情況下我們能夠猜想到其執行的查詢計劃必然是主鍵創建的聚集索引掃描,如下

上述我們已經說過此時未在查詢條件上創建索引,所以此時必然走的是主鍵創建的聚集索引,接下來我們首先在UnitPrice列上創建非聚集索引來提高查詢性能,

CREATE NONCLUSTERED INDEX idx_SalesOrderDetail_UnitPrice
ON Sales.SalesOrderDetail(UnitPrice)

此時我們再來比較二者查詢開銷

USE AdventureWorks2012
GO
DBCC FREEPROCCACHE
DBCC DROPCLEANBUFFERS
SELECT SalesOrderDetailID, UnitPrice
FROM AdventureWorks2012.Sales.SalesOrderDetail WITH(INDEX([PK_SalesOrderDetail_SalesOrderID_SalesOrderDetailID]))
WHERE UnitPrice > 2000
GO
SELECT SalesOrderDetailID, UnitPrice
FROM Sales.SalesOrderDetail WITH(INDEX([idx_SalesOrderDetail_UnitPrice]))
WHERE UnitPrice > 2000

此時在查詢條件上建立了非聚集索引之后,查詢開銷提升的非常明顯,提升達到了90%以上,因為非聚集索引也會引用了主鍵創建的聚集索引,所以這個時候不會導致Bookmark Lookup或者Key Lookup查找。接下來我們我們再添加一個帶有條件的非聚集索引即過濾索引

CREATE NONCLUSTERED INDEX idxwhere_SalesOrderDetail_UnitPrice
ON Sales.SalesOrderDetail(UnitPrice)
WHERE UnitPrice > 1000

此時我們再來看看創建了過濾索引之后和之前非聚集索引性能開銷差異:

USE AdventureWorks2012
GO
DBCC FREEPROCCACHE
DBCC DROPCLEANBUFFERS
SELECT SalesOrderDetailID, UnitPrice
FROM AdventureWorks2012.Sales.SalesOrderDetail WITH(INDEX([idx_SalesOrderDetail_UnitPrice]))
WHERE UnitPrice > 2000
SELECT SalesOrderDetailID, UnitPrice
FROM Sales.SalesOrderDetail WITH(INDEX([idxwhere_SalesOrderDetail_UnitPrice]))
WHERE UnitPrice > 2000

此時我們知道創建的非聚集過濾索引與傳統創建的非聚集索引相比,我們的查詢接近減少了一半。

唯一過濾索引

唯一過濾索引對于所有列必須唯一且不為空(只允許一個NULL存在)也是非常好的解決方案,所以此時在創建唯一過濾索引時需要將NULL值除外,比如如下:

CREATE UNIQUE NONCLUSTERED INDEX uq_fix_Customers_Email
ON Customers(Email)
WHERE Email IS NOT NULL
GO

過濾索引結合INCLUDE

當我們再添加一個額外列時,使用默認主鍵創建的聚集索引時,此時會走聚集索引掃描,然后我們在查詢條件上創建一個過濾索引,我們強制使用這個過濾索引時,此時由于添加額外列,會導致需要返回到基表中再去獲取數據,所以也就造成了Key Lookup查找,如下:

USE AdventureWorks2012
GO
SELECT SalesOrderDetailID, UnitPrice, UnitPriceDiscount
FROM Sales.SalesOrderDetail
WHERE UnitPrice > 2000
GO

此時我們需要用INCLUDE來包含額外列。

CREATE NONCLUSTERED INDEX [idx_SalesOrderDetail_UnitPrice] ON Sales.SalesOrderDetail(UnitPrice) INCLUDE(UnitPriceDiscount)

我們再創建一個過濾索引同時包括額外列

CREATE NONCLUSTERED INDEX [idxwhere_SalesOrderDetail_UnitPrice] ON Sales.SalesOrderDetail(UnitPrice) INCLUDE(UnitPriceDiscount)
WHERE UnitPrice > 2000

接下來再來執行比較添加過濾索引和未添加過濾索引同時都包括了額外列的性能查詢差異。

SELECT SalesOrderDetailID, UnitPrice, UnitPriceDiscount
FROM AdventureWorks2012.Sales.SalesOrderDetail WITH(INDEX([idx_SalesOrderDetail_UnitPrice]))
WHERE UnitPrice > 2000 
SELECT SalesOrderDetailID, UnitPrice, UnitPriceDiscount
FROM Sales.SalesOrderDetail WITH(INDEX([idxwhere_SalesOrderDetail_UnitPrice]))
WHERE UnitPrice > 2000

此時性能用INCLUDE來包含額外列性能也得到了一定的改善。

過濾索引,在主鍵上創建非聚集索引(2)

在第一個案列中,我們可以直接在查詢列上創建非聚集索引,因為其類型是數字類型,要是查詢條件是字符類型呢?首選現在我們先創建一個測試表

USE TSQL2012
GO
CREATE TABLE dbo.TestData 
(
  RowID    integer IDENTITY NOT NULL, 
  SomeValue  VARCHAR(max) NOT NULL,   
  StartDate  date NOT NULL,
  CONSTRAINT PK_Data_RowID
    PRIMARY KEY CLUSTERED (RowID)
);

添加10萬條測試數據

USE TSQL2012
GO
INSERT dbo.TestData WITH (TABLOCKX)
  (SomeValue, StartDate)
SELECT
  CAST(N.n AS VARCHAR(max)) + 'JeffckyWang',
  DATEADD(DAY, (N.n - 1) % 31, '20140101')
FROM dbo.Nums AS N
WHERE 
  N.n >= 1 
  AND N.n  100001;

如果我們需要獲取表TestData中SomeValue = 'JeffckyWang',此時我們想要在SomeValue上創建一個非聚集索引然后進行過濾,如下

USE TSQL2012
GO
CREATE NONCLUSTERED INDEX idx_noncls_somevalue
ON dbo.TestData(SomeValue)
WHERE SomeValue = 'JeffckyWang'

更新

SQL Server對創建索引大小有限制,最大是900字節,上述直接寫的VARCHAR(MAX),所以會出錯,切記,切記。

此時我們在主鍵上創建非聚集索引,我們在主鍵RowID上創建一個過濾索引且SomeValue = 'JeffckyWang',然后返回數據,如下:

CREATE NONCLUSTERED INDEX idxwhere_noncls_somevalue
ON dbo.TestData(RowID)
WHERE SomeValue = 'JeffckyWang'

下面我們來對比建立過濾索引前后查詢計劃結果:

USE TSQL2012
GO
SELECT RowID, SomeValue, StartDate 
FROM dbo.TestData WITH(INDEX([idx_pk_rowid]))
WHERE SomeValue = 'JeffckyWang'
SELECT RowID, SomeValue, StartDate 
FROM dbo.TestData WITH(INDEX([idxwhere_noncls_somevalue]))
WHERE SomeValue = 'JeffckyWang'

然后結合之前所學,移除Key Lookup,對創建的過濾索引進行INCLUDE。

CREATE NONCLUSTERED INDEX [idxwhere_noncls_somevalue] ON dbo.TestData(RowID) INCLUDE(SomeValue,StartDate) 
WHERE SomeValue = 'JeffckyWang'

從這里看出,無論是對查詢條件創建過濾索引還是對主鍵創建過濾索引,我們都可以通過結合之前所學來提高查詢性能。

我們從開頭就一直在講創建過濾索引,那么創建過濾索引優點的條件到底是什么?

(1)只能通過非聚集索引進行創建。

(2)如果在視圖上創建過濾索引,此視圖必須是持久化視圖。

(3)不能在全文索引上創建過濾索引。

過濾索引的優點

(1)減少索引維護成本:對于增、刪、改等操作不需要代價沒有那么昂貴,因為一個過濾索引的重建不需要耗時太多時間。

(2)減少存儲成本:過濾索引的存儲占用空間很小。

(3)更精確的統計:通過在WHERE條件上創建過濾索引比全表統計結果更加精確。

(4)優化查詢性能:通過查詢計劃可以看出其高效性。

講到這里為止,一直陳述的是過濾索引的好處和優點,已經將其捧上天了,其實其缺點也是顯而易見。

過濾索引缺點

最大的缺點則是查詢條件的限制。其查詢條件僅限于

filter_predicate> ::=  
  conjunct> [ AND conjunct> ] 
conjunct> ::= 
  disjunct> | comparison>  
disjunct> ::= 
    column_name IN (constant ,...n)

過濾條件僅限于AND、|、IN。比較條件僅限于 { IS | IS NOT | = | > | != | > | >= | !> | | = | ! },所以如下利用LIKE不行

CREATE NONCLUSTERED INDEX [idxwhere_noncls_somevalue] ON dbo.TestData(RowID) INCLUDE(SomeValue,StartDate) 
WHERE SomeValue LIKE 'JeffckyWang%'

如下可以

USE AdventureWorks2012
GO
CREATE NONCLUSTERED INDEX idx_SalesOrderDetail_ModifiedDate
ON Sales.SalesOrderDetail(ModifiedDate)
WHERE ModifiedDate >= '2008-01-01' AND ModifiedDate = '2008-01-07'
GO

如下卻不行

CREATE NONCLUSTERED INDEX idx_SalesOrderDetail_ModifiedDate
ON Sales.SalesOrderDetail(ModifiedDate)
WHERE ModifiedDate = GETDATE()
GO

變量對過濾索引影響

上述我們創建過濾索引在查詢條件上直接定義的字符串,如下:

CREATE NONCLUSTERED INDEX idxwhere_SalesOrderDetail_UnitPrice
ON Sales.SalesOrderDetail(UnitPrice)
WHERE UnitPrice > 1000

如果定義的是變量,利用變量來進行比較會如何呢?首先我們創建一個過濾索引

CREATE NONCLUSTERED INDEX idx_SalesOrderDetail_ProductID 
ON Sales.SalesOrderDetail (ProductID)
WHERE ProductID = 870

利用變量來和查詢條件比較,強制使用過濾索引(默認情況下走聚集索引)

USE AdventureWorks2012
GO
DECLARE @ProductID INT 
SET @ProductID = 870 
SELECT ProductID 
FROM Sales.SalesOrderDetail WITH(INDEX([idx_SalesOrderDetail_ProductID]))
WHERE ProductID = @ProductID

查看查詢執行計劃結果卻出錯了,此時我們需要添加OPTION重新編譯,如下:

USE AdventureWorks2012
GO
DECLARE @ProductID INT 
SET @ProductID = 870 
SELECT ProductID 
FROM Sales.SalesOrderDetail
WHERE ProductID = @ProductID
OPTION(RECOMPILE)

上述利用變量來查詢最后通過OPTION重新編譯在SQL Server 2012中測試好使,至于其他版本未知,參考資料【The Pains of Filtered Indexes】。

總結

本節我們學習了通過過濾索引來提高查詢性能,同時也給出了其不同的場景以及其使用優點和明顯的缺點。簡短的內容,深入的理解,我們下節再會,good night。

以上就是本文的全部內容,希望本文的內容對大家的學習或者工作能帶來一定的幫助,如果有疑問大家可以留言交流,同時也希望多多支持腳本之家!

您可能感興趣的文章:
  • SQL Server 2005通用分頁存儲過程及多表聯接應用
  • SQL設置SQL Server最大連接數及查詢語句
  • 解析SQL Server聚焦移除(Bookmark Lookup、RID Lookup、Key Lookup)
  • 淺述SQL Server的聚焦強制索引查詢條件和Columnstore Index
  • 淺析SQL Server的分頁方式 ISNULL與COALESCE性能比較
  • 詳解SQL Server中的數據類型
  • 淺析SQL Server的聚焦使用索引和查詢執行計劃
  • 淺析SQL Server 聚焦索引對非聚集索引的影響
  • 如何快速刪掉SQL Server登錄時登錄名下拉列表框中的選項
  • 淺談SQL Server交叉聯接 內部聯接

標簽:黃山 池州 新鄉 濱州 大同 文山 來賓 東營

巨人網絡通訊聲明:本文標題《詳解SQL Server的聚焦過濾索引》,本文關鍵詞  詳解,SQL,Server,的,聚焦,過濾,;如發現本文內容存在版權問題,煩請提供相關信息告之我們,我們將及時溝通與處理。本站內容系統采集于網絡,涉及言論、版權與本站無關。
  • 相關文章
  • 下面列出與本文章《詳解SQL Server的聚焦過濾索引》相關的同類信息!
  • 本頁收集關于詳解SQL Server的聚焦過濾索引的相關信息資訊供網民參考!
  • 推薦文章
    婷婷综合国产,91蜜桃婷婷狠狠久久综合9色 ,九九九九九精品,国产综合av
    久久久99久久| 亚洲精品在线观看网站| 亚洲成av人片在线| 日韩视频免费直播| 激情国产一区二区| 国产精品一卡二卡在线观看| 成人精品小蝌蚪| 欧美午夜寂寞影院| 五月婷婷综合激情| 国内一区二区在线| 中文字幕视频一区| 亚洲午夜视频在线观看| 国产一区二区三区蝌蚪| 亚洲三级久久久| 日韩欧美卡一卡二| 日韩av不卡一区二区| 成人做爰69片免费看网站| 天天色 色综合| 欧美片在线播放| 蜜臀av一区二区在线观看| 精品视频资源站| 日韩不卡免费视频| 欧美一区2区视频在线观看| 在线亚洲一区二区| 欧美一区二区视频在线观看2020| 欧美专区日韩专区| 亚洲色欲色欲www| 99久久久国产精品免费蜜臀| 一区二区三区欧美| 欧洲精品在线观看| 国产人久久人人人人爽| 91精品婷婷国产综合久久竹菊| 亚洲精品在线电影| 欧美日本一区二区三区| fc2成人免费人成在线观看播放| 午夜精品在线看| 成人毛片在线观看| 一区二区三区日韩欧美| 91高清视频免费看| 久久精品999| 国产精品高潮久久久久无| 成人黄色大片在线观看| 五月婷婷久久综合| 91精彩视频在线观看| 奇米影视7777精品一区二区| 久久亚洲精品国产精品紫薇| aaa亚洲精品一二三区| 蜜臀av性久久久久蜜臀aⅴ| 国产精品色一区二区三区| 欧美伦理电影网| 欧美一区二区三区免费大片| 国产在线精品视频| 日韩免费一区二区三区在线播放| 欧美日韩国产中文| 欧美日韩mp4| 久久亚洲私人国产精品va媚药| 精品国产91洋老外米糕| 欧美伊人久久久久久午夜久久久久| 久久er99热精品一区二区| 性久久久久久久久久久久| 亚洲日本乱码在线观看| 国产欧美一二三区| 欧美成人精品高清在线播放| 欧美日韩中文字幕一区| 在线这里只有精品| 99精品偷自拍| 亚洲一级不卡视频| 国产成人自拍在线| 欧美日韩精品一区二区三区四区| 欧美不卡一区二区三区| 中文字幕字幕中文在线中不卡视频| 午夜精品久久久久久久| 奇米精品一区二区三区在线观看一 | 中文字幕巨乱亚洲| 五月天激情小说综合| www.成人在线| 亚洲午夜国产一区99re久久| 日韩成人精品在线| 欧美视频一区在线观看| 亚洲色图在线视频| av资源站一区| 欧美激情一区二区三区四区 | 欧美一区二区三区免费大片| 国产精品久久久久一区| 884aa四虎影成人精品一区| 欧美日韩三级视频| 欧美一区二区精品在线| 日韩视频一区二区| 中文字幕二三区不卡| 一区二区视频在线看| 热久久久久久久| 国产精品主播直播| 99久久国产综合色|国产精品| 91福利精品第一导航| 欧美一区二区三区的| 伊人婷婷欧美激情| 色噜噜狠狠成人网p站| 亚洲精品免费在线观看| 色综合天天综合网天天狠天天| 欧美国产激情一区二区三区蜜月| 国产精品综合av一区二区国产馆| 国产精品毛片无遮挡高清| 99re视频精品| 久久精品国产亚洲高清剧情介绍| 中文一区在线播放| 欧美裸体一区二区三区| 成人av在线播放网站| 久久精品国产久精国产| 午夜欧美电影在线观看| 亚洲精品成人悠悠色影视| 久久精品亚洲乱码伦伦中文| 久久夜色精品国产噜噜av| 紧缚奴在线一区二区三区| 亚洲欧洲日韩综合一区二区| 欧美日韩国产小视频在线观看| 精品一区二区三区在线观看| 亚洲三级电影网站| 久久久青草青青国产亚洲免观| 91在线视频播放| 国产原创一区二区| 日韩黄色一级片| 日韩精品成人一区二区三区| 欧美午夜在线观看| 精品日韩一区二区三区免费视频| 天堂久久一区二区三区| 国产精品久久久久永久免费观看 | 成人夜色视频网站在线观看| 日韩1区2区3区| 免费欧美高清视频| 日日夜夜免费精品| 亚洲二区在线观看| 亚洲国产人成综合网站| 亚洲午夜免费电影| 亚洲免费色视频| 亚洲国产精品一区二区www| 亚洲欧美日本韩国| 亚洲第一福利一区| 亚洲二区在线视频| 蜜臂av日日欢夜夜爽一区| 麻豆精品在线观看| 成人网在线免费视频| 成人精品视频.| 色婷婷综合久色| 日韩一级片网址| 2019国产精品| 亚洲免费观看高清完整版在线| 亚洲精品国产a| 美女一区二区三区在线观看| 免费成人结看片| 91麻豆精东视频| 欧美大胆人体bbbb| 国产精品美女久久福利网站| 午夜精品国产更新| 国产白丝网站精品污在线入口| 欧美伊人久久大香线蕉综合69| 欧美日韩国产免费| 国产精品无遮挡| 美腿丝袜一区二区三区| 成人性生交大片免费看视频在线| 在线免费不卡视频| 麻豆91免费看| 日韩av一级电影| 99久久久久久99| ww久久中文字幕| 国产精品一区二区久久精品爱涩| 91老师国产黑色丝袜在线| 国产亚洲污的网站| 久久精品999| 51久久夜色精品国产麻豆| 亚洲精品日日夜夜| 99天天综合性| 欧美极品另类videosde| 日韩av在线播放中文字幕| 欧洲亚洲精品在线| 中文字幕一区在线| 91视频在线看| 一区二区三区在线不卡| 91一区二区在线| 亚洲午夜免费视频| 日韩精品中文字幕一区二区三区 | 国产剧情一区二区| 国产精品福利一区二区| 99re成人精品视频| 亚洲宅男天堂在线观看无病毒| 欧美日韩一级视频| 卡一卡二国产精品| 国产精品水嫩水嫩| 日韩欧美在线影院| 成人免费看黄yyy456| 五月综合激情婷婷六月色窝| 欧美精品一区二区三区高清aⅴ | 日韩欧美中文字幕精品| 亚洲你懂的在线视频| 国产高清亚洲一区| 国产视频一区二区在线| 国产a视频精品免费观看| 国产精品久久久久久久蜜臀| 欧洲精品一区二区| 日韩成人伦理电影在线观看| 国产午夜亚洲精品午夜鲁丝片|