SQL Server中使用Check約束達到提升效能
在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/,如需轉載,請註明出處,否則將追究法律責任。
相關文章
- 【SQL】15 SQL 約束(Constraints)、NOT NULL 約束、UNIQUE 約束、PRIMARY KEY 約束、FOREIGN KEY 約束、CHECK 約束、DEFAULT約束SQLAINull
- SQL Server 資料表程式碼建立約束SQLServer
- SQL約束SQL
- 在 SQL Server 中 你可以使用以下查詢來找到引用 的 FOREIGN KEY 約束SQLServer
- 在 SQL Server 中,建立表時可以直接為欄位新增唯一約束(UNIQUE)SQLServer
- .sql檔案匯入到sql server中SQLServer
- SQL Server中提前找到隱式轉換提升效能的辦法SQLServer
- Sql server 檢視錶引用、依賴項,刪除表及約束 指令碼SQLServer指令碼
- SQL Server中的IO效能殺手Forwarded recordSQLServerForward
- sql server 使用SQLServer
- 【學習】SQL基礎-014-約束SQL
- SQL教程——常見的約束型別SQL型別
- Sql Server 自定義約束 實現:某列 可空,但非空值唯一不重複SQLServer
- Eclipse中引入MyBatis約束EclipseMyBatis
- SQL Server 2005效能調整一(zt)SQLServer
- SQL Server 2005效能調整二(zt)SQLServer
- composer 版本約束使用方法
- PostgreSQL唯一約束如何使用?SQL
- 約束
- SQL外來鍵約束的含義及建立SQL
- Eclipse中引入spring的約束EclipseSpring
- 10、Oracle中的約 束constraintOracleAI
- 非功能性約束之效能(1)-效能銀彈:快取快取
- [AlwaysOn] 建立SQL Server高可用性組T-SQL語法:HEALTH_CHECK_TIMEOUT引數SQLServer
- Javaweb-約束-外來鍵約束JavaWeb
- 錯誤內容:You have an error in your SQL syntax; check the manual that corresponds to your MySQL serverErrorMySqlServer
- 如何改善SQL Server + SharePoint組合效能BGSQLServer
- Vivado使用技巧(29):約束功能概述
- 升級check SQL01SQL
- SQL Server 2008中Analysis Services的新特性——深入SQL Server 2008SQLServer
- 最高TPM達340萬,騰訊雲SQL Server資料庫效能再破紀錄SQLServer資料庫
- 約束CONSTRAINTAI
- 03約束
- MySQL 約束MySql
- SQL Server中GROUP BY(連結)SQLServer
- cmd命令列下用命令執行SQL指令碼到SQL Server資料庫中命令列SQL指令碼Server資料庫
- 【MySQL】MySQL基礎(SQL語句、約束、資料型別)MySql資料型別
- Vivado使用技巧(30):使用時序約束嚮導