
Автор: Craig Freedman Implied Predicates and Query Hints
В этой статье будут рассмотрены некоторые странности с
предикатами в планах запросов. Рассмотрим следующую тривиальную схему и запрос:
CREATE TABLE T1 (A INT, B INT)
CREATE TABLE T2 (A INT, B INT)
SELECT *
FROM T1 INNER JOIN T2 ON T1.A = T2.A
WHERE T1.B = 0
OPTION (HASH JOIN)
Как и задумывалось, этот запрос будет выполняться со следующим планом:
|--Hash Match(Inner Join,
HASH:([T1].[A])=([T2].[A]), RESIDUAL:([T2].[A]=[T1].[A]))
|--Table
Scan(OBJECT:([T1]), WHERE:([T1].[B]=(0)))
|--Table Scan(OBJECT:([T2]))
На самом деле, этот запрос получит такой план с подсказкой или без нее. Теперь давайте внесем небольшое изменение в предложение WHERE и посмотрим, что произойдет:
SELECT *
FROM T1 INNER JOIN T2 ON T1.A = T2.A
WHERE T1.A = 0
OPTION (HASH JOIN)
Теперь этот запрос выдает сообщение об ошибке:
Msg 8622, Level 16, State 1, Line 1
Query processor could not produce a query plan because of the hints defined in this query. Resubmit the query without specifying any hints and without using SET FORCEPLAN.