У меня есть три таблицы:
SmallTable
(id int, flag1 bit, flag2 bit)
JoinTable
(SmallTableID int, BigTableID int)
BigTable
(id int, text1 nvarchar(100), otherstuff...)
SmallTable
имеет не более нескольких десятков записей. BigTable
имеет несколько миллионов и фактически представляет собой UNIONS таблицу в этой базе данных с таблицей в другой базе данных на том же сервере.
Вот логика соединения:
SELECT * FROM
SmallTable s
INNER JOIN JoinTable j ON j.SmallTableID = s.ID
INNER JOIN BigTable b ON b.ID = j.BigTableID
WHERE
(s.flag1=1 OR b.text1 NOT LIKE 'pattern1%')
AND (s.flag2=1 OR b.text1 <> 'value1')
Средний объединенный размер - несколько тысяч результатов. Все показанное проиндексировано.
Для большинства SmallTable
записей flag1
и flag2
установлены на 1
, поэтому на самом деле нет необходимости даже обращаться к индексу на BigTable.text1, но SQL Server все равно делает, что приводит к дорогостоящим индексированным Сканирование и вложенная петля.
Есть ли лучший способ намекнуть SQL Server, что, если flag1
и flag2
оба установлены на 1
, он даже не должен беспокоиться о text1
?
На самом деле, если я смогу полностью избежать объединения с BigTable в этих случаях (JoinTable управляется, так что это не создаст проблемы), это сделает этот ключевой запрос еще быстрее.