Приведение MSSQL ([varcharColumn] к int) в SELECT выполняется до того, как предложение WHERE отфильтровывает неверные значения
create table dbo.Parent (
Id bigint NOT NULL,
TypeId int NOT NULL
)
create table dbo.Child (
Id bigint NOT NULL,
ParentId bigint NOT NULL,
TypeId int NOT NULL,
varcharColumn varchar(300) NULL
)
select cast(c.varcharColumn as int)
from dbo.Parent p (nolock)
inner join dbo.Child c (nolock)
on p.Id = c.ParentId
and c.TypeId = 2
where p.TypeId = 13
Перерыв:Мы получаем разрыв приведения из-за значения, которое не может быть преобразовано в int. В этом случае: "123-1", Странно то, что приведенное значение отфильтровывается из окончательного набора результатов.
Например, это возвращает ноль результатовselect c.varcharColumn
from dbo.Parent p (nolock)
inner join dbo.Child c (nolock)
on p.Id = c.ParentId
and c.TypeId = 2
where p.TypeId = 13
and c.varcharColumn = '123-1'
План запроса заканчивается просмотром таблицы Child и применением функции cast перед предложением where.
Мы смогли это исправить, создав новый индекс для дочерней таблицы (он делал PKсканирование)
create index [NCIDX_dbo_Child__TypeId] on dbo.Child (
TypeId
)
include (
ParentId,
varcharColumn
)
Теперь он фильтрует на родительской таблицеs где пункт первым.
Есть ли способ исправить это без дополнительного индекса? И еще раз, пожалуйста, воздержитесь от любых предложений, связанных с исправлением нашей схемы. Это определенно правильное решение в этом случае.
Меня больше всего интересует понимание того, почему он применил приведение, прежде чем отфильтровать набор результатов.
Спасибо
Изменить - Ответ:Большое спасибо и Аарону, и Гордону. Если я когда-либо получу больше 15 очков, яЯ вернусь и вернем оба ваших ответа.
В итоге нам понадобился Гордонответ, так как мы хотели использовать этот запрос в представлении. Несколько человек в офисе опасались использовать заявление случая, потому что они предпочитают иметь больший контроль над тем, чтобы у нас сначала был меньший набор результатов (Аарон 's ответ), однако все сводится к просмотру плана запроса и проверке количества прочитанных.
Еще раз спасибо за все ответы!