[sql-server] 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)은 모든 사람이 볼 수 있으며 서버를 다시 시작할 때 삭제됩니다.


답변

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 연결에만 표시됩니다.


답변

온라인 설명서에서 인용 :

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

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

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

답변

로컬 임시 테이블 : 로컬 임시 테이블 을 작성한 후 다른 연결을 열고 쿼리를 시도하면 다음 오류가 발생합니다.

임시 테이블은이를 생성 한 세션 내에서만 액세스 할 수 있습니다.

전역 임시 테이블 : 때로는 다른 연결에 액세스 할 수있는 임시 테이블을 만들 수도 있습니다. 이 경우 전역 임시 테이블을 사용할 수 있습니다.

전역 임시 테이블은이를 참조하는 모든 세션이 닫힐 때만 삭제됩니다.


답변

: 또한이 있음을 언급 할 가치가 데이터베이스 전역 임시 테이블 범위 (현재는 푸른 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'

데이터베이스 범위 변경 구성

GLOBAL_TEMPORARY_TABLE_AUTODROP = { ON | OFF }

적용 대상 : Azure SQL Database (기능은 공개 미리보기에 있음)

글로벌 임시 테이블에 대한 자동 드롭 기능을 설정할 수 있습니다. 기본값은 ON입니다. 이는 세션에서 사용하지 않을 때 글로벌 임시 테이블이 자동으로 삭제됨을 의미합니다. OFF로 설정되면 DROP TABLE 문을 사용하여 글로벌 임시 테이블을 명시 적으로 삭제하거나 서버를 다시 시작할 때 자동으로 삭제됩니다.

Azure SQL Database 단일 데이터베이스 및 탄력적 풀을 사용하면이 옵션을 SQL Database 서버의 개별 사용자 데이터베이스에서 설정할 수 있습니다. SQL Server 및 Azure SQL Database 관리 형 인스턴스에서이 옵션은 TempDB에 설정되어 있으며 개별 사용자 데이터베이스 설정은 영향을 미치지 않습니다.


답변

Global Temp 테이블을 찾을 수있는 사용자에게 응답이 표시되지 않았습니다. SSMS 내에서 탐색 할 때 동일한 위치에서 로컬 및 글로벌 임시 테이블을 볼 수 있습니다. 이 링크 에서 가져온 아래 스크린 샷 .

데이터베이스-> 시스템 데이터베이스-> tempdb-> 임시 테이블

여기에 이미지 설명을 입력하십시오