Обычная таблица или глобальная временная таблица? Ms sql временная таблица


Обычная таблица или глобальная временная таблица? MS SQL Server

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

tempdb немного более эффективен с точки зрения требований к регистрации.

Глобальные таблицы temp отбрасываются, как только все ссылки на соединения являются соединением, которое создало таблицу, закрыто.

Изменить: После редактирования @ cyberkiwi. BOL определенно прямо говорит

Глобальные временные таблицы видны любому пользователю и любому соединению после их создания и удаляются, когда все пользователи, которые ссылаются на таблицу, отключаются от экземпляра SQL Server.

В моем тесте я тоже не смог получить это поведение.

Соединение 1

CREATE TABLE ##T (i int) INSERT INTO ##T values (1) SET CONTEXT_INFO 0x01

Соединение 2

INSERT INTO ##T VALUES(4) WAITFOR DELAY '00:01' INSERT INTO ##T VALUES(5)

Подключение 3

SELECT OBJECT_ID('tempdb..##T') declare @killspid varchar(10) = (select 'kill ' + cast(spid as varchar(5)) from sysprocesses where context_info=0x01) exec (@killspid) SELECT OBJECT_ID('tempdb..##T') /*NULL - But 2 is still running let alone disconnected!*/

Глобальная временная таблица

  • -ve: Как только соединение that created таблицу, выходит из области видимости, она берет таблицу с ней. Это повреждает, если вы используете пул соединений, которые могут постоянно переключаться на соединения и, возможно, перезагружать его
  • -ve: Вам нужно продолжать проверять, существует ли таблица (после перезагрузки) и создать ее, если нет
  • + ve: простое ведение журнала в tempdb уменьшает активность ввода-вывода и процессора

Обычный стол

  • + ve: обычное ведение журнала хранит ваш кеш с вашим основным db. Если ваш «кеш» поддерживается, но по-прежнему является критически важным, это сохраняет его согласованно вместе с db
  • -ve: следовать сверху. Больше регистрации
  • + ve: таблица всегда вокруг, и для всех соединений

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

sqlserver.bilee.com

Вставка данных во временную таблицу MS SQL Server

После создания временной таблицы и объявления таких типов данных;

Как мне затем вставить соответствующие данные, которые уже хранятся на физической таблице в базе данных?

INSERT INTO #TempTable (ID, Date, Name) SELECT id, date, name FROM physical_table SELECT ID , Date , Name into #temp from [TableName]

Чтобы вставить все данные из всех столбцов, просто используйте это:

SELECT * INTO #TempTable FROM OriginalTable

Не забудьте DROP временную таблицу после того, как вы закончите с ней, и прежде чем пытаться создать ее снова:

DROP TABLE #TempTable

Мой способ Insert в SQL Server. Также я обычно проверяю, существует ли временная таблица.

IF OBJECT_ID('tempdb..#MyTable') IS NOT NULL DROP Table #MyTable SELECT b.Val as 'bVals' INTO #MyTable FROM OtherTable as b SELECT * INTO #TempTable FROM table

Правильный запрос:

drop table #tmp_table select new_acc_no, count(new_acc_no) as count1 into #tmp_table from table where unit_id = '0007' group by unit_id, new_acc_no having count(new_acc_no) > 1 insert into #temptable (col1, col2, col3) select col1, col2, col3 from othertable

Обратите внимание, что это считается плохой практикой:

insert into #temptable select col1, col2, col3 from othertable

Если определение таблицы temp должно измениться, код может выйти из строя во время выполнения.

После создания таблицы temp вы просто будете делать обычный INSERT INTO () SELECT FROM

INSERT INTO #TempTable (id, Date, Name) SELECT t.id, t.Date, t.Name FROM yourTable t INSERT INTO #TempTable(ID, Date, Name) SELECT OtherID, OtherDate, OtherName FROM PhysicalTable insert #temptable select idfield, datefield, namefield from yourrealtable

Я предложил два подхода для решения одной и той же проблемы,

Решение 1. Этот подход включает в себя 2 этапа: сначала создайте временную таблицу с указанным типом данных, затем вставьте значение из существующей таблицы данных.

CREATE TABLE #TempStudent(tempID int, tempName varchar(MAX) ) INSERT INTO #TempStudent(tempID, tempName) SELECT id, studName FROM students where id =1 SELECT * FROM #TempStudent

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

SELECT id, studName INTO #TempStudent FROM students where id =1 SELECT * FROM #TempStudent

Ниже приведена базовая работа временной таблицы, ее изменение и использование в соответствии с вашими требованиями,

– СОЗДАТЬ ТЕМПОВУЮ ТАБЛИЦУ

CREATE TABLE #MyTempEmployeeTable(tempUserID varchar(MAX), tempUserName varchar(MAX) )

– ВСТАВИТЬ ЗНАЧЕНИЕ В ТЕМПЕРАТУРУ

INSERT INTO #MyTempEmployeeTable(tempUserID,tempUserName) SELECT userid,username FROM users where userid =21

– QUERY TEMP TABLE [Это будет работать только в том же сеансе / экземпляре, а не в другом экземпляре сеанса пользователя]

