powered by simpleCommunicator - 2.0.60     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / Microsoft SQL Server [игнор отключен] [закрыт для гостей] / почему @табличная переменная работает быстрей чем #временная таблица на INSERT?
25 сообщений из 59, страница 1 из 3
почему @табличная переменная работает быстрей чем #временная таблица на INSERT?
    #38975340
whitebeast
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Всем привет,
столкнулся с интересным (для меня по крайней мере) случаем:
вставка большого числа строк (от 60 000 до 800 000) работает быстрее, если вставлять в @table. Если вставлять в #table все делается на порядок медленней.

Процедура примерно такого плана:
Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
insert into @t (800 000 rows)
insert into @t (800 000 rows)
insert into @t (800 000 rows)
insert into @t (800 000 rows)
insert into @t (800 000 rows)

update @t
update @t
update @t
update @t

insert into dbo.table 
select * from @t


Индексы и FK не используются. Нет даже РК.

Я всегда считал, что на таких объемах всегда лучше использовать #table.
Тут вспоминается реплика Д-ра Ватсона из соответствующего сериала - "Холмс, но КАААК?" ©

Причина явно в разных планах выполнения. Но тогда что действительно лучше в данном случае?

Разъясните пожалуйста.

MS SQL 2012

P.S. На форуме есть похожие темы, но там обратная ситуация - # быстрее чем @.
Плюс недавно откопал такую статью: https://support2.microsoft.com/default.aspx?scid=kb;en-us;305977&Product=sql2k, она меня запутала еще больше.
...
Рейтинг: 0 / 0
почему @табличная переменная работает быстрей чем #временная таблица на INSERT?
    #38975356
0-0
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
0-0
Гость
whitebeast,

табличная переменная это память
временная таблица - физическая таблица в tempdb, которая храниться на диске

Что тут нелогичного?
Насколько быстрее работает то?
...
Рейтинг: 0 / 0
почему @табличная переменная работает быстрей чем #временная таблица на INSERT?
    #38975364
whitebeast
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
0-0,

на 800 000 разница 2.5 раза.
0-0табличная переменная это память
не соглашусь. Точно так же хранится в tempdb.
...
Рейтинг: 0 / 0
почему @табличная переменная работает быстрей чем #временная таблица на INSERT?
    #38975383
Winnipuh
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
whitebeast0-0,

на 800 000 разница 2.5 раза.
0-0табличная переменная это память
не соглашусь. Точно так же хранится в tempdb.

да ну?
...
Рейтинг: 0 / 0
почему @табличная переменная работает быстрей чем #временная таблица на INSERT?
    #38975388
0-0
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
0-0
Гость
whitebeast0-0,

на 800 000 разница 2.5 раза.
0-0табличная переменная это память
не соглашусь. Точно так же хранится в tempdb.

А где ваши доказательства?
...
Рейтинг: 0 / 0
почему @табличная переменная работает быстрей чем #временная таблица на INSERT?
    #38975391
Фотография Akina
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
whitebeast0-0табличная переменная это память
не соглашусь. Точно так же хранится в tempdb.
Переменная не модет храниться на диске (если не считать свопа, конечно). И то, что она табличная, ничего не меняет.
...
Рейтинг: 0 / 0
почему @табличная переменная работает быстрей чем #временная таблица на INSERT?
    #38975393
o-o
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
o-o
Гость
граждане, не ссорьтесь, конечно же @table хранится в tempdb:
Код: sql
1.
2.
3.
4.
5.
6.
declare @t table (xxx int);
insert into @t values (1);

select object_name(object_id, DB_ID('tempdb')), *
from tempdb.sys.columns
where name = 'xxx';
...
Рейтинг: 0 / 0
почему @табличная переменная работает быстрей чем #временная таблица на INSERT?
    #38975394
WarAnt
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
whitebeast0-0,

на 800 000 разница 2.5 раза.
0-0табличная переменная это память
не соглашусь. Точно так же хранится в tempdb.

А вы попробуйте влить в вашу переменку чуть поболее данных, так чтобы в памяти не поместилось, тогда и увидите что к чему.
...
Рейтинг: 0 / 0
почему @табличная переменная работает быстрей чем #временная таблица на INSERT?
    #38975395
whitebeast
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
0-0А где ваши доказательства?
А Ваши где? :)

https://support2.microsoft.com/default.aspx?scid=kb;en-us;305977&Product=sql2k
MSQ4: Are table variables memory-only structures that are assured better performance as compared to temporary or permanent tables, because they are maintained in a database that resides on the physical disk?

A4: A table variable is not a memory-only structure. Because a table variable might hold more data than can fit in memory, it has to have a place on disk to store data. Table variables are created in the tempdb database similar to temporary tables. If memory is available, both table variables and temporary tables are created and processed while in memory (data cache).


