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

Откуда:
Сообщений: 351
Добрый день!
Нужна помощь в понимании теории использования временных таблиц в MS SQL. Основы известны - где лежит, как взаимодействует с сеансами итп.

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

Хотелось бы понять: в каких случаях это не так: т.е. когда join c подзапросом будет эффективнее.

Например, навскидку мне кажется, что в случае, если tempDb и так высоконагружен (например, если включен режим версионника или просто медленный диск, но много оперативки), то join может быть эффективнее. Это верно, или ошибочное мнение?
В каких еще случаях join лучше?
12 апр 12, 12:10    [12404798]     Ответить | Цитировать Сообщить модератору
 Re: Разница между join с подзапросом и временной таблицей  [new]
Гавриленко Сергей Алексеевич
Member

Откуда:
Сообщений: 37254
Использование временной таблицы - это всего-лишь один из способов фиксации нужного плана выполнения.

Сообщение было отредактировано: 12 апр 12, 12:14
12 апр 12, 12:13    [12404828]     Ответить | Цитировать Сообщить модератору
 Re: Разница между join с подзапросом и временной таблицей  [new]
iap
Member

Откуда: Москва
Сообщений: 47142
Kateryne,

слишком абстрактно.
Если бы что-то одно всегда было лучше другого,
то зачем было бы нужно это "что-то другое"?
12 апр 12, 12:15    [12404836]     Ответить | Цитировать Сообщить модератору
 Re: Разница между join с подзапросом и временной таблицей  [new]
Kateryne
Member

Откуда:
Сообщений: 351
iap
Kateryne,

слишком абстрактно.
Если бы что-то одно всегда было лучше другого,
то зачем было бы нужно это "что-то другое"?


Я понимаю, что абстрактно, но меня и интересует принцип, по которому я должна выбирать между этими вариантами.

Дело в том, что мнение, что временные таблицы надо использовать всегда вместо join насаждается при работе с 1С 8.x - вплоть до того, что join c подзапросом уже становится чуть ли не признаком "быдлокода" (при этом речь о достаточно несложных join-ах).
Я сейчас вынуждена с 1С много работать, и я очень сомневаюсь, что это мнение корректно. Но так как я с MS SQL работала мало, то я не могу это аргументированно доказать.
Есть же, к примеру, ясные и четкие рекомендации, когда надо заменять условия or на union. Можно ли вывести аналогичные для join и временных таблиц?
12 апр 12, 12:27    [12404928]     Ответить | Цитировать Сообщить модератору
 Re: Разница между join с подзапросом и временной таблицей  [new]
Glory
Member

Откуда:
Сообщений: 104751
Kateryne
Я понимаю, что абстрактно, но меня и интересует принцип, по которому я должна выбирать между этими вариантами.

На основе плана выполнения
Оптимизатор также может создать для подзапроса временную таблицу.
И даже индексы для нее построить.
12 апр 12, 12:33    [12404961]     Ответить | Цитировать Сообщить модератору
 Re: Разница между join с подзапросом и временной таблицей  [new]
Kateryne
Member

Откуда:
Сообщений: 351
Хм. Но план выполнения-то создастся только уже при выполнении, анализируя данные.

А если речь идет, к примеру, о разработке коробочного решения, когда о данных известно только то, сколько там примерно строк будет (порядок - сотни или миллионы), и структура таблиц? На каждый чих не натестируешься, все равно наверняка есть вариант который чаще оказывается приемлимым в каких-то конкретных случаях?
12 апр 12, 12:42    [12405030]     Ответить | Цитировать Сообщить модератору
 Re: Разница между join с подзапросом и временной таблицей  [new]
Критик
Member

Откуда: Москва / Калуга
Сообщений: 35380
Блог
В общем случае, если у вас подзапрос возвращает 100млн строк, вы будете создавать для него временную таблицу?

Конечно, везде есть тонкости, но и в крайности бросаться не нужно.
12 апр 12, 12:48    [12405074]     Ответить | Цитировать Сообщить модератору
 Re: Разница между join с подзапросом и временной таблицей  [new]
Kateryne
Member

Откуда:
Сообщений: 351
Критик
В общем случае, если у вас подзапрос возвращает 100млн строк, вы будете создавать для него временную таблицу?

Конечно, везде есть тонкости, но и в крайности бросаться не нужно.

Вооот, уже конкретный критерий - количество строк в подзапросе. Интуитивно было понятно, но я про этот довод забыла.
Хотя, конечно, я так понимаю, что и подзапрос, возвращающий 100 миллионов строк - не слишком гуд :)
12 апр 12, 12:54    [12405118]     Ответить | Цитировать Сообщить модератору
 Re: Разница между join с подзапросом и временной таблицей  [new]
Glory
Member

Откуда:
Сообщений: 104751
Kateryne
Хм. Но план выполнения-то создастся только уже при выполнении, анализируя данные.

Планы есть предварительный и реальный
Часто они совпадают
12 апр 12, 12:55    [12405124]     Ответить | Цитировать Сообщить модератору
Все форумы / Microsoft SQL Server Ответить