SQL Server 로컬 및 글로벌 임시 테이블
SQL Server의 로컬 임시 테이블과 글로벌 임시 테이블의 차이점은 무엇입니까?
테이블 변수(
DECLARE @t TABLE는 작성한 프로시저가 종료되면 는 작성한 접속에만 표시되며 배치 프로시저 또는 스토어드 프로시저가 종료되면 삭제됩니다.로컬 임시 테이블(
CREATE TABLE #t)는이 닫히면 됩니다).글로벌 임시 테이블(
CREATE TABLE ##t는 모든 사용자가 볼 수 는 모든 사용자가 볼 수 있으며 참조한 모든 연결이 닫히면 삭제됩니다.Tempdb 영구 테이블(
USE tempdb CREATE TABLE t되며, 는 모든 사용자에게 표시되며 서버가 재부팅되면 삭제됩니다.
이 설명은 매우 명확합니다(Technet에서 복사한 것입니다).
임시 테이블에는 로컬테이블과 글로벌테이블의 2종류가 있습니다.로컬 임시 테이블은 테이블을 처음 만들거나 참조할 때와 동일한 SQL Server 인스턴스에 연결하는 동안 작성자에게만 표시됩니다.사용자가 SQL Server 인스턴스에서 연결을 끊으면 로컬 임시 테이블이 삭제됩니다.글로벌 임시 테이블은 생성된 후 모든 사용자 및 연결에 표시되며 테이블을 참조하는 모든 사용자가 SQL Server 인스턴스에서 연결을 끊으면 삭제됩니다.
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 문이 완료되면 글로벌임시 테이블이 폐기됩니다.
Global Temp 테이블을 찾을 수 있는 위치를 사용자에게 보여주는 답변을 찾을 수 없습니다.SSMS 내에서 이동할 때 로컬 및 글로벌 임시 테이블을 동일한 위치에 볼 수 있습니다. 이 링크에서 가져온 아래의 스크린샷.
데이터베이스 --> 시스템 데이터베이스 --> tempdb --> 임시 테이블
로컬 임시 테이블: 로컬 임시 테이블을 작성한 후 다른 연결을 열고 쿼리를 시도하면 다음 오류가 발생합니다.
임시 테이블은 임시 테이블을 작성한 세션 내에서만 액세스할 수 있습니다.
글로벌 임시 테이블:경우에 따라서는, 다른 접속에 액세스 할 수 있는 임시 테이블을 작성할 수도 있습니다.이 경우 글로벌 임시 테이블을 사용할 수 있습니다.
글로벌 임시 테이블은 해당 테이블을 참조하는 모든 세션이 닫힐 때만 파기됩니다.
데이터베이스 범위 글로벌 임시 테이블(현재 Azure SQL Database에서만 지원됨)도 있습니다.
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 데이터베이스(기능은 공개 미리보기)
글로벌 임시 테이블의 자동 드롭 기능을 설정할 수 있습니다.기본값은 ON입니다.이는 어떤 세션에서도 사용되지 않을 때 글로벌임시 테이블이 자동으로 폐기됨을 의미합니다.OFF로 설정하면 글로벌임시 테이블은 DROP TABLE 문을 사용하여 명시적으로 폐기해야 합니다.그렇지 않으면 서버 재시작 시 자동으로 폐기됩니다.
Azure SQL Database 단일 데이터베이스 및 탄력 풀을 사용하면 SQL Database 서버의 개별 사용자 데이터베이스에서 이 옵션을 설정할 수 있습니다.SQL 서버 및 Azure SQL 데이터베이스 관리 인스턴스에서 이 옵션은 TempDB에 설정되며 개별 사용자 데이터베이스 설정은 영향을 미치지 않습니다.
언급URL : https://stackoverflow.com/questions/2920836/local-and-global-temporary-tables-in-sql-server
'programing' 카테고리의 다른 글
| SQL 쿼리가 1개인 데이터베이스에서 모든 테이블을 삭제하려면 어떻게 해야 합니다. (0) | 2023.04.08 |
|---|---|
| SQL JOIN과 IN의 퍼포먼스 비교 (0) | 2023.04.08 |
| SQL DATE에서 월 및 년만 가져오기 (0) | 2023.04.08 |
| SQL Server 2008에서 사용자 정의 테이블 유형이 존재하는지 확인하는 방법 (0) | 2023.04.08 |
| T-SQL에서 테이블을 스키마로 이동하려면 어떻게 해야 합니까? (0) | 2023.04.08 |