Все таки я бы хотел узнать ответ на поставленный вопрос: whitebeastПричина явно в разных планах выполнения. Но тогда что действительно лучше в данном случае?
...
Рейтинг: 0 / 0
почему @табличная переменная работает быстрей чем #временная таблица на INSERT?
    #38975400
o-o
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
o-o
Гость
Akinawhitebeastпропущено...

не соглашусь. Точно так же хранится в tempdb.
Переменная не модет храниться на диске (если не считать свопа, конечно). И то, что она табличная, ничего не меняет.
ну так и таблица (временная) не обязана на диск попадать (если не считать свопа, конечно)
короче, все лежит в памяти,
но наверное, если очень постараться, то и на диск можно отправить все, что угодно
...
Рейтинг: 0 / 0
почему @табличная переменная работает быстрей чем #временная таблица на INSERT?
    #38975408
o-o
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
o-o
Гость
или сами воспроизводите, или не знаю что.
у меня планы одинаковые и время тоже
вставляю 1000000 строк.
...
Рейтинг: 0 / 0
почему @табличная переменная работает быстрей чем #временная таблица на INSERT?
    #38975409
Albatross
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
o-o,

А если например, сервер думал, что переменная или временная таблица мало места займет и создал её в памяти. А тут опа- лярд строк.
И что он - будет из памяти перемещать на диск прямо во время инсерта?
тогда будет большая задержка в какой-то момент.
...
Рейтинг: 0 / 0
почему @табличная переменная работает быстрей чем #временная таблица на INSERT?
    #38975412
Фотография alexeyvg
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Akinawhitebeastне соглашусь. Точно так же хранится в tempdb.
Переменная не модет храниться на диске (если не считать свопа, конечно). И то, что она табличная, ничего не меняет.С чего вы взяли? они одинаково хранятся; разница есть в обработке, но это объекты в tempdb, их можно просто в списке объектов найти.
...
Рейтинг: 0 / 0
почему @табличная переменная работает быстрей чем #временная таблица на INSERT?
    #38975418
Albatross
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Albatrosso-o,

А если например, сервер думал, что переменная или временная таблица мало места займет и создал её в памяти. А тут опа- лярд строк.
И что он - будет из памяти перемещать на диск прямо во время инсерта?
тогда будет большая задержка в какой-то момент.
А хотя нет - написано же - Data Cache.
Т.е. всё как обычные таблицы.
...
Рейтинг: 0 / 0
почему @табличная переменная работает быстрей чем #временная таблица на INSERT?
    #38975430
whitebeast
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Чуть позже скину планы выполнения.
Проблема в том, что они малочитаемы, очень много таблиц. Вложенные вью и т.п.
Удобней будет в текстовом виде или графическом?
...
Рейтинг: 0 / 0
почему @табличная переменная работает быстрей чем #временная таблица на INSERT?
    #38975443
whitebeast
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
В приложении два плана выполнения.
В процедуре закомментировал все, кроме первой вставки в таблицы.
Т.е. происходит только объявление таблицы/переменной и вставка.
больше ничего.

1. Почему разные планы выполнения?
2. Имеет ли смысл дальше ковырять, для того чтобы использовать # таблицы? Я уже сомневаюсь в этом, но очень интересно понять причину.
...
Рейтинг: 0 / 0
почему @табличная переменная работает быстрей чем #временная таблица на INSERT?
    #38975451
Фотография a_voronin
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
С InMemory сравните.
...
Рейтинг: 0 / 0
почему @табличная переменная работает быстрей чем #временная таблица на INSERT?
    #38975459
whitebeast
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
a_voronin,
Если не ошибаюсь InMemory появилась только в 2014 версии. У меня же, как я писал, 2012 версия.
...
Рейтинг: 0 / 0
почему @табличная переменная работает быстрей чем #временная таблица на INSERT?
    #38975461
whitebeast
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Еще раз - забудем про то, где хранятся # и @. В моем случае они хранятся в tempdb.

Почему разные планы выполнения? SELECT ведь один и тот же.
...
Рейтинг: 0 / 0
почему @табличная переменная работает быстрей чем #временная таблица на INSERT?
    #38975462
Фотография Akina
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
AlbatrossИ что он - будет из памяти перемещать на диск прямо во время инсерта?
тогда будет большая задержка в какой-то момент.Инсерт в эту табличную переменную, в смысле? есссно... если переменная так распухла, что не лезет в память, по-любому она будет сливаться на диск, и именно во время инсерта. Если ты начнёшь в, скажем, ntext наливать второй гигабайт - она тоже в памяти фиг удержится. Прямо во время операции присвоения.

alexeyvgС чего вы взяли? они одинаково хранятся; разница есть в обработке, но это объекты в tempdb, их можно просто в списке объектов найти.
Вот именно что в обработке. В хранении разницы нет, верно?

