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

Откуда: Хабаровск
Сообщений: 50
В последнее время в хранимых процедурах стал использовать вместо табличных переменных таблицы из схемы Tmp текущей БД.
Схему Tmp можно поместить на отдельный дисковый накопитель.

Т.е. создаю таблицу с обязательным полем SPID и представление типа:

Create View tmp.ViewMyTempTable
As
Select Id, ....
From tmp.MyTempTable
Where SPID = @@SPID


В ней настраиваю индексы какие нужно и потом с ней работаю (внутри процедур)
За счет наличия готовых индексов обработка в разы быстрее чем при работе с @MyTable или #MyTable

Create Procedure ...
As
...

Delete tmp.MyTempTable Where SPID = @@SPID

....

Update A
Set ....
From  tmp.ViewMyTempTable (nolock) a,  tmp.ViewMyTempTable (nolock) b
Where a.Id = b.Id and ....

...


Нормально ли это?

P.S. Опять же можно глянуть кто что "наделал" найдя нужные записи, в отличии от временной таблицы
7 окт 13, 10:20    [14932333]     Ответить | Цитировать Сообщить модератору
 Re: Постоянная таблица супротив временных  [new]
Гость333
Member

Откуда:
Сообщений: 3683
Oleg Krivopusk
За счет наличия готовых индексов обработка в разы быстрее чем при работе с #MyTable

То есть вы не знаете, что на #MyTable тоже можно создавать какие угодно индексы? Или что вы имеете в виду под "готовыми индексами"?

Oleg Krivopusk
Delete tmp.MyTempTable Where SPID = @@SPID

Как всё страшно... А что насчёт блокировок на tmp.MyTempTable, скорости операции удаления, фрагментации таблицы tmp.MyTempTable?

И как обеспечивается выбор оптимального плана запроса для различающегося количества записей (скажем, одна запись и один миллион записей) в вашей "временной" таблице?

Oleg Krivopusk
Нормально ли это?

Вряд ли. Какие преимущества такой схемы, кроме "наличия готовых индексов"?

Oleg Krivopusk
P.S. Опять же можно глянуть кто что "наделал" найдя нужные записи, в отличии от временной таблицы

Глянуть, чтобы что?
7 окт 13, 10:34    [14932406]     Ответить | Цитировать Сообщить модератору
 Re: Постоянная таблица супротив временных  [new]
MasterZiv
Member

Откуда: Питер
Сообщений: 34620
Oleg Krivopusk,
конечно, нормально.
7 окт 13, 10:44    [14932449]     Ответить | Цитировать Сообщить модератору
 Re: Постоянная таблица супротив временных  [new]
Glory
Member

Откуда:
Сообщений: 104760
Oleg Krivopusk
В ней настраиваю индексы какие нужно

В "ней" - это про таблицу или про представление ?

И зачем два объекта ?
7 окт 13, 11:02    [14932573]     Ответить | Цитировать Сообщить модератору
 Re: Постоянная таблица супротив временных  [new]
alexeyvg
Member

Откуда: Moscow
Сообщений: 31430
Oleg Krivopusk
За счет наличия готовых индексов обработка в разы быстрее чем при работе с @MyTable или #MyTable
Индексы можно делать и для временных таблиц.

А в общем работа с tempdb будет быстрее из за особенностей логирования и обращения к дискам.

Oleg Krivopusk
P.S. Опять же можно глянуть кто что "наделал" найдя нужные записи, в отличии от временной таблицы
Для этого можно делать постоянные таблицы в tempdb

Правда, они пропадут после перезагрузки сервера, но, если хранение данных нужно для целей отладки, то это не будет проблемой.
7 окт 13, 11:33    [14932790]     Ответить | Цитировать Сообщить модератору
 Re: Постоянная таблица супротив временных  [new]
Oleg Krivopusk
Member

Откуда: Хабаровск
Сообщений: 50
автор
То есть вы не знаете, что на #MyTable тоже можно создавать какие угодно индексы? Или что вы имеете в виду под "готовыми индексами"?


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


