У меня большой объем данных, разделенных на таблицы по состоянию в 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'"