gpt4 book ai didi

sql - 为什么 SQL Server 优化器不使用 CHECK 约束定义来查找哪个表包含行?

转载 作者:行者123 更新时间:2023-12-05 09:22:24 26 4
gpt4 key购买 nike

我使用 SQL Server 2012,我有一个大表,我将我的表分成了一些表,如下所示:

Create Table A2013
(
Id int identity(1,1),
CountA int ,
Name varchar(50),
ADate DATETIME NULL
CHECK (DATEPART(yy, ADate) = 2013)
)

Create Table A2014
(
Id int identity(1,1),
CountA int ,
Name varchar(50),
ADate DATETIME NULL
CHECK (DATEPART(yy, ADate) = 2014)
)

Insert Into A2013 Values ( 102 , 'A','20131011' )
Insert Into A2013 Values (15 , 'B' ,'20130211' )
Insert Into A2013 Values ( 54, 'C' ,'20131211' )
Insert Into A2013 Values ( 54, 'D' ,'20130611' )
Insert Into A2013 Values ( 95, 'E' ,'20130711' )
Insert Into A2013 Values (8754 , 'F' ,'20130310' )

Insert Into A2014 Values ( 102 , 'A','20141011' )
Insert Into A2014 Values (15 , 'B' ,'20140911' )
Insert Into A2014 Values ( 54, 'C' ,'20140711' )
Insert Into A2014 Values ( 54, 'D' ,'20141007' )
Insert Into A2014 Values ( 95, 'E' ,'20140411' )
Insert Into A2014 Values (8754 , 'F' ,'20140611' )

我创建了一个分区 View ,如下所示:

Create View A 
As
Select * From A2013
Union
Select * From A2014

我希望 SQL Optimizer 使用一个好的计划并使用我的 CHECK 约束定义来确定哪个成员表包含行,但在运行此查询时它会扫描两个表:

Select * From A Where A.ADate = '20140611'

enter image description here

我预计 SQL 优化器不使用表 A2013?!?

最佳答案

CHECK CONSTRAINT 表达式必须是 sargable以便优化器消除执行计划中不需要的表。下面的约束避免将函数应用于列并且是可搜索的:

CREATE TABLE dbo.A2013
(
Id int IDENTITY(1, 1)
, CountA int
, Name varchar(50)
, ADate datetime NULL
CONSTRAINT CK_A2013_ADate
CHECK ( ADate >= '20130101'
AND ADate < '20140101' )
);

CREATE TABLE dbo.A2014
(
Id int IDENTITY(1, 1)
, CountA int
, Name varchar(50)
, ADate datetime NULL
CONSTRAINT CK_A2014_ADate
CHECK ( ADate >= '20140101'
AND ADate < '20150101' )
);

关于sql - 为什么 SQL Server 优化器不使用 CHECK 约束定义来查找哪个表包含行?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26985080/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com