Добро пожаловать в форум, Guest >> Войти | Регистрация | Поиск | Правила | | В избранное | Подписаться | ||
Все форумы / Microsoft SQL Server |
![]() ![]() |
trew Member Откуда: Москва Сообщений: 2646 |
В ХП многократно используются @табличные переменные, есть ли смысл менять их на #временные таблицы? Цель - ускорить выполение ХП. Не понимаю разницы между @table и #table. Что почитать (ссылка)? |
31 авг 12, 17:38 [13096791] Ответить | Цитировать Сообщить модератору |
Александр52 Member Откуда: Кокосовые острова ส็็็็็ Сообщений: 5133 |
переменная - хранит в себе переменную временная таблица - таблицу О_о |
31 авг 12, 17:44 [13096833] Ответить | Цитировать Сообщить модератору |
Александр52 Member Откуда: Кокосовые острова ส็็็็็ Сообщений: 5133 |
т.е. хранит в себе значение. |
31 авг 12, 17:45 [13096836] Ответить | Цитировать Сообщить модератору |
trew Member Откуда: Москва Сообщений: 2646 |
Александр52, Не точно написал declare @table table (....) |
31 авг 12, 17:45 [13096841] Ответить | Цитировать Сообщить модератору |
Александр52 Member Откуда: Кокосовые острова ส็็็็็ Сообщений: 5133 |
http://dev.net.ua/blogs/denisreznik/archive/2010/01/31/9315.aspx |
31 авг 12, 17:47 [13096845] Ответить | Цитировать Сообщить модератору |
Гавриленко Сергей Алексеевич Member Откуда: Moscow Сообщений: 37139 |
|
||
31 авг 12, 17:48 [13096850] Ответить | Цитировать Сообщить модератору |
nezhadnye_my
Guest |
ссылку сейчас поищу, но смысл был примерно такой: при построении плана оптимизатор будет учитывать кол-во строк во временной таблице, а про переменную считает, что строк там 1(или 100?) в общем, мало. итого: для большого кол-ва строк выгоднее временная таблица. ну, еще на временную индексы можно навесить произвольные, а в переменной максимум объявить ПК или юник. в смысле, "декларативный" индекс прокатит, а в явном виде для табличной переменной CREATE INDEX не пройдет |
31 авг 12, 17:48 [13096853] Ответить | Цитировать Сообщить модератору |
есть ли смысл шевелиться
Guest |
trew,
это делается чуть ли не реплейсом. проверить гипотезу - 15минут. |
||
31 авг 12, 17:53 [13096881] Ответить | Цитировать Сообщить модератору |
nezhadnye_my
Guest |
а, вот еще что. если открыть транзакцию, что-то писать во временную таблицу, а потом откатить, то и записи во временную таблицу откатятся. а если надо сохранять нечто, что даже после роллбэка понадобится (например, логрование какое-то местное внутри транзакции), то записамши в табличную переменную и после роллбэка из нее можно вычитать |
31 авг 12, 17:56 [13096893] Ответить | Цитировать Сообщить модератору |
Ken@t Member Откуда: 大地 Сообщений: 3264 |
Если бы это было единствнным отличием... Хороший повод - посмотреть транзакционную зависимость . |
||
31 авг 12, 17:56 [13096900] Ответить | Цитировать Сообщить модератору |
nezhadnye_my
Guest |
As with local temporary tables, table variables have a physical presence as a table in the tempdb database, contrary to the common misconception that they exist only in memory. Like local temporary tables, table variables are visible only to the creating session, but have a more limited scope, which is only the current batch. Table variables are visible neither to inner batches in the call stack nor to subsequent batches in the session. If an explicit transaction is rolled back, changes made to temporary tables in that transaction are rolled back as well; however, changes made to table variables by statements that completed in the transaction aren't rolled back. Only changes made by the active statement that failed or was terminated before completion are undone. Temporary tables and table variables also have optimization differences, but those are outside the scope of this book. For now, I'll just say that in terms of performance, usually it makes more sense to use table variables with very small volumes of data (only a few rows) and to use local temporary tables otherwise. кусок из книги Ицика Бен-Гана, ок? |
31 авг 12, 17:59 [13096912] Ответить | Цитировать Сообщить модератору |
nezhadnye_my
Guest |
кому надо все, тот и прочтет упомянутое выше: документацию и все топики на тему, да? мне чего пришло первое в голову, чтоб в 2-ух словах рассказать, тем и делюсь. в силу нежадности :P пора сваливать из темы, а то обвинят в неполноте сведений ![]() |
||
31 авг 12, 18:03 [13096938] Ответить | Цитировать Сообщить модератору |
Гавриленко Сергей Алексеевич Member Откуда: Moscow Сообщений: 37139 |
Да что ж все несут эту фигню? Я аж сразу два могу сделать на одной переменной: declare @t table ( a int , b int , primary key nonclustered ( a ) , unique nonclustered ( b ) ) |
||
31 авг 12, 18:09 [13096971] Ответить | Цитировать Сообщить модератору |
nezhadnye_my
Guest |
Гавриленко Сергей Алексеевич, а я не про то же самое:
??? не надо туда пихать "ВСЕХ", я не с ними :P |
||
31 авг 12, 18:14 [13096989] Ответить | Цитировать Сообщить модератору |
Гавриленко Сергей Алексеевич Member Откуда: Moscow Сообщений: 37139 |
|
||
31 авг 12, 18:15 [13096996] Ответить | Цитировать Сообщить модератору |
nezhadnye_my
Guest |
Гавриленко Сергей Алексеевич, да я вижу. просто под "всех" попадают "все" ![]() |
31 авг 12, 18:17 [13097008] Ответить | Цитировать Сообщить модератору |
invm Member Откуда: Москва Сообщений: 9633 |
http://www.sqlservercentral.com/articles/Temporary+Tables/66720/ |
31 авг 12, 18:19 [13097018] Ответить | Цитировать Сообщить модератору |
trew Member Откуда: Москва Сообщений: 2646 |
Не понятен один момент из хелпа: При использовании в хранимых процедурах переменных table приходится прибегать к повторным компиляциям реже, чем при использовании временных таблиц. Почему так? |
3 сен 12, 09:51 [13103335] Ответить | Цитировать Сообщить модератору |
trew Member Откуда: Москва Сообщений: 2646 |
Потомучто в хелпе ошибка в Примечании. В синстаксисе есть индексы, а в Примечании сказано: На переменных table нельзя создавать индексы и статистику. |
||||
3 сен 12, 09:56 [13103350] Ответить | Цитировать Сообщить модератору |
iap Member Откуда: Москва Сообщений: 47045 |
![]() |
||||
3 сен 12, 10:09 [13103439] Ответить | Цитировать Сообщить модератору |
alexeyvg Member Откуда: Moscow Сообщений: 31778 |
|
||
3 сен 12, 10:26 [13103554] Ответить | Цитировать Сообщить модератору |
trew Member Откуда: Москва Сообщений: 2646 |
alexeyvg, Не понятно, почему у временных таблиц есть статистика? Ведь по окончании сесии, временная таблица (одна #) убивается в tempdb. Как может вестись статистика по тому, чего уже нет? |
3 сен 12, 10:33 [13103610] Ответить | Цитировать Сообщить модератору |
alexeyvg Member Откуда: Moscow Сообщений: 31778 |
Любая статистика может собираться в то время, пока существует объект, будь это 30 лет или 30 милисекунд. |
||
3 сен 12, 11:12 [13103912] Ответить | Цитировать Сообщить модератору |
Все форумы / Microsoft SQL Server | ![]() |