Тогда представим, что это обычная переменная. Скалярная, скажем, строковая. Где она? в памяти. Да, в tempdb объект лёг, копия значения, скорее всего, тоже - но переменная в памяти. И используется оттуда. Перестанет помещаться - другое дело, вся или часть ляжет в базу, вся или часть будет выброшена из памяти. Потребуется - подкачается, вся или частично. Кабы она каждый раз с диска тянулась - во было бы тормозилово переменные использовать...
Не вижу оснований к тому, чтобы с табличной переменной было иначе. Копия на диске, а вся или помещающаяся часть для оперативной работы кода - в памяти. В смысле в области памяти с данными программного кода сервера.

А вот временная таблица - она на диске и, если не вымылась по старости, в кэше.

Мне лично так кажется.
...
Рейтинг: 0 / 0
почему @табличная переменная работает быстрей чем #временная таблица на INSERT?
    #38975561
Фотография alexeyvg
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
AkinaalexeyvgС чего вы взяли? они одинаково хранятся; разница есть в обработке, но это объекты в tempdb, их можно просто в списке объектов найти.
Вот именно что в обработке. В хранении разницы нет, верно?

Тогда представим, что это обычная переменная. Скалярная, скажем, строковая. Где она? в памяти. Да, в tempdb объект лёг, копия значения, скорее всего, тоже - но переменная в памяти. И используется оттуда. Перестанет помещаться - другое дело, вся или часть ляжет в базу, вся или часть будет выброшена из памяти. Потребуется - подкачается, вся или частично. Кабы она каждый раз с диска тянулась - во было бы тормозилово переменные использовать...
Не вижу оснований к тому, чтобы с табличной переменной было иначе. Копия на диске, а вся или помещающаяся часть для оперативной работы кода - в памяти. В смысле в области памяти с данными программного кода сервера.

А вот временная таблица - она на диске и, если не вымылась по старости, в кэше.Никакой разницы с временной таблицой.

При записи временной таблицы (или таблицы-переменной) в tempdb она будет храниться в памяти.

Вы что, думаете, что если таблица в tempdb, то она непременно на диске?

Это не так, если памяти достаточно, то таблица так и будет в памяти, а на диск записываться не будет (или будет - в фоне, потом).
AkinaВ смысле в области памяти с данными программного кода сервера.Нет, "в области программного кода", а точнее, в области данных табличная переменная не хранится, в отличие от обычных скалярных переменных.

Она хранится там, где хранятся данные всех таблиц, и постоянных тоже - в страничном кеше.
...
Рейтинг: 0 / 0
почему @табличная переменная работает быстрей чем #временная таблица на INSERT?
    #38975564
Фотография alexeyvg
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
AkinaВот именно что в обработке. В хранении разницы нет, верно?А в обработке - это имеется в виду сбор статистики, компиляции, обработка транзакций, запись в лог - вот тут да, тут уже появляется разница между табличной переменной и временной таблицей.
...
Рейтинг: 0 / 0
почему @табличная переменная работает быстрей чем #временная таблица на INSERT?
    #38975566
iap
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Winnipuhwhitebeast0-0,

на 800 000 разница 2.5 раза.
пропущено...

не соглашусь. Точно так же хранится в tempdb.

да ну?Не сомневайтесь! Именно так.
Но если есть возможность, и то, и другое может целиком загружаться в память
...
Рейтинг: 0 / 0
почему @табличная переменная работает быстрей чем #временная таблица на INSERT?
    #38975574
o-o
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
o-o
Гость
iapWinnipuhпропущено...
да ну?Не сомневайтесь! Именно так.
Но если есть возможность, и то, и другое может целиком загружаться в память
не наоборот ли?
и то, и то, в памяти создается, а вот если надо будет, то на диск вывалится.
когда говорят "в tempdb", это значит, на станицах базы tempdb.
но это же все равно в памяти
...
Рейтинг: 0 / 0
почему @табличная переменная работает быстрей чем #временная таблица на INSERT?
    #38975620
Фотография SomewhereSomehow
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Табличная переменная находится в tempdb, так же как и временная таблица. И механизмы работы Storage Engine с одной и другой похожие, разумеется, с различием в нюансах работы с транзакционной моделью. В этом смысле и временные таблицы и табличные переменные гораздо ближе к обычным таблицам, чем к скалярным переменным в памяти. В конце-концов, с обычными таблицами, ведь тоде через BPool идет работа, который, суть - память, но никто обычно не говорит, что у нас "таблицы в памяти, но могут быть сброшены на диск".

whitebeast,
Если допишете в запрос с #временной таблицей в конец хинт "option(maxdop 1)", есть подозрение, что ситуация изменится.
...
Рейтинг: 0 / 0
25 сообщений из 59, страница 1 из 3
Форумы / Microsoft SQL Server [игнор отключен] [закрыт для гостей] / почему @табличная переменная работает быстрей чем #временная таблица на INSERT?
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]