2012-01-18 4 views
5

Я использую глобальные временные таблицы Oracle 11g, так как мне нужно решение, в котором я могу добавить строки во временную таблицу для соединения, и мне нужны только строки, добавленные в таблицу temp для Соединение Oracle/сеанс, который будет включен. Я использую таблицу глобального Temp в Oracle, потому что хочу, чтобы таблица существовала между сессиями, поэтому ее не нужно воссоздавать каждый раз, когда я создаю запрос. Это хорошо работает.Глобальные таблицы темпов - SQL Server vs Oracle

Мой Oracle определение таблицы выглядит следующим образом:

CREATE GLOBAL TEMPORARY TABLE book_id_temp 
( 
    book_id RAW(32) 
)ON COMMIT DELETE ROWS; 

Я имею ту же структуру базы данных и на SQL Server 2008 R2, на стороне, и необходимо подобное решение в SQL Server. Я хочу:

  1. Открыть SQL Connection (ADO.NET)
  2. В рамках сделки:
  3. -Add строки в таблицу темп.
  4. -Подробнее на другом столе, ВЫБЕРИТЕ результат
  5. -При включении в соединение только строки, добавленные во время этого сеанса. Другой поток может выполняться в одной временной таблице. Возможно ли тогда, что местная таблица темпов будет лучше?
  6. Откат всей транзакции.

Из того, что я читал о глобальных временных таблицах в SQL Server, таблицы существуют после того, как соединение завершено, как обычная таблица, и как глобальная таблица Temp в Oracle. Однако неясно, в какой области данных. Имеет ли доступ к ней только сеанс SQL Server, который создал строки, например, в Oracle? Какова доступность данных с помощью таблиц SQL Server Global Temp? У вас есть предложение альтернативы для достижения моей цели?

+0

Oracle глобальные временные таблицы также должны быть усечена, в зависимости от операции ... Я хотел бы использовать переменную таблицу по временной таблицы в SQL Server, учитывая выбор, но вам нужно объясните свою потребность в сохранении, когда соединение потеряно, чтобы получить реальную помощь. Почему бы просто не сделать фактический стол? –

+0

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

+0

Это звучит так, как будто вы хотите локальную таблицу темп, а не глобальную таблицу темп. Не могли бы вы описать, какую семантику вы требуете *? –

ответ

6

Временные таблицы в Oracle - это постоянные объекты, которые содержат временные данные, которые являются локальными сеансами. Временные таблицы в SQL Server - это временные объекты.

  1. В SQL Server глобальная временная таблица содержит данные, которые видны для всех сеансов. «Глобальные временные таблицы видны любому пользователю и любому соединению после их создания». http://msdn.microsoft.com/en-us/library/ms186986.aspx
  2. Глобальные временные таблицы по-прежнему являются временными объектами, которые не сохраняются неопределенно долго и, возможно, их необходимо создать перед использованием. «Глобальные временные таблицы ... удаляются, когда все пользователи, ссылающиеся на таблицу, отключаются от экземпляра SQL Server». http://msdn.microsoft.com/en-us/library/ms186986.aspx

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

Обычно, в таком случае, как ваши, шаг 3, добавить строки временной таблицы, будет сделано, делая select ... into #temp_table_name .... (эквивалент Oracle create table ... as select ...) http://msdn.microsoft.com/en-us/library/ms188029.aspx

Кроме того, вы не можете сделать следующее в ХП: (псевдокод.)

begin proc 
    call another proc to create local temp table. 
    use temp table 
end proc 

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

Обновление 2014-10-14: Поведение локальных временных таблиц различно в версии SQL Server Parallel Data Warehousev. Временные таблицы не удаляются при выходе из хранимой процедуры, которая их создала, и вместо этого продолжают существовать для остальной части сеанса. Такое поведение наблюдается на:

select @@version 
Microsoft SQL Server 2012 - 10.0.5108.1 (X64) Jun 24 2014 20:17:02 Copyright (c) Microsoft Corporation Parallel Data Warehouse (64-bit) on Windows NT 6.2 <X64> (Build 9200:) 
1

Если вручную создать таблицы в TempDb базе данных, вам в достижении более или менее тот же эффект:

USE tempdb; 

CREATE TABLE foo... 

, а затем обратиться к ним:

select * from tempdb..foo 

Эти таблицы не будут удалены между сессиями , Вы должны вручную усечь их, хотя и не эквивалент ON COMMIT DELETE ROWS.

+0

Моя текущая реализация ADO.NET заключается в том, что после того, как я вставляю записи в таблицу temp и делаю Join, я делаю Rollback() на IDbConnection, так что на самом деле этого может быть достаточно. Вы говорите, что таблица не будет удалена, но как ее содержимое? Я думаю, что если я никогда не совершаю транзакции, никакое другое активное соединение не сможет даже получить доступ к данным. –

+0

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

1

Если вы создаете глобальную таблицу темпа (## table) в SQL Server, она будет «жить» и будет доступна через другие сеансы, пока сеанс не будет закрыт. Кроме того, вы не сможете создать эту глобальную таблицу темпа под тем же именем для другого сеанса, пока не завершится первоначальный сеанс, вы увидите, что таблица уже существует. Для вашей цели глобальная таблица темпов не будет хорошим решением.

Местный Таблица Темп (#table) будет намного лучше и достигнет того, что вы ищете.

Надеется, что это помогает

+0

- это записи глобальной таблицы temp, доступной только в транзакции, в которой они были созданы? Я бы предпочел не создавать таблицу для каждого запроса. –

+0

Нет, записи во всех глобальных таблицах SQL Server (## table_name) видны для всех сеансов. –

4

Временных таблицы на SQL Server являются локальными по умолчанию. После завершения сеанса таблица будет удалена. Если выполнить сценарий, как:

create table #Foo (
     FooID int 
     ,FooCode1 varchar (20) 
) 

insert table #Foo (FooID, FooCode1) 
values (1001, 'X') 

insert table #Foo (FooID, FooCode1) 
values (1002, 'Y') 

select f.FooID 
     ,f.FooCode1 
     ,b.BarID 
     ,b.BarCode1 
    from #foo f 
    join bar b 
    on bar.FooID = f.FooID -- (or whatever predicate) 

Запрос будет возвращать только строки, которые соединяются на то, что вы вставили в #foo в этой сессии. #Foo является локальным для сеанса; вы можете иметь несколько сеансов со своей временной временной таблицей #Foo, не беспокоясь о столкновениях пространства имен.Когда сеанс закрыт, временная таблица будет отброшена. Вы также можете явно удалить #Foo после того, как закончите с ним, если используете постоянное соединение с базой данных (например, настольное приложение клиент-сервер).

+0

Я создаю IDbConnection и управляю транзакцией (не постоянно) и закрываю соединение. Когда соединение закрывается, значит, сеанс, правильно? –

+0

Да, если вы закроете соединение, сеанс закроется. – ConcernedOfTunbridgeWells

Смежные вопросы