SQL Server中使用Check約束達到提升效能

johnychen發表於2021-09-09

    在SQL Server中,SQL語句的執行是依賴查詢最佳化器生成的執行計劃,而執行計劃的好壞直接關乎執行效能。

    在查詢最佳化器生成執行計劃過程中,需要參考後設資料來儘可能生成高效的執行計劃,因此後設資料越多,則執行計劃更可能會高效。所謂需要參考的後設資料主要包括:索引、表結構、統計資訊等,但還有一些不是很被注意的後設資料,其中包括本文闡述的Check約束。

    查詢最佳化器在生成執行計劃之前有一個階段叫做代數樹最佳化,比如說下面這個簡單查詢:

圖片描述


圖片描述

 

 圖2是一個簡單的例子,有時候在分割槽檢視中應用Check約束也會提升效能,測試程式碼如下:

CREATE TABLE [dbo].[Test2007](
    [ProductReviewID] [int] IDENTITY(1,1) NOT NULL,
    [ReviewDate] [datetime] NOT NULL
) ON [PRIMARY]
 
GO
 
ALTER TABLE [dbo].[Test2007]  WITH CHECK ADD  CONSTRAINT [CK_Test2007] CHECK  (([ReviewDate]>='2007-01-01' AND [ReviewDate]='2008-01-01' AND [ProductReviewID]

    我們針對Test2007和Test2008兩張表結構一模一樣的表做了一個分割槽檢視。並對日期列做了Check約束,限制每張表包含的資料都是特定一年內的資料。當我們對檢視進行查詢並給定不同的篩選條件時,可以看到結果如圖3所示。

圖片描述

 

    由圖3可以看出,當篩選條件為2007年時,自動只掃描2007年的表,2008年的表也是同樣。而當查詢範圍超出了2007和2008年的Check約束後,查詢最佳化器自動判定結果為空,因此不做任何IO操作,從而提升了效能。

 

結論

    在Check約束條件為簡單的情況下(指的是約束限制在單列且表示式中不包含函式),不僅可以約束資料完整性,在很多時候還能夠提供給查詢最佳化器資訊從而提升效能。

來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/4301/viewspace-2800060/,如需轉載,請註明出處,否則將追究法律責任。

相關文章