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
- CHECK約束中的NULL條件Null
- Sql Server系列:鍵和約束SQLServer
- SQL SERVER中找出拙劣的約束,索引,外來鍵SQLServer索引
- sql server中預設約束的通用sql指令碼的刪除方法SQLServer指令碼
- SQL約束SQL
- SQL Server 資料表程式碼建立約束SQLServer
- SQL Server2008建立約束圖解SQLServer圖解
- SQL Server約束和DML觸發器的比較SQLServer觸發器
- sql: 查詢約束SQL
- 在 SQL Server 中 你可以使用以下查詢來找到引用 的 FOREIGN KEY 約束SQLServer
- 在 SQL Server 中,建立表時可以直接為欄位新增唯一約束(UNIQUE)SQLServer
- SQL之延遲約束SQL
- 練習:NICK方案中PurchaseOrder新增CHECK型別的約束,要求ReceivedDate >= PODate型別
- SQL FOREIGN KEY 約束SQL
- .sql檔案匯入到sql server中SQLServer
- oracle中的約束Oracle
- SQL Server中,WITH AS的使用SQLServer
- Sql server 檢視錶引用、依賴項,刪除表及約束 指令碼SQLServer指令碼
- SQL Server中提前找到隱式轉換提升效能的辦法SQLServer
- SQL教程——常見的約束型別SQL型別
- Eclipse中引入MyBatis約束EclipseMyBatis
- SQL Server中的IO效能殺手Forwarded recordSQLServerForward
- PostgreSQL唯一約束如何使用?SQL
- SQL Server MDX中軸的使用SQLServer
- 資料庫約束 主鍵-唯一性-Check-外來鍵資料庫
- Javaweb-約束-外來鍵約束JavaWeb
- [zt] 使用SQL Server中的Linked Server及Remote ServerSQLServerREM
- SQL的主鍵和外來鍵約束SQL
- 非功能性約束之效能(1)-效能銀彈:快取快取
- Oracle定義約束 外來鍵約束Oracle
- 【SQL】使用sql更改表的列的資料型別和新增新列和約束SQL資料型別
- Sql最佳化(十六) 使用陣列技術提升效能SQL陣列
- SQL中給varchar2(5)資料型別合適的約束SQL資料型別
- composer 版本約束使用方法
- Oracle約束Oracle
- oracle 約束Oracle