SELECT * FROM #MyTempEmployeeTable

– УДАЛИТЬ ЗНАЧЕНИЕ В ТЕМПЕ ТАБЛИЦЕ

DELETE FROM #MyTempEmployeeTable

– DROP TEMP TABLE

DROP TABLE #MyTempEmployeeTable

sqlserver.bilee.com

как создать временную таблицу в Oracle? MS SQL Server

Я знаком с Sybase / SQL-сервером, где я могу создать temp. таблица выглядит так:

#temp существует только на протяжении всего сеанса, и его может видеть только я.

Я хотел бы сделать аналогичную вещь в Oracle, но я читаю о «глобальных временных таблицах», которые не похожи на одно и то же.

Как я могу сделать то же самое в Oracle, что и в Sybase?

Ваш первый подход должен состоять в том, чтобы сделать это как один запрос:

SELECT * FROM ( SELECT * FROM tab1 , tab2 WHERE tab1.key = tab2.fkey ) WHERE field1 = 'value';

Для очень сложных ситуаций или когда temp # очень большой, попробуйте опцию факторизации подзапроса, необязательно с подсказкой materialize:

with #temp as ( SELECT /*+ materialize */ * FROM tab1 , tab2 WHERE tab1.key = tab2.fkey ) SELECT * FROM temp# WHERE field1 = 'value';

Если это не помогает, перейдите к методу Глобальная временная таблица.

Глобальная временная таблица не совпадает, определение остается после окончания сеанса, а также таблица (но не данные) видна для всех сеансов.

Если вы пишете хранимые процедуры, просмотрели ли вы курсоры? Это немного сложнее, но очень эффективный и чистый способ работы с временным набором данных.

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

Большинство потребностей такого характера можно встретить с помощью курсоров или одного из разных типов сбора pl / sql (вложенные таблицы, varrays, ассоциативные массивы), но ни один из них не может использоваться так, как если бы они были таблицей. То есть вы не можете выбрать из них.

Я считаю, что глобальные временные таблицы одинаковы. Они предоставят вам доступ к временной таблице, которая умирает при завершении сеанса:

Данные в глобальной временной таблице являются частными, так что данные, вставленные сеансом, могут быть доступны только для этого сеанса. Строки, специфичные для сеанса, в глобальной временной таблице могут быть сохранены для всего сеанса или только для текущей транзакции. Предложение ON COMMIT DELETE ROWS указывает, что данные должны быть удалены в конце транзакции.

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

CREATE GLOBAL TEMPORARY TABLE my_temp_table ON COMMIT DELETE ROWS select * from other table;

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

Временная модель таблицы несколько отличается в Oracle и сосредоточена вокруг инструкции CREATE GLOBAL TEMPORARY TABLE … Определения таблиц Temp всегда являются глобальными, но данные всегда конфиденциальны для сеанса, а также то, сохраняются ли данные по фиксации, зависит от того, задана ли квалификация «commit commit rows» или «on commit rows rows».

У меня есть некоторые сценарии Perl и блог-пот, которые исследуют конкретное поведение или таблицы temp Oracle в моем блоге .

Да, Карсон прав. Глобальные временные таблицы видны только для сеанса, который их создает, и исчезают либо при первом фиксации, либо в откате или в конце сеанса. Вы можете установить это при создании gtt.

sqlserver.bilee.com

SQL Server 2005 и временная таблица MS SQL Server

Я читал о временных таблицах и области, и все ответы, которые я видел, похоже, не говорят об одной из моих проблем.

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

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

Локальные временные таблицы (начало с #) ограничены вашей сессией; другие сеансы, даже из одной и той же строки пользователя / подключения, не могут их видеть. Правила для жизни зависят от того, была ли локальная временная таблица создана в хранимой процедуре:

  • Локальная временная таблица, созданная в хранимой процедуре, отбрасывается при завершении процедуры; другие хранимые процедуры или вызывающий процесс не могут их видеть.
  • Другие локальные временные таблицы удаляются при завершении сеанса.

Глобальные временные таблицы (начинаются с ##) распределяются между сеансами. Они отбрасываются, когда:

  • Сессия, которая их создала, заканчивается
  • И ни одна другая сессия не ссылается на них

Эта команда может быть полезна, чтобы увидеть, какие временные таблицы существуют:

select TABLE_NAME from tempdb.information_schema.tables

И это удобно отбрасывать временные таблицы, если вы не уверены, что они существуют:

if object_id('tempdb..#SoTest') is not null drop table #SoTest

См. Эту статью MSDN для получения дополнительной информации.

Временная таблица будет доступна для экземпляра процедуры, которая ее создает

Следующий скрипт

Exec ('Select 1 as col Into #Temp Select * From #Temp') Exec ('Select 2 as col Into #Temp Select * From #Temp')

Возвращает

Col 1 Col 2

Не

Col 1 2

Или ошибка, потому что таблица уже существует.

Временная таблица также будет доступна любым «дочерним» процедурам, которые также выполняются в начальной процедуре.

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

sqlserver.bilee.com