Что выполняет первое предложение WHERE или предложение JOIN

Какое предложение выполняется сначала в SELECT ?

У меня есть сомнение в select запроса на этой основе.

рассмотрим приведенный ниже пример

 SELECT * FROM #temp A INNER JOIN #temp B ON A.id = B.id INNER JOIN #temp C ON B.id = C.id WHERE A.Name = 'Acb' AND B.Name = C.Name 
  1. Независимо от того, сначала он проверяет WHERE , а затем выполняет INNER JOIN

  2. Сначала JOIN а затем проверьте состояние?

Если он сначала выполняет JOIN а затем условие WHERE ; как он может выполнять больше, когда условия для разных JOIN ?

Концептуальный порядок обработки запросов:

 1. FROM 2. WHERE 3. GROUP BY 4. HAVING 5. SELECT 6. ORDER BY 

Но это всего лишь концептуальный порядок. Фактически, двигатель может решить переупорядочить предложения. Вот доказательство. Позволяет сделать 2 таблицы по 1000000 строк:

 CREATE TABLE test1 (id INT IDENTITY(1, 1), name VARCHAR(10)) CREATE TABLE test2 (id INT IDENTITY(1, 1), name VARCHAR(10)) ;WITH cte AS(SELECT -1 + ROW_NUMBER() OVER(ORDER BY (SELECT NULL)) d FROM (VALUES(1),(1),(1),(1),(1),(1),(1),(1),(1),(1)) t1(n) CROSS JOIN (VALUES(1),(1),(1),(1),(1),(1),(1),(1),(1),(1)) t2(n) CROSS JOIN (VALUES(1),(1),(1),(1),(1),(1),(1),(1),(1),(1)) t3(n) CROSS JOIN (VALUES(1),(1),(1),(1),(1),(1),(1),(1),(1),(1)) t4(n) CROSS JOIN (VALUES(1),(1),(1),(1),(1),(1),(1),(1),(1),(1)) t5(n) CROSS JOIN (VALUES(1),(1),(1),(1),(1),(1),(1),(1),(1),(1)) t6(n)) INSERT INTO test1(name) SELECT 'a' FROM cte 

Теперь запустите 2 запроса:

 SELECT * FROM dbo.test1 t1 JOIN dbo.test2 t2 ON t2.id = t1.id AND t2.id = 100 WHERE t1.id > 1 SELECT * FROM dbo.test1 t1 JOIN dbo.test2 t2 ON t2.id = t1.id WHERE t1.id = 1 

Вначале уведомление будет фильтровать большинство строк в состоянии join , второе – при условии. Посмотрите готовые планы:

1 TableScan – Predicate: [Test]. [Dbo]. [Test2]. [Id] as [t2]. [Id] = (100)

2 TableScan – Predicate: [Test]. [Dbo]. [Test2]. [Id] as [t2]. [Id] = (1)

Это означает, что в первом оптимизированном запросе сначала решалось оценить условие join чтобы отфильтровать строки, во-вторых, сначала оно оценило предложение.

Логический порядок фаз обработки запросов:

  1. FROM – Включая JOIN s
  2. WHERE
  3. GROUP BY
  4. HAVING
  5. SELECT
  6. ORDER BY

Вы можете иметь столько же условий, сколько даже в своих предложениях JOIN или WHERE . Подобно:

 Select * from #temp A INNER JOIN #temp B ON A.id = B.id AND .... AND ... INNER JOIN #temp C ON B.id = C.id AND .... AND ... Where A.Name = 'Acb' AND B.Name = C.Name AND .... 

Вы можете ссылаться на MSDN

Строки, выбранные запросом, сначала фильтруются условиями соединения предложения FROM, условиями поиска предложения WHERE, а затем условиями поиска предложения HAVING. Внутренние соединения могут быть указаны в предложениях FROM или WHERE без влияния на конечный результат.

Вы также можете использовать SET SHOWPLAN_ALL ON перед выполнением вашего запроса, чтобы отобразить план выполнения вашего запроса, чтобы вы могли измерить разницу в производительности в двух.

вы можете обратиться к этой оптимизации соединения

 SELECT * FROM T1 INNER JOIN T2 ON P1(T1,T2) INNER JOIN T3 ON P2(T2,T3) WHERE P(T1,T2,T3) 

Алгоритм объединения вложенных циклов выполнил бы этот запрос следующим образом:

 FOR each row t1 in T1 { FOR each row t2 in T2 such that P1(t1,t2) { FOR each row t3 in T3 such that P2(t2,t3) { IF P(t1,t2,t3) { t:=t1||t2||t3; OUTPUT t; } } } } 
  • Как правильно присоединиться к таблице дат в T-SQL?
  • Получить все строки из таблицы A, где не существует соответствующей строки в таблице B
  • MySQL: как удалить одну строку многострочной записи на основе столбца
  • Поворот столбцов в строки для объединенных таблиц
  • Как мне присоединиться к моим таблицам?
  • Почему временные таблицы быстрее, чем переменные таблицы для соединений?
  • Есть ли документация в / может кто-нибудь объяснить вложенное соединение в TSQL?
  • Sql: Получить атрибуты, объединив 3 таблицы
  • одна команда sql с двумя строками соединения
  • Отображение и объединение таблицы с использованием столбца с нулевыми значениями
  • Левое соединение, если нет данных, иначе Внутреннее соединение
  • Давайте будем гением компьютера.