Этот баннер — требование Роскомнадзора для исполнения 152 ФЗ.
«На сайте осуществляется обработка файлов cookie, необходимых для работы сайта, а также для анализа использования сайта и улучшения предоставляемых сервисов с использованием метрической программы Яндекс.Метрика. Продолжая использовать сайт, вы даёте согласие с использованием данных технологий».
Политика конфиденциальности
|
|
|
почему @табличная переменная работает быстрей чем #временная таблица на INSERT?
|
|||
|---|---|---|---|
|
#18+
Всем привет, столкнулся с интересным (для меня по крайней мере) случаем: вставка большого числа строк (от 60 000 до 800 000) работает быстрее, если вставлять в @table. Если вставлять в #table все делается на порядок медленней. Процедура примерно такого плана: Код: sql 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. Индексы и FK не используются. Нет даже РК. Я всегда считал, что на таких объемах всегда лучше использовать #table. Тут вспоминается реплика Д-ра Ватсона из соответствующего сериала - "Холмс, но КАААК?" © Причина явно в разных планах выполнения. Но тогда что действительно лучше в данном случае? Разъясните пожалуйста. MS SQL 2012 P.S. На форуме есть похожие темы, но там обратная ситуация - # быстрее чем @. Плюс недавно откопал такую статью: https://support2.microsoft.com/default.aspx?scid=kb;en-us;305977&Product=sql2k, она меня запутала еще больше. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 03.06.2015, 14:13 |
|
||
|
почему @табличная переменная работает быстрей чем #временная таблица на INSERT?
|
|||
|---|---|---|---|
|
#18+
whitebeast, табличная переменная это память временная таблица - физическая таблица в tempdb, которая храниться на диске Что тут нелогичного? Насколько быстрее работает то? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 03.06.2015, 14:22 |
|
||
|
почему @табличная переменная работает быстрей чем #временная таблица на INSERT?
|
|||
|---|---|---|---|
|
#18+
0-0, на 800 000 разница 2.5 раза. 0-0табличная переменная это память не соглашусь. Точно так же хранится в tempdb. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 03.06.2015, 14:30 |
|
||
|
почему @табличная переменная работает быстрей чем #временная таблица на INSERT?
|
|||
|---|---|---|---|
|
#18+
whitebeast0-0, на 800 000 разница 2.5 раза. 0-0табличная переменная это память не соглашусь. Точно так же хранится в tempdb. да ну? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 03.06.2015, 14:41 |
|
||
|
почему @табличная переменная работает быстрей чем #временная таблица на INSERT?
|
|||
|---|---|---|---|
|
#18+
whitebeast0-0, на 800 000 разница 2.5 раза. 0-0табличная переменная это память не соглашусь. Точно так же хранится в tempdb. А где ваши доказательства? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 03.06.2015, 14:43 |
|
||
|
почему @табличная переменная работает быстрей чем #временная таблица на INSERT?
|
|||
|---|---|---|---|
|
#18+
whitebeast0-0табличная переменная это память не соглашусь. Точно так же хранится в tempdb. Переменная не модет храниться на диске (если не считать свопа, конечно). И то, что она табличная, ничего не меняет. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 03.06.2015, 14:45 |
|
||
|
почему @табличная переменная работает быстрей чем #временная таблица на INSERT?
|
|||
|---|---|---|---|
|
#18+
граждане, не ссорьтесь, конечно же @table хранится в tempdb: Код: sql 1. 2. 3. 4. 5. 6. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 03.06.2015, 14:47 |
|
||
|
почему @табличная переменная работает быстрей чем #временная таблица на INSERT?
|
|||
|---|---|---|---|
|
#18+
whitebeast0-0, на 800 000 разница 2.5 раза. 0-0табличная переменная это память не соглашусь. Точно так же хранится в tempdb. А вы попробуйте влить в вашу переменку чуть поболее данных, так чтобы в памяти не поместилось, тогда и увидите что к чему. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 03.06.2015, 14:47 |
|
||
|
почему @табличная переменная работает быстрей чем #временная таблица на INSERT?
|
|||
|---|---|---|---|
|
#18+
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Причина явно в разных планах выполнения. Но тогда что действительно лучше в данном случае? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 03.06.2015, 14:47 |
|
||
|
почему @табличная переменная работает быстрей чем #временная таблица на INSERT?
|
|||
|---|---|---|---|
|
#18+
Akinawhitebeastпропущено... не соглашусь. Точно так же хранится в tempdb. Переменная не модет храниться на диске (если не считать свопа, конечно). И то, что она табличная, ничего не меняет. ну так и таблица (временная) не обязана на диск попадать (если не считать свопа, конечно) короче, все лежит в памяти, но наверное, если очень постараться, то и на диск можно отправить все, что угодно ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 03.06.2015, 14:51 |
|
||
|
почему @табличная переменная работает быстрей чем #временная таблица на INSERT?
|
|||
|---|---|---|---|
|
#18+
или сами воспроизводите, или не знаю что. у меня планы одинаковые и время тоже вставляю 1000000 строк. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 03.06.2015, 15:01 |
|
||
|
почему @табличная переменная работает быстрей чем #временная таблица на INSERT?
|
|||
|---|---|---|---|
|
#18+
o-o, А если например, сервер думал, что переменная или временная таблица мало места займет и создал её в памяти. А тут опа- лярд строк. И что он - будет из памяти перемещать на диск прямо во время инсерта? тогда будет большая задержка в какой-то момент. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 03.06.2015, 15:02 |
|
||
|
почему @табличная переменная работает быстрей чем #временная таблица на INSERT?
|
|||
|---|---|---|---|
|
#18+
Akinawhitebeastне соглашусь. Точно так же хранится в tempdb. Переменная не модет храниться на диске (если не считать свопа, конечно). И то, что она табличная, ничего не меняет.С чего вы взяли? они одинаково хранятся; разница есть в обработке, но это объекты в tempdb, их можно просто в списке объектов найти. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 03.06.2015, 15:03 |
|
||
|
почему @табличная переменная работает быстрей чем #временная таблица на INSERT?
|
|||
|---|---|---|---|
|
#18+
Albatrosso-o, А если например, сервер думал, что переменная или временная таблица мало места займет и создал её в памяти. А тут опа- лярд строк. И что он - будет из памяти перемещать на диск прямо во время инсерта? тогда будет большая задержка в какой-то момент. А хотя нет - написано же - Data Cache. Т.е. всё как обычные таблицы. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 03.06.2015, 15:05 |
|
||
|
почему @табличная переменная работает быстрей чем #временная таблица на INSERT?
|
|||
|---|---|---|---|
|
#18+
Чуть позже скину планы выполнения. Проблема в том, что они малочитаемы, очень много таблиц. Вложенные вью и т.п. Удобней будет в текстовом виде или графическом? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 03.06.2015, 15:10 |
|
||
|
почему @табличная переменная работает быстрей чем #временная таблица на INSERT?
|
|||
|---|---|---|---|
|
#18+
В приложении два плана выполнения. В процедуре закомментировал все, кроме первой вставки в таблицы. Т.е. происходит только объявление таблицы/переменной и вставка. больше ничего. 1. Почему разные планы выполнения? 2. Имеет ли смысл дальше ковырять, для того чтобы использовать # таблицы? Я уже сомневаюсь в этом, но очень интересно понять причину. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 03.06.2015, 15:20 |
|
||
|
почему @табличная переменная работает быстрей чем #временная таблица на INSERT?
|
|||
|---|---|---|---|
|
#18+
С InMemory сравните. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 03.06.2015, 15:26 |
|
||
|
почему @табличная переменная работает быстрей чем #временная таблица на INSERT?
|
|||
|---|---|---|---|
|
#18+
a_voronin, Если не ошибаюсь InMemory появилась только в 2014 версии. У меня же, как я писал, 2012 версия. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 03.06.2015, 15:31 |
|
||
|
почему @табличная переменная работает быстрей чем #временная таблица на INSERT?
|
|||
|---|---|---|---|
|
#18+
Еще раз - забудем про то, где хранятся # и @. В моем случае они хранятся в tempdb. Почему разные планы выполнения? SELECT ведь один и тот же. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 03.06.2015, 15:34 |
|
||
|
почему @табличная переменная работает быстрей чем #временная таблица на INSERT?
|
|||
|---|---|---|---|
|
#18+
AlbatrossИ что он - будет из памяти перемещать на диск прямо во время инсерта? тогда будет большая задержка в какой-то момент.Инсерт в эту табличную переменную, в смысле? есссно... если переменная так распухла, что не лезет в память, по-любому она будет сливаться на диск, и именно во время инсерта. Если ты начнёшь в, скажем, ntext наливать второй гигабайт - она тоже в памяти фиг удержится. Прямо во время операции присвоения. alexeyvgС чего вы взяли? они одинаково хранятся; разница есть в обработке, но это объекты в tempdb, их можно просто в списке объектов найти. Вот именно что в обработке. В хранении разницы нет, верно? Тогда представим, что это обычная переменная. Скалярная, скажем, строковая. Где она? в памяти. Да, в tempdb объект лёг, копия значения, скорее всего, тоже - но переменная в памяти. И используется оттуда. Перестанет помещаться - другое дело, вся или часть ляжет в базу, вся или часть будет выброшена из памяти. Потребуется - подкачается, вся или частично. Кабы она каждый раз с диска тянулась - во было бы тормозилово переменные использовать... Не вижу оснований к тому, чтобы с табличной переменной было иначе. Копия на диске, а вся или помещающаяся часть для оперативной работы кода - в памяти. В смысле в области памяти с данными программного кода сервера. А вот временная таблица - она на диске и, если не вымылась по старости, в кэше. Мне лично так кажется. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 03.06.2015, 15:35 |
|
||
|
почему @табличная переменная работает быстрей чем #временная таблица на INSERT?
|
|||
|---|---|---|---|
|
#18+
AkinaalexeyvgС чего вы взяли? они одинаково хранятся; разница есть в обработке, но это объекты в tempdb, их можно просто в списке объектов найти. Вот именно что в обработке. В хранении разницы нет, верно? Тогда представим, что это обычная переменная. Скалярная, скажем, строковая. Где она? в памяти. Да, в tempdb объект лёг, копия значения, скорее всего, тоже - но переменная в памяти. И используется оттуда. Перестанет помещаться - другое дело, вся или часть ляжет в базу, вся или часть будет выброшена из памяти. Потребуется - подкачается, вся или частично. Кабы она каждый раз с диска тянулась - во было бы тормозилово переменные использовать... Не вижу оснований к тому, чтобы с табличной переменной было иначе. Копия на диске, а вся или помещающаяся часть для оперативной работы кода - в памяти. В смысле в области памяти с данными программного кода сервера. А вот временная таблица - она на диске и, если не вымылась по старости, в кэше.Никакой разницы с временной таблицой. При записи временной таблицы (или таблицы-переменной) в tempdb она будет храниться в памяти. Вы что, думаете, что если таблица в tempdb, то она непременно на диске? Это не так, если памяти достаточно, то таблица так и будет в памяти, а на диск записываться не будет (или будет - в фоне, потом). AkinaВ смысле в области памяти с данными программного кода сервера.Нет, "в области программного кода", а точнее, в области данных табличная переменная не хранится, в отличие от обычных скалярных переменных. Она хранится там, где хранятся данные всех таблиц, и постоянных тоже - в страничном кеше. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 03.06.2015, 17:38 |
|
||
|
почему @табличная переменная работает быстрей чем #временная таблица на INSERT?
|
|||
|---|---|---|---|
|
#18+
AkinaВот именно что в обработке. В хранении разницы нет, верно?А в обработке - это имеется в виду сбор статистики, компиляции, обработка транзакций, запись в лог - вот тут да, тут уже появляется разница между табличной переменной и временной таблицей. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 03.06.2015, 17:40 |
|
||
|
почему @табличная переменная работает быстрей чем #временная таблица на INSERT?
|
|||
|---|---|---|---|
|
#18+
Winnipuhwhitebeast0-0, на 800 000 разница 2.5 раза. пропущено... не соглашусь. Точно так же хранится в tempdb. да ну?Не сомневайтесь! Именно так. Но если есть возможность, и то, и другое может целиком загружаться в память ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 03.06.2015, 17:41 |
|
||
|
почему @табличная переменная работает быстрей чем #временная таблица на INSERT?
|
|||
|---|---|---|---|
|
#18+
iapWinnipuhпропущено... да ну?Не сомневайтесь! Именно так. Но если есть возможность, и то, и другое может целиком загружаться в память не наоборот ли? и то, и то, в памяти создается, а вот если надо будет, то на диск вывалится. когда говорят "в tempdb", это значит, на станицах базы tempdb. но это же все равно в памяти ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 03.06.2015, 17:53 |
|
||
|
почему @табличная переменная работает быстрей чем #временная таблица на INSERT?
|
|||
|---|---|---|---|
|
#18+
Табличная переменная находится в tempdb, так же как и временная таблица. И механизмы работы Storage Engine с одной и другой похожие, разумеется, с различием в нюансах работы с транзакционной моделью. В этом смысле и временные таблицы и табличные переменные гораздо ближе к обычным таблицам, чем к скалярным переменным в памяти. В конце-концов, с обычными таблицами, ведь тоде через BPool идет работа, который, суть - память, но никто обычно не говорит, что у нас "таблицы в памяти, но могут быть сброшены на диск". whitebeast, Если допишете в запрос с #временной таблицей в конец хинт "option(maxdop 1)", есть подозрение, что ситуация изменится. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 03.06.2015, 18:38 |
|
||
|
|

start [/forum/topic.php?fid=46&msg=38975459&tid=1687177]: |
0ms |
get settings: |
6ms |
get forum list: |
14ms |
check forum access: |
3ms |
check topic access: |
3ms |
track hit: |
46ms |
get topic data: |
9ms |
get forum data: |
2ms |
get page messages: |
58ms |
get tp. blocked users: |
1ms |
| others: | 213ms |
| total: | 355ms |

| 0 / 0 |
