У меня есть два запроса:
SELECT SELECT NamesRecord.NameID, NamesRecord.FulfillmentAddressID NameFulfillmentAddressID, ContractRecord.FulfillmentAddressID, ContractRecord.BillingAddressId
FROM Magnet.dbo.ContractRecord ContractRecord
INNER JOIN Magnet.dbo.NamesRecord NamesRecord
ON NamesRecord.NameId = ContractRecord.DonorId
WHERE NameID > -1
AND (EXISTS (
SELECT 1
FROM Magnet.dbo.AddressRecord AddressRecord
WHERE AddressRecord.AddressId = ContractRecord.FulfillmentAddressId
AND BuildingFloor LIKE 'M%')
OR EXISTS (
SELECT 1
FROM Magnet.dbo.AddressRecord AddressRecord
WHERE AddressRecord.AddressId = ContractRecord.BillingAddressId
AND BuildingFloor LIKE 'M%'))
SELECT SELECT NamesRecord.NameID, NamesRecord.FulfillmentAddressID NameFulfillmentAddressID, ContractRecord.FulfillmentAddressID, ContractRecord.BillingAddressId
FROM Magnet.dbo.ContractRecord ContractRecord
INNER JOIN Magnet.dbo.NamesRecord NamesRecord
ON NamesRecord.NameId = ContractRecord.DonorId
WHERE NameID > -1
AND (EXISTS (SELECT 1
FROM Magnet.dbo.AddressRecord AddressRecord
WHERE AddressRecord.AddressId IN (ContractRecord.FulfillmentAddressId, ContractRecord.BillingAddressId)
AND BuildingFloor LIKE 'M%'))
Первый запрос выполняется более чем в 10 раз быстрее, чем второй. В соответствии с планом выполнения, первый запрос использует два сканирования кластеризованного индекса с «BuildingFloor LIKE 'M%'» в качестве предиката и поиск индекса в ContractRecord для каждого из подвыборов в предложении WHERE (стоимость 40% на к югу от выбора).
Во втором запросе используется поиск кластеризованного индекса с «BuildingFloor LIKE« M% »» в качестве предиката и предикат поиска для ограничений AddressId (стоимость 96%). Подсчитанное количество строк также полностью отсутствует (фактическое значение 250 против 1).
Как улучшить производительность второго запроса? Могу ли я заставить SQL Server выбрать альтернативную стратегию или мне нужно изменить индексы в таблицах?