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

Откуда: Москва
Сообщений: 2646
В ХП многократно используются @табличные переменные, есть ли смысл менять их на #временные таблицы?
Цель - ускорить выполение ХП.

Не понимаю разницы между @table и #table. Что почитать (ссылка)?
31 авг 12, 17:38    [13096791]     Ответить | Цитировать Сообщить модератору
 Re: Использование табличной переменной или временной таблицы, ms sql 2005  [new]
Александр52
Member

Откуда: Кокосовые острова ส็็็็็
Сообщений: 5136
переменная - хранит в себе переменную
временная таблица - таблицу
О_о
31 авг 12, 17:44    [13096833]     Ответить | Цитировать Сообщить модератору
 Re: Использование табличной переменной или временной таблицы, ms sql 2005  [new]
Александр52
Member

Откуда: Кокосовые острова ส็็็็็
Сообщений: 5136
т.е. хранит в себе значение.
31 авг 12, 17:45    [13096836]     Ответить | Цитировать Сообщить модератору
 Re: Использование табличной переменной или временной таблицы, ms sql 2005  [new]
trew
Member

Откуда: Москва
Сообщений: 2646
Александр52,

Не точно написал declare @table table (....)
31 авг 12, 17:45    [13096841]     Ответить | Цитировать Сообщить модератору
 Re: Использование табличной переменной или временной таблицы, ms sql 2005  [new]
Александр52
Member

Откуда: Кокосовые острова ส็็็็็
Сообщений: 5136
http://dev.net.ua/blogs/denisreznik/archive/2010/01/31/9315.aspx
31 авг 12, 17:47    [13096845]     Ответить | Цитировать Сообщить модератору
 Re: Использование табличной переменной или временной таблицы, ms sql 2005  [new]
Гавриленко Сергей Алексеевич
Member

Откуда:
Сообщений: 37254
trew
В ХП многократно используются @табличные переменные, есть ли смысл менять их на #временные таблицы?
Цель - ускорить выполение ХП.

Не понимаю разницы между @table и #table. Что почитать (ссылка)?
Начните с документации. Потом воспользуйтесь поиском. Тема обсуждалась 100500 раз.
31 авг 12, 17:48    [13096850]     Ответить | Цитировать Сообщить модератору
 Re: Использование табличной переменной или временной таблицы, ms sql 2005  [new]
nezhadnye_my
Guest
ссылку сейчас поищу, но смысл был примерно такой: при построении плана оптимизатор будет учитывать кол-во строк во временной таблице, а про переменную считает, что строк там 1(или 100?) в общем, мало. итого: для большого кол-ва строк выгоднее временная таблица.
ну, еще на временную индексы можно навесить произвольные, а в переменной максимум объявить ПК или юник. в смысле, "декларативный" индекс прокатит, а в явном виде для табличной переменной CREATE INDEX не пройдет
31 авг 12, 17:48    [13096853]     Ответить | Цитировать Сообщить модератору
 Re: Использование табличной переменной или временной таблицы, ms sql 2005  [new]
есть ли смысл шевелиться
Guest
trew,

автор
есть ли смысл менять их на #временные таблицы?

это делается чуть ли не реплейсом. проверить гипотезу - 15минут.
31 авг 12, 17:53    [13096881]     Ответить | Цитировать Сообщить модератору
 Re: Использование табличной переменной или временной таблицы, ms sql 2005  [new]
nezhadnye_my
Guest
а, вот еще что. если открыть транзакцию, что-то писать во временную таблицу, а потом откатить, то и записи во временную таблицу откатятся.
а если надо сохранять нечто, что даже после роллбэка понадобится (например, логрование какое-то местное внутри транзакции), то записамши в табличную переменную и после роллбэка из нее можно вычитать
31 авг 12, 17:56    [13096893]     Ответить | Цитировать Сообщить модератору
 Re: Использование табличной переменной или временной таблицы, ms sql 2005  [new]
Ken@t
Member

Откуда: 大地
Сообщений: 3265
nezhadnye_my
ссылку сейчас поищу, но смысл был примерно такой: при построении плана оптимизатор будет учитывать кол-во строк во временной таблице, а про переменную считает, что строк там 1(или 100?) в общем, мало. итого: для большого кол-ва строк выгоднее временная таблица.
ну, еще на временную индексы можно навесить произвольные, а в переменной максимум объявить ПК или юник. в смысле, "декларативный" индекс прокатит, а в явном виде для табличной переменной CREATE INDEX не пройдет

Если бы это было единствнным отличием... Хороший повод - посмотреть транзакционную зависимость .
31 авг 12, 17:56    [13096900]     Ответить | Цитировать Сообщить модератору
 Re: Использование табличной переменной или временной таблицы, ms sql 2005  [new]
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]     Ответить | Цитировать Сообщить модератору
 Re: Использование табличной переменной или временной таблицы, ms sql 2005  [new]
