development

SQL Server의 로컬 및 글로벌 임시 테이블

big-blog 2020. 6. 22. 07:21
반응형

SQL Server의 로컬 및 글로벌 임시 테이블


SQL Server에서 로컬 및 글로벌 임시 테이블의 차이점은 무엇입니까?


나는이 설명이 매우 분명하다는 것을 알았습니다 ( Technet 의 순수한 사본입니다 ).

임시 테이블에는 로컬 및 전역의 두 가지 유형이 있습니다. 로컬 임시 테이블은 테이블을 처음 만들거나 참조 할 때와 같은 SQL Server 인스턴스에 연결하는 동안 작성자에게만 표시됩니다. 사용자가 SQL Server 인스턴스에서 연결을 끊은 후 로컬 임시 테이블이 삭제됩니다. 전역 임시 테이블은 생성 된 모든 사용자와 모든 연결에서 볼 수 있으며 테이블을 참조하는 모든 사용자가 SQL Server 인스턴스와 연결이 끊어지면 삭제됩니다.


  • 테이블 변수 ( DECLARE @t TABLE)는 테이블 변수 를 작성하는 연결에만 표시되며 배치 또는 저장 프로 시저가 종료되면 삭제됩니다.

  • 로컬 임시 테이블 ( CREATE TABLE #t)은 테이블 을 작성하는 연결에만 표시되며 연결이 닫히면 삭제됩니다.

  • 전역 임시 테이블 ( CREATE TABLE ##t)은 모든 사람이 볼 수 있으며이를 참조하는 모든 연결이 닫히면 삭제됩니다.

  • Tempdb 영구 테이블 ( USE tempdb CREATE TABLE t)은 모든 사람이 볼 수 있으며 서버를 다시 시작할 때 삭제됩니다.


온라인 설명서에서 인용 :

로컬 임시 테이블은 현재 세션에서만 볼 수 있습니다. 전역 임시 테이블은 모든 세션에서 볼 수 있습니다.

DROP TABLE을 사용하여 명시 적으로 삭제하지 않으면 임시 테이블이 범위를 벗어나면 자동으로 삭제됩니다.

  • 스토어드 프로 시저에서 작성된 로컬 임시 테이블은 스토어드 프로 시저가 완료되면 자동으로 삭제됩니다. 테이블은 테이블을 생성 한 저장 프로 시저에 의해 실행되는 모든 중첩 저장 프로 시저에 의해 참조 될 수 있습니다. 테이블을 작성한 스토어드 프로 시저를 호출 한 프로세스가 테이블을 참조 할 수 없습니다.
  • 다른 모든 로컬 임시 테이블은 현재 세션이 끝날 때 자동으로 삭제됩니다.
  • 테이블을 작성한 세션이 종료되고 다른 모든 태스크가 참조를 중지하면 글로벌 임시 테이블이 자동으로 삭제됩니다. 작업과 테이블 간의 연결은 단일 Transact-SQL 문의 수명 동안 만 유지됩니다. 즉, 만들기 세션이 종료 될 때 테이블을 참조하는 마지막 Transact-SQL 문이 완료되면 전역 임시 테이블이 삭제됩니다.

1.) 로컬 임시 테이블은 연결 기간 동안 또는 복합 명령문 내에 정의 된 경우 복합 명령문 기간 동안 만 존재합니다.

로컬 임시 테이블은 테이블을 만든 SQL Server 세션 또는 연결 (단일 사용자를 의미)에서만 사용할 수 있습니다. 테이블을 생성 한 세션이 닫히면 자동으로 삭제됩니다. 로컬 임시 테이블 이름은 단일 해시 ( "#") 기호로 표시됩니다.

CREATE TABLE #LocalTemp
(
 UserID int,
 Name varchar(50), 
 Address varchar(150)
)
GO
insert into #LocalTemp values ( 1, 'Name','Address');
GO
Select * from #LocalTemp

로컬 임시 테이블의 범위는 현재 사용자 세션의 현재 쿼리 창에 존재합니다. 현재 쿼리 창을 닫거나 새 쿼리 창을 열고 위에서 만든 임시 테이블을 찾으려면 오류가 발생합니다.


2.) 전역 임시 테이블은 데이터베이스에 영구적으로 남아 있지만 행은 주어진 연결 내에 만 존재합니다. 연결이 닫히면 전역 임시 테이블의 데이터가 사라집니다. 그러나 다음에 데이터베이스를 열 때 테이블 정의는 데이터베이스에 액세스하여 액세스 할 수 있습니다.

전역 임시 테이블은 모든 SQL Server 세션 또는 연결에 사용할 수 있습니다 (모든 사용자를 의미 함). 이들은 모든 SQL Server 연결 사용자가 작성할 수 있으며 모든 SQL Server 연결이 닫히면 자동으로 삭제됩니다. 전역 임시 테이블 이름은 이중 해시 ( "##") 기호로 표시됩니다.

CREATE TABLE ##GlobalTemp
(
 UserID int,
 Name varchar(50), 
 Address varchar(150)
)
GO
insert into ##GlobalTemp values ( 1, 'Name','Address');
GO
Select * from ##GlobalTemp

전역 임시 테이블은 모든 SQL Server 연결에 표시되고 로컬 임시 테이블은 현재 SQL Server 연결에만 표시됩니다.


: 또한이 있음을 언급 할 가치가 데이터베이스 전역 임시 테이블 범위 (현재는 푸른 SQL 데이터베이스에 의해 지원을).

## 테이블 이름으로 시작된 SQL Server의 전역 임시 테이블은 tempdb에 저장되고 전체 SQL Server 인스턴스에서 모든 사용자 세션간에 공유됩니다.

Azure SQL Database는 tempdb에 저장되고 데이터베이스 수준으로 범위가 지정된 전역 임시 테이블을 지원합니다. 즉, 전역 임시 테이블은 동일한 Azure SQL 데이터베이스 내의 모든 사용자 세션에 대해 공유됩니다. 다른 데이터베이스의 사용자 세션은 전역 임시 테이블에 액세스 할 수 없습니다.

-- Session A creates a global temp table ##test in Azure SQL Database testdb1
-- and adds 1 row
CREATE TABLE ##test ( a int, b int);
INSERT INTO ##test values (1,1);

-- Session B connects to Azure SQL Database testdb1 
-- and can access table ##test created by session A
SELECT * FROM ##test
---Results
1,1

-- Session C connects to another database in Azure SQL Database testdb2 
-- and wants to access ##test created in testdb1.
-- This select fails due to the database scope for the global temp tables 
SELECT * FROM ##test
---Results
Msg 208, Level 16, State 0, Line 1
Invalid object name '##test'

참고 URL : https://stackoverflow.com/questions/2920836/local-and-global-temporary-tables-in-sql-server

반응형