Добро пожаловать в форум, Guest  >>   Войти | Регистрация | Поиск | Правила | В избранное | Подписаться
Все форумы / Microsoft SQL Server Новый топик    Ответить
 With + INNER JOIN  [new]
Testor1
Member

Откуда:
Сообщений: 679
Всем привет!


В каких случаях имеет смысл использовать With с inner join?
К примеру если кол-во строк в каждой из таблиц более N миллионов, а WHERE сокращает кол-во строк до 1%

WITH query1(col1,col2) AS 
(
  SELECT col1, col2 
  FROM table1
  WHERE col1 = @col1
),
WITH query2(col1,col2) AS 
(
  SELECT col1, col2 
  FROM table2
  WHERE col2 = @col2
),
SELECT * 
FROM query1 q1 INNER JOIN query2 q2 ON  q1.col1 = q2.col1


или классика более шустрая или они вообще равнозначны ?

SELECT 
FROM table1 t1 INNER JOIN table2 t2 ON  t1.col1 = t2.col1
WHERE t.col1 = @col1 AND t.col2 = @col2
13 ноя 12, 21:01    [13467985]     Ответить | Цитировать Сообщить модератору
 Re: With + INNER JOIN  [new]
Glory
Member

Откуда:
Сообщений: 104760
Testor1
В каких случаях имеет смысл использовать With с inner join?

with - это синтаксический "сахар"

Testor1
или классика более шустрая или они вообще равнозначны ?

На такие вопросы отвечает план выполнения.
14 ноя 12, 00:29    [13468711]     Ответить | Цитировать Сообщить модератору
 Re: With + INNER JOIN  [new]
Testor1
Member

Откуда:
Сообщений: 679
Glory,

В приведенном случае сначала делается inner join, а потом фильтрация по условию where для второй таблицы?

Не всегда получается смотреть на план запросов. Когда пишешь код, думаешь о том как проще все сделать, но с учетом теории. Как всегда мало времени на все. Вот и хочу понять как работает в теории.


SELECT *
FROM table1 t1 INNER JOIN table2 t2 ON  t1.col1 = t2.col1
WHERE t1.col1 = @col1 AND t2.col2 = @col2


Как я понимаю:
1. Построчно получаем записи из table1, которые соответствуют значению условию t.col1 = @col1
2. Из table2 получаем данные, которые соответствуют t1.col1 = t2.col1
3. Из результат пункта 2. фильтруются записи, которые удовлетворяют t.col2 = @col2

Я не уверен в последовательности пункта 2 и 3. Возможно они должны быть в другой последовательности ?
14 ноя 12, 14:24    [13472171]     Ответить | Цитировать Сообщить модератору
 Re: With + INNER JOIN  [new]
iap
Member

Откуда: Москва
Сообщений: 47001
Testor1
Glory,

В приведенном случае сначала делается inner join, а потом фильтрация по условию where для второй таблицы?

Не всегда получается смотреть на план запросов. Когда пишешь код, думаешь о том как проще все сделать, но с учетом теории. Как всегда мало времени на все. Вот и хочу понять как работает в теории.


SELECT *
FROM table1 t1 INNER JOIN table2 t2 ON  t1.col1 = t2.col1
WHERE t1.col1 = @col1 AND t2.col2 = @col2


Как я понимаю:
1. Построчно получаем записи из table1, которые соответствуют значению условию t.col1 = @col1
2. Из table2 получаем данные, которые соответствуют t1.col1 = t2.col1
3. Из результат пункта 2. фильтруются записи, которые удовлетворяют t.col2 = @col2

Я не уверен в последовательности пункта 2 и 3. Возможно они должны быть в другой последовательности ?
Да. Оптимизатор проверяет по возможности все допустимые последовательности действий,
приводящих к правильному результату, в поисках оптимального плана.
При этом использует важную дополнительную информацию, например, статистику.

Наше дело - лишь логически и синтаксически правильно писать запросы.
14 ноя 12, 14:29    [13472213]     Ответить | Цитировать Сообщить модератору
 Re: With + INNER JOIN  [new]
Glory
Member

Откуда:
Сообщений: 104760
Testor1
В приведенном случае сначала делается inner join, а потом фильтрация по условию where для второй таблицы?

Я не оптимизатор вашего сервера
В Студии нажмите кнопку получения предварительного или реального плана выполнения

Testor1
Я не уверен в последовательности пункта 2 и 3. Возможно они должны быть в другой последовательности ?