nezhadnye_my
Guest
Ken@t
[Если бы это было единствнным отличием... Хороший повод - посмотреть транзакционную зависимость .

кому надо все, тот и прочтет упомянутое выше: документацию и все топики на тему, да?
мне чего пришло первое в голову, чтоб в 2-ух словах рассказать, тем и делюсь.
в силу нежадности :P
пора сваливать из темы, а то обвинят в неполноте сведений
31 авг 12, 18:03    [13096938]     Ответить | Цитировать Сообщить модератору
 Re: Использование табличной переменной или временной таблицы, ms sql 2005  [new]
Гавриленко Сергей Алексеевич
Member

Откуда:
Сообщений: 37254
http://dev.net.ua/blogs/denisreznik/archive/2010/01/31/9315.aspx
На табличных переменных нельзя создавать некластерные индексы

Да что ж все несут эту фигню? Я аж сразу два могу сделать на одной переменной:
declare @t table (
    a       int
    , b     int
    , primary key nonclustered (
        a
    )
    , unique nonclustered (
        b
    )
)
31 авг 12, 18:09    [13096971]     Ответить | Цитировать Сообщить модератору
 Re: Использование табличной переменной или временной таблицы, ms sql 2005  [new]
nezhadnye_my
Guest
Гавриленко Сергей Алексеевич,
а я не про то же самое:
nezhadnye_my
на временную индексы можно навесить произвольные, а в переменной максимум объявить ПК или юник. в смысле, "декларативный" индекс прокатит, а в явном виде для табличной переменной CREATE INDEX не пройдет

???
не надо туда пихать "ВСЕХ", я не с ними :P
31 авг 12, 18:14    [13096989]     Ответить | Цитировать Сообщить модератору
 Re: Использование табличной переменной или временной таблицы, ms sql 2005  [new]
Гавриленко Сергей Алексеевич
Member

Откуда:
Сообщений: 37254
nezhadnye_my
не надо туда пихать "ВСЕХ", я не с ними :P
Я ж не вас цитировал.
31 авг 12, 18:15    [13096996]     Ответить | Цитировать Сообщить модератору
 Re: Использование табличной переменной или временной таблицы, ms sql 2005  [new]
nezhadnye_my
Guest
Гавриленко Сергей Алексеевич,

да я вижу. просто под "всех" попадают "все"
31 авг 12, 18:17    [13097008]     Ответить | Цитировать Сообщить модератору
 Re: Использование табличной переменной или временной таблицы, ms sql 2005  [new]
invm
Member

Откуда: Москва
Сообщений: 9913
http://www.sqlservercentral.com/articles/Temporary+Tables/66720/
31 авг 12, 18:19    [13097018]     Ответить | Цитировать Сообщить модератору
 Re: Использование табличной переменной или временной таблицы, ms sql 2005  [new]
trew
Member

Откуда: Москва
Сообщений: 2646
Не понятен один момент из хелпа:
При использовании в хранимых процедурах переменных table приходится прибегать к повторным компиляциям реже, чем при использовании временных таблиц.

Почему так?
3 сен 12, 09:51    [13103335]     Ответить | Цитировать Сообщить модератору
 Re: Использование табличной переменной или временной таблицы, ms sql 2005  [new]
trew
Member

Откуда: Москва
Сообщений: 2646
Гавриленко Сергей Алексеевич
http://dev.net.ua/blogs/denisreznik/archive/2010/01/31/9315.aspx
На табличных переменных нельзя создавать некластерные индексы

Да что ж все несут эту фигню? Я аж сразу два могу сделать на одной переменной:
declare @t table (
    a       int
    , b     int
    , primary key nonclustered (
        a
    )
    , unique nonclustered (
        b
    )
)

Потомучто в хелпе ошибка в Примечании. В синстаксисе есть индексы, а в Примечании сказано: На переменных table нельзя создавать индексы и статистику.
3 сен 12, 09:56    [13103350]     Ответить | Цитировать Сообщить модератору
 Re: Использование табличной переменной или временной таблицы, ms sql 2005  [new]
iap
Member

Откуда: Москва
Сообщений: 47194
trew
Гавриленко Сергей Алексеевич
пропущено...

Да что ж все несут эту фигню? Я аж сразу два могу сделать на одной переменной:
declare @t table (
    a       int
    , b     int
    , primary key nonclustered (
        a
    )
    , unique nonclustered (
        b
    )
)

Потомучто в хелпе ошибка в Примечании. В синстаксисе есть индексы, а в Примечании сказано: На переменных table нельзя создавать индексы и статистику.
Перевод, наверно такой. CREATE INDEX ("создать индекс") действительно нельзя!
3 сен 12, 10:09    [13103439]     Ответить | Цитировать Сообщить модератору
 Re: Использование табличной переменной или временной таблицы, ms sql 2005  [new]
alexeyvg
Member

Откуда: Moscow
Сообщений: 32167
trew
Не понятен один момент из хелпа:
При использовании в хранимых процедурах переменных table приходится прибегать к повторным компиляциям реже, чем при использовании временных таблиц.

Почему так?
Бай дизайн - план в случае переменных строится сразу при компиляции процедуры, а в случае временных таблиц может ещё перестраиваться позже. Как раз именно поэтому временные таблицы лучьше для больших объёмов данных и/или сложных запросов (пееркомпиляция позволит учесть статистику по данным в них), а переменные соответственно лучьше, если запрос простой и/или данных мало, поскольку на перекомпиляцимю не будут тратиться ресурсы.
3 сен 12, 10:26    [13103554]     Ответить | Цитировать Сообщить модератору
 Re: Использование табличной переменной или временной таблицы, ms sql 2005  [new]
trew
Member

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

Не понятно, почему у временных таблиц есть статистика? Ведь по окончании сесии, временная таблица (одна #) убивается в tempdb.
Как может вестись статистика по тому, чего уже нет?
3 сен 12, 10:33    [13103610]     Ответить | Цитировать Сообщить модератору
 Re: Использование табличной переменной или временной таблицы, ms sql 2005  [new]
alexeyvg
Member

Откуда: Moscow
Сообщений: 32167
trew
Не понятно, почему у временных таблиц есть статистика? Ведь по окончании сесии, временная таблица (одна #) убивается в tempdb.
У постоянных таблиц, например, есть статистика, а ведь их тоже можно убить! :-)

Любая статистика может собираться в то время, пока существует объект, будь это 30 лет или 30 милисекунд.
3 сен 12, 11:12    [13103912]     Ответить | Цитировать Сообщить модератору
Все форумы / Microsoft SQL Server Ответить