为了账号安全,请及时绑定邮箱和手机立即绑定

SQL Server中使用Check约束达到提升性能

标签:
SQL Server

    在SQL Server中,SQL语句的执行是依赖查询优化器生成的执行计划,而执行计划的好坏直接关乎执行性能。

    在查询优化器生成执行计划过程中,需要参考元数据来尽可能生成高效的执行计划,因此元数据越多,则执行计划更可能会高效。所谓需要参考的元数据主要包括:索引、表结构、统计信息等,但还有一些不是很被注意的元数据,其中包括本文阐述的Check约束。

    查询优化器在生成执行计划之前有一个阶段叫做代数树优化,比如说下面这个简单查询:

https://img1.sycdn.imooc.com//5acc2b0e000147dc04140248.jpg


https://img1.sycdn.imooc.com//5acc2b66000177ea04700262.jpg

 

 图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
 
 
CREATE TABLE [dbo].[Test2008](
    [ProductReviewID] [int] IDENTITY(1,1) NOT NULL,
    [ReviewDate] [datetime] NOT NULL
) ON [PRIMARY]
 
GO
 
ALTER TABLE [dbo].[Test2008]  WITH CHECK ADD  CONSTRAINT [CK_Test2008] CHECK  (([ReviewDate]>='2008-01-01' AND [ProductReviewID]<='2008-12-31'))
GO
 
ALTER TABLE [dbo].[Test2008] CHECK CONSTRAINT [CK_Test2008]
GO
 
INSERT INTO [Test2008] values('2008-05-06')
INSERT INTO [Test2007] VALUES('2007-05-06')
 
CREATE VIEW testPartitionView
AS
SELECT * FROM Test2007
UNION
SELECT * FROM Test2008
 
SELECT * FROM testPartitionView
WHERE [ReviewDate]='2007-01-01'
 
 
SELECT * FROM testPartitionView
WHERE [ReviewDate]='2008-01-01'
 
 
SELECT * FROM testPartitionView
WHERE [ReviewDate]='2010-01-01'

    我们针对Test2007和Test2008两张表结构一模一样的表做了一个分区视图。并对日期列做了Check约束,限制每张表包含的数据都是特定一年内的数据。当我们对视图进行查询并给定不同的筛选条件时,可以看到结果如图3所示。

https://img1.sycdn.imooc.com//5acc2b930001a51b06650496.jpg

 

    由图3可以看出,当筛选条件为2007年时,自动只扫描2007年的表,2008年的表也是同样。而当查询范围超出了2007和2008年的Check约束后,查询优化器自动判定结果为空,因此不做任何IO操作,从而提升了性能。

 

结论

    在Check约束条件为简单的情况下(指的是约束限制在单列且表达式中不包含函数),不仅可以约束数据完整性,在很多时候还能够提供给查询优化器信息从而提升性能。

点击查看更多内容
TA 点赞

若觉得本文不错,就分享一下吧!

评论

作者其他优质文章

正在加载中
  • 推荐
  • 评论
  • 收藏
  • 共同学习,写下你的评论
感谢您的支持,我会继续努力的~
扫码打赏,你说多少就多少
赞赏金额会直接到老师账户
支付方式
打开微信扫一扫,即可进行扫码打赏哦
今天注册有机会得

100积分直接送

付费专栏免费学

大额优惠券免费领

立即参与 放弃机会
意见反馈 帮助中心 APP下载
官方微信

举报

0/150
提交
取消