А вот вы похоже стремтесь подменить оптимизатор
14 ноя 12, 14:30    [13472217]     Ответить | Цитировать Сообщить модератору
 Re: With + INNER JOIN  [new]
Testor1
Member

Откуда:
Сообщений: 679
Glory,

Хорошо,

Правильно тогда я понимаю, что при написании кода не надо тратить время и рессурсы на анализ производительности кода, а нужно просто писать то, что нужно получить. Все остальное - дело сервера и админа?
14 ноя 12, 14:47    [13472381]     Ответить | Цитировать Сообщить модератору
 Re: With + INNER JOIN  [new]
Glory
Member

Откуда:
Сообщений: 104760
Testor1
Правильно тогда я понимаю, что при написании кода не надо тратить время и рессурсы на анализ производительности кода, а нужно просто писать то, что нужно получить. Все остальное - дело сервера и админа?

TSQL - это декларативный язык
Вы указываете, что вы хотите получить, а не как вы хотите это получить
14 ноя 12, 14:51    [13472419]     Ответить | Цитировать Сообщить модератору
 Re: With + INNER JOIN  [new]
iap
Member

Откуда: Москва
Сообщений: 47001
Testor1
Glory,

Хорошо,

Правильно тогда я понимаю, что при написании кода не надо тратить время и рессурсы на анализ производительности кода, а нужно просто писать то, что нужно получить. Все остальное - дело сервера и админа?
Однако, одно и то же можно даже логически получить несколькими способами.
Выбор между ними - это точно не функция сервера! А производительность разная...

Оджнако, на выбор оптимального плана выполнения серверу даётся ограниченное время.
Если написать достаточно сложный запрос с большим количеством JOINов, то, возможно, придётся и самому помучиться.
Потому что сервер не успеет перебрать все варианты выполнения и остановиться на самом оптимальном.
14 ноя 12, 15:16    [13472697]     Ответить | Цитировать Сообщить модератору
 Re: With + INNER JOIN  [new]
Testor1
Member

Откуда:
Сообщений: 679
iap
Testor1
Glory,

Хорошо,

Правильно тогда я понимаю, что при написании кода не надо тратить время и рессурсы на анализ производительности кода, а нужно просто писать то, что нужно получить. Все остальное - дело сервера и админа?
Однако, одно и то же можно даже логически получить несколькими способами.
Выбор между ними - это точно не функция сервера! А производительность разная...

Оджнако, на выбор оптимального плана выполнения серверу даётся ограниченное время.
Если написать достаточно сложный запрос с большим количеством JOINов, то, возможно, придётся и самому помучиться.
Потому что сервер не успеет перебрать все варианты выполнения и остановиться на самом оптимальном.


Вот и я думаю, что нужно знать основные принципы и стараться ими руководствоваться, а все остальное доверить серверу
14 ноя 12, 15:35    [13472941]     Ответить | Цитировать Сообщить модератору
 Re: With + INNER JOIN  [new]
alexeyvg
Member

Откуда: Moscow
Сообщений: 31439
Glory
Testor1
Правильно тогда я понимаю, что при написании кода не надо тратить время и рессурсы на анализ производительности кода, а нужно просто писать то, что нужно получить. Все остальное - дело сервера и админа?

TSQL - это декларативный язык
Вы указываете, что вы хотите получить, а не как вы хотите это получить
Это правильно только в теории. На практике приходится отступать от декларативности, оптимизатор же не идеален...

Естественно, к примерам в стартовом топике это не относится - они слишком простые.
14 ноя 12, 16:01    [13473277]     Ответить | Цитировать Сообщить модератору
 Re: With + INNER JOIN  [new]
Testor1
Member

Откуда:
Сообщений: 679
alexeyvg
Glory
пропущено...

TSQL - это декларативный язык
Вы указываете, что вы хотите получить, а не как вы хотите это получить
Это правильно только в теории. На практике приходится отступать от декларативности, оптимизатор же не идеален...

Естественно, к примерам в стартовом топике это не относится - они слишком простые.


Не совсем согласен, что простые.
При большом объеме данных в двух таблицах производительность может быть низкой.

Допустим что INNER JOIN происходит по столбцам типа varchar(10). Искусственно усложнил задачу.
14 ноя 12, 19:25    [13474556]     Ответить | Цитировать Сообщить модератору
Все форумы / Microsoft SQL Server Ответить