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

Откуда:
Сообщений: 416
Добрый день.

Пересел на MS SQL с Oracle и возник вопрос: как правильнее будет создавать временные таблицыв в процедурах и функциях?

create table #name ();
или
declare @name table ();

в доке написано,что нужно создавать с помощью #,но у коллег увидел второй вариант.

Берем в расчет только временную таблицу возможно с созданием индексов, но безо всяких constraint'ов.


спасибо большое заранее
16 апр 12, 16:05    [12423342]     Ответить | Цитировать Сообщить модератору
 Re: как правильно объявить временную таблицу?  [new]
kDnZP
Member [заблокирован]

Откуда: ★[msg=16399436]★[msg=20850760]
Сообщений: 11289
LudeV, временная таблица и табличная переменная это несколько разные вещи. В чем различие можно узнать в BOL
16 апр 12, 16:09    [12423374]     Ответить | Цитировать Сообщить модератору
 Re: как правильно объявить временную таблицу?  [new]
Ken@t
Member

Откуда: 大地
Сообщений: 3265
LudeV,

DECLARE @T1 table
(
 I INT  primary key 
)

CREATE TABLE #T2
(
 I int primary key
)


BEGIN TRANSACTION 
INSERT @T1 ( I) VALUES (1)
INSERT #T2 ( I) VALUES (2)

ROLLBACK

SELECT * FROM @T1
SELECT * FROM #T2
16 апр 12, 16:11    [12423386]     Ответить | Цитировать Сообщить модератору
 Re: как правильно объявить временную таблицу?  [new]
iap
Member

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

в разных ситуациях по разному.
Манипуляции с временной таблицей логируются, а с табличной переменной - нет.
Для временной таблицы ведётся статистика, а для табличной переменной - нет.
Области видимости и время жизни у них ооочень отличаются.
В функции можно использовать табличные переменные, а временные таблицы - нет.
Если данных мало, то быстрее табличные переменные, иначе - временные таблицы.

Может, временные объекты вообще не понадобятся.
16 апр 12, 16:13    [12423397]     Ответить | Цитировать Сообщить модератору
 Re: как правильно объявить временную таблицу?  [new]
iap
Member

Откуда: Москва
Сообщений: 47142
Вообще, сдаётся мне, большей частью будете стремиться использовать временные объекты по делу и не по делу.
Из-за тяжёлого наследия Oracle
16 апр 12, 16:15    [12423420]     Ответить | Цитировать Сообщить модератору
 Re: как правильно объявить временную таблицу?  [new]
LudeV
Member

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

спасибо всем!
16 апр 12, 16:21    [12423455]     Ответить | Цитировать Сообщить модератору
 Re: как правильно объявить временную таблицу?  [new]
Knyazev Alexey
Member

Откуда: Екб -> Мск
Сообщений: 10233
Блог
iap
Манипуляции с временной таблицей логируются, а с табличной переменной - нет.

и для переменной логируются
16 апр 12, 16:22    [12423461]     Ответить | Цитировать Сообщить модератору
 Re: как правильно объявить временную таблицу?  [new]
Knyazev Alexey
Member

Откуда: Екб -> Мск
Сообщений: 10233
Блог
Knyazev Alexey
iap
Манипуляции с временной таблицей логируются, а с табличной переменной - нет.

и для переменной логируются


use tempdb;
declare @t table ( id int );
checkpoint;

insert into @t
values(1),(2),(3);

select [Page ID], [Slot ID] 
  from fn_dblog( default, default )
  where operation = 'LOP_INSERT_ROWS';

select cast( file_id as varbinary(2) ) as file_id
     , cast( page_id as varbinary(16) ) as page_id
     , slot_id 
  from @t
    cross apply sys.fn_PhysLocCracker(%%physloc%%);
16 апр 12, 16:31    [12423504]     Ответить | Цитировать Сообщить модератору
 Re: как правильно объявить временную таблицу?  [new]
Mnior
Member

Откуда: Кишинёв
Сообщений: 6724
Knyazev Alexey, а если таблица "уничтожилась" до чекпоинта?
А то там может 1% из всех операций "попадаются" на него.
16 апр 12, 23:41    [12424785]     Ответить | Цитировать Сообщить модератору
 Re: как правильно объявить временную таблицу?  [new]
Mnior
Member

Откуда: Кишинёв
Сообщений: 6724
Ok. Логируется.
1. Зачем?
2. А оно попадает на диск? Ну типа Simple Recovery.
fn_dblog - тока текущ. транзакцию видит

Knyazev Alexey, нафига checkpoint вообще в скрипте? Что-то вы не договариваете.
17 апр 12, 10:29    [12425709]     Ответить | Цитировать Сообщить модератору
 Re: как правильно объявить временную таблицу?  [new]
daw
Member

Откуда: Муром -> Москва
Сообщений: 7381

> 1. Зачем?

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

use tempdb;
declare @t table ( id int unique);
checkpoint;

insert into @t
values(1)
insert into @t
values(2)
insert into @t
values(3)
insert into @t
values(3)
select * from @t


select *
   from fn_dblog( default, default )


Posted via ActualForum NNTP Server 1.5

17 апр 12, 10:45    [12425807]     Ответить | Цитировать Сообщить модератору
 Re: как правильно объявить временную таблицу?  [new]
Knyazev Alexey
Member

Откуда: Екб -> Мск
Сообщений: 10233
Блог
Mnior
Ok. Логируется.
1. Зачем?
2. А оно попадает на диск? Ну типа Simple Recovery.

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).

тынц

Mnior
Knyazev Alexey, нафига checkpoint вообще в скрипте? Что-то вы не договариваете.


для того, чтобы минимизировать кол-во записей в журнале...иначе мусора много
17 апр 12, 11:06    [12425957]     Ответить | Цитировать Сообщить модератору
 Re: как правильно объявить временную таблицу?  [new]
Mnior
Member

Откуда: Кишинёв
Сообщений: 6724
daw, всё логично.
Хотя это всё похоже на хак.
Видимо есть какя-то история с табличными переменными, без кольца Саурона точно не обошлось. :)
17 апр 12, 11:13    [12425991]     Ответить | Цитировать Сообщить модератору
 Re: как правильно объявить временную таблицу?  [new]
SamMan
Member

Откуда: Moscow
Сообщений: 759
Mnior
2. А оно попадает на диск?


"Оно" - кто? Записи лога? А что - они могут не попадать на диск?

Mnior
Ну типа Simple Recovery.


Что есть "типа" и что есть "Simple Recovery"? Model? А какая связь с "типом"?

Mnior
fn_dblog - тока текущ. транзакцию видит


Гм... Это Вы вслух рассуждаете или сказать что хотите?
17 апр 12, 11:30    [12426117]     Ответить | Цитировать Сообщить модератору
 Re: как правильно объявить временную таблицу?  [new]
Mnior
Member

Откуда: Кишинёв
Сообщений: 6724
SamMan,
1. Ну эээ, не знаю, не помню, торможу ...
Knyazev Alexey, своим коментом подтверждает:
BOL
При использовании простой модели восстановления журнал транзакций автоматически усекается, при этом удаляются все неактивные виртуальные файлы журналов. Усечение обычно производится после каждой контрольной точки, ...
2. Типа это непереводимый фольклёр
3. Комментирую в стиле капитана. Это форум, не все в курсе и т.д.

Отмазался? :)
18 апр 12, 10:01    [12431163]     Ответить | Цитировать Сообщить модератору
Все форумы / Microsoft SQL Server Ответить