Я знаю, что это очень старый вопрос, но если кто-то все еще ищет решение, вы можете попробовать это. Недавно я столкнулся с той же проблемой, и это был относительно простой запрос, всего три таблицы в соединении, самая большая из них с более чем 1000 строк. К сожалению, у меня не было привилегий для просмотра плана exec, поэтому мне пришлось импровизировать.
select * from subquery_x;
очень быстро, практически мгновенно закончил (вернул всего около 500 строк) как положено
select * from subquery_x where column_x = 1
dtto, очень быстрый, column_x - это ненулевой битовый столбец
select * from subquery_x where column_x = 0
select * from subquery_x where column_x != 1
должно вернуть около 300 строк, оба очень, очень медленные, на самом деле это заняло несколько минут !!
простое (но странное) решение - преобразовать столбец в выражении where в tinyint
select * from subquery_x where convert(tinyint,column_x) = 0
Я знаю, что это может иметь некоторые побочные эффекты для производительности, но это работало как чудо, сравнение преобразованного значения столбца с 1 также было очень быстрым, поэтому я допустил это так (он использовался в отчете с предоставленным сравнительным значением в качестве параметра)
Если кто-то знает, почему это происходит, дайте нам знать, я подозреваю, что это ошибка, но кто знает, может также быть неприятной функцией: -)