在SQL Server中,SQL語句的執行是依賴查詢優化器生成的執行計劃,而執行計劃的好壞直接關乎執行性能。
在查詢優化器生成執行計劃過程中,需要參考元數據來盡可能生成高效的執行計劃,因此元數據越多,則執行計劃更可能會高效。所謂需要參考的元數據主要包括:索引、表結構、統計信息等,但還有一些不是很被注意的元數據,其中包括本文闡述的Check約束。
查詢優化器在生成執行計劃之前有一個階段叫做代數樹優化,比如說下面這個簡單查詢:
圖1.簡單查詢
查詢優化器意識到1=2這個條件是永遠不相等的,因此不需要返回任何數據,因此也就沒有必要掃描表,從圖1執行計劃可以看出僅僅掃描常量后確定了1=2永遠為false后,就可完成查詢。
那么Check約束呢
Check約束可以確保一列或多列的值符合表達式的約束。在某些時候,Check約束也可以為優化器提供信息,從而優化性能,比如看圖二的例子。
圖2.有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]<='2007-12-31'))
GO
ALTER TABLE [dbo].[Test2007] CHECK CONSTRAINT [CK_Test2007]
GO
新聞熱點
疑難解答