在执行联接时,我的SQL Server检查约束在哪里不起作用



在SQL Server 2019中,我有大量按状态划分为表的数据。我对每个表都有一个检查约束,如下所示:

ALTER TABLE [dbo].[StateData_TN] WITH CHECK 
ADD CONSTRAINT [CK_StateData_TN_State] CHECK (([State] = 'TN'))
GO
ALTER TABLE [dbo].[StateData_TN] CHECK CONSTRAINT [CK_StateData_TN_State]
GO

然后,我有一个视图,它将所有的"状态"表组合起来进行如下查询:

CREATE VIEW [dbo].[vw_StateData] 
AS
SELECT * FROM dbo.StateData_AK WHERE State = 'AK'
UNION ALL
SELECT * FROM dbo.StateData_AL WHERE State = 'AL'
UNION ALL
SELECT * FROM dbo.StateData_AR WHERE State = 'AR'
UNION ALL
SELECT * FROM dbo.StateData_AZ WHERE State = 'AZ'
UNION ALL
SELECT * FROM dbo.StateData_CA WHERE State = 'CA'
etc...

如果我运行这两个查询中的任何一个,查询计划显示它只命中StateData_TN表:

SELECT SD.RecordId
FROM dbo.vw_StateData SD
WHERE SD.state = 'TN'
SELECT C.CustomerId, SD.RecordId
FROM dbo.Customer C
INNER JOIN dbo.vw_StateData SD ON C.State = SD.state 
AND C.Zip5 = SD.zipcode 
AND C.StandardizedAddress = SD.standardizedaddress
WHERE C.StoreNum = 1000 AND C.State = 'TN'

但是,如果我在没有状态限制器的情况下运行第二个查询(remove:AND C.state='TN'(,它会查询每个表。即使1000号商店的每个地址都在田纳西州,这种情况也会发生。

有没有什么方法可以设置它,使它不会碰到状态不在它所加入的表中的表?使用和不使用"and C.State='TN'"的查询在速度上存在巨大差异

但是,如果我在没有状态限制器的情况下运行第二个查询(remove:AND C.state='TN'(,它会查询每个表。即使1000号商店的每个地址都在田纳西州,这种情况也会发生。

我只是对这一观察感到困惑。数据库如何知道#1000存储在哪里,除非它看起来像?

通过提供state,您告诉数据库情况就是这样。

我认为在store上使用一个表和一个索引会更好。

最新更新