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


156

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


2
여기에 대한 요약 정보가 있습니다. 여기를 클릭하십시오
Jayesh Sorathia

5
테이블 변수를 사용할 때주의하십시오. 쿼리에서 사용하면 인덱싱되지 않으므로 쿼리 계획에 심각한 성능 문제가 발생할 수 있습니다.

실제로 필요한 경우 임시 테이블을 인덱싱 할 수 있지만 시간과 리소스도 필요하므로 성능이나 리소스 문제가 여전히 발생할 수 있습니다.
Andrew Steitz

답변:


114

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

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


훌륭하고 유용한 답변! 전역 임시 테이블이 SQL Server에 의해 자동으로 정리되는지 여부에 대한 특정 정보를 찾고있었습니다.
kwill

매우 명확하고 간결한 답변. 누구나 글로벌 임시 테이블에 대한 유스 케이스를 생각할 수 있습니까? 로컬 임시 테이블의 목적과 대조적으로 목적을 설명하는 것입니까?
트레버

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

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

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

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


55
또한 주목할 가치가 있습니다. 로컬 임시 테이블은 작성된 범위가 닫히면 삭제됩니다. 따라서 sproc 내부에 로컬 임시 테이블을 만든 다음 sproc 외부에서 액세스하려고 시도하면 존재하지 않습니다.

Will에게 +1 로컬 임시 테이블을 옵티 마이저로 사용하려고했지만 저장 프로 시저를 "존재하지 않는 경우 생성 및 채우기"이니셜 라이저로 사용하려고했습니다. 말했듯이 전역 임시 테이블을 대신 사용하지 않으면 작동하지 않습니다.
quillbreaker

9
"참조한 모든 연결이 닫히면 삭제됩니다"- "참조한"연결은 정확히 무엇을 의미합니까? 하나의 연결 # 1에서 StoredProc이 ## TempTable을 생성하는 경우 10 분 후에 다른 연결 # 2에서 볼 수 있습니까 (연결 생성 # 2가 테이블 작성 시간에 활성화 된 경우)? 답변 : 전역 임시 테이블은 자동으로 삭제 될 때 테이블을 작성한 세션이 종료되고 다른 모든 태스크가 참조를 중지했습니다. (다른 답변에서이 페이지에 더 많은 것을보십시오)
tbone

후속 논리에 필요한 로컬 임시 테이블 (#t)을 만들기 위해 저장 프로 시저를 사용하려고했지만 하위 저장 프로 시저 호출에서 사용할 수 있으려면 부모 저장 프로 시저가 생성해야한다는 것이 밝혀졌습니다. 테이블을 같은 방식으로 설정하고 일반적인 sproc을 호출해야하는 많은 저장 프로 시저가 있기 때문에 이것은 슬픈 일이었습니다. 이 경우 자식 호출이 형제가 만든 테이블에 액세스 할 수있는 전역 임시 테이블이 작동합니까? 우리는 SQL Server 2008을 사용하고 있습니다.
Brandon

1
@Brandon 당신 말이 맞아요. 기능이 없습니다. 임시 데이터의 올바른 범위 지정에 대한 TSQL의 지원은 매우 개략적입니다. 마치 언어 디자이너가 모든 것을 세계화하기를 원한 것처럼 보입니다. 그리고 클로저에 대한 지원은 거의 없습니다. 커서 변수를 전달할 수 있습니다. 그러나 행 단위로 행할 수있는 방법이 없기 때문에 이는 또 다른 웜 캔입니다.
Anthony Faull

12

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


2
전역 임시 테이블의 정의는 다른 DB에서 발생할 것으로 예상되는 방식이지만 SQL Server에서 실제로 발생하는 결과는 다음과 같습니다. "테이블을 만든 세션에서 전역 임시 테이블이 자동으로 삭제됩니다. 끝과 다른 모든 작업이 참조를 중지했습니다. "
Nickolay

11

온라인 설명서에서 인용 :

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

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

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

0

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

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

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

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


0

: 또한이 있음을 언급 할 가치가 데이터베이스 전역 임시 테이블 범위 (현재는 푸른 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에 설정되어 있으며 개별 사용자 데이터베이스 설정은 영향을 미치지 않습니다.


0

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

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

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

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.