Где мои SQL ограничения проверки сервера не работают при выполнении объединений? - PullRequest
0 голосов
/ 15 апреля 2020

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

1 Ответ

0 голосов
/ 15 апреля 2020

Однако, если я выполняю второй запрос без ограничителя состояния (remove: AND C .State = 'TN'), он запрашивает каждую отдельную таблицу. Это происходит, хотя каждый адрес магазина № 1000 находится в Теннесси.

Я просто озадачен этим наблюдением. Как база данных узнает, где находится хранилище № 1000, если оно не выглядит?

Предоставляя state, вы сообщаете базе данных, что это так.

Я думаю, вам было бы намного лучше с одной таблицей и индексом store.

...