автор
Глянуть, чтобы что?


Чтобы увидеть, какие данные обрабатывал пользователь в случае ошибки (много строк)
8 окт 13, 01:54    [14937096]     Ответить | Цитировать Сообщить модератору
 Re: Постоянная таблица супротив временных  [new]
Oleg Krivopusk
Member

Откуда: Хабаровск
Сообщений: 50
Glory
Oleg Krivopusk
В ней настраиваю индексы какие нужно

В "ней" - это про таблицу или про представление ?

И зачем два объекта ?



Про таблицу.
Представление... ну зачем оно... ну просто, чтобы просматривать результаты пользователю
8 окт 13, 01:59    [14937102]     Ответить | Цитировать Сообщить модератору
 Re: Постоянная таблица супротив временных  [new]
Glory
Member

Откуда:
Сообщений: 104760
Oleg Krivopusk
ну зачем оно... ну просто, чтобы просматривать результаты пользователю

В вашем шаблоне почему то удаление идет по таблице, а обновление - по представлению.
8 окт 13, 09:22    [14937493]     Ответить | Цитировать Сообщить модератору
 Re: Постоянная таблица супротив временных  [new]
Oleg Krivopusk
Member

Откуда: Хабаровск
Сообщений: 50
Glory,

да, ошибся.. таблица там тоже должна быть
8 окт 13, 10:25    [14937807]     Ответить | Цитировать Сообщить модератору
 Re: Постоянная таблица супротив временных  [new]
Crimean
Member

Откуда:
Сообщений: 13148
Oleg Krivopusk
Нормально ли это?


в целом да, если поток модификации не очень большой
данные-то вы отделили, а вот журналы у базы - общие остались
в этом смысле работа с # разгружает журнал основной базы
8 окт 13, 10:29    [14937831]     Ответить | Цитировать Сообщить модератору
 Re: Постоянная таблица супротив временных  [new]
Гость333
Member

Откуда:
Сообщений: 3683
Oleg Krivopusk
Каждый раз писать километры кода только для создания индексов во временной?

-- Функция, возвращающая структуру временной таблицы
CREATE FUNCTION dbo.CreateTempTableDefinition()
RETURNS @TempTable
TABLE
(
   ID   int IDENTITY NOT NULL PRIMARY KEY,
   Dat  datetime NOT NULL,
   Name varchar(100) COLLATE DATABASE_DEFAULT,
   ...
)
AS
BEGIN
   RETURN;
END;
GO
-- Процедура, создающая индексы на временной таблице
CREATE PROCEDURE dbo.CreateIndexesOnTempTable
AS
BEGIN
  CREATE INDEX i_TempTable_Dat ON #TempTable(Dat);
  CREATE INDEX i_TempTable_Name ON #TempTable(Name);
END;
GO
-- Процедура, использующая временную таблицу
CREATE PROCEDURE dbo.SomeProc
AS
BEGIN
   SELECT * INTO #TempTable FROM dbo.CreateTempTableDefinition();
   EXEC dbo.CreateIndexesOnTempTable;
   -- Дальше используем временную таблицу
   ...
END;
GO

Хотя тут есть свои нюансы.
8 окт 13, 10:48    [14937975]     Ответить | Цитировать Сообщить модератору
 Re: Постоянная таблица супротив временных  [new]
Mind
Member

Откуда: Лучший город на Земле
Сообщений: 2322
Oleg Krivopusk
автор
То есть вы не знаете, что на #MyTable тоже можно создавать какие угодно индексы? Или что вы имеете в виду под "готовыми индексами"?


Много процедур имеют внутри себя обработку данных с использованием одной и той же таблицы, которая в свою очередь весьма "широка" и нужно много индексов. Каждый раз писать километры кода только для создания индексов во временной?
У меня большие сомнения, что все ваши индексы во временной таблице реально используются, а не висят балластом.
10 окт 13, 23:26    [14953862]     Ответить | Цитировать Сообщить модератору
Все форумы / Microsoft SQL Server Ответить