|
|
게시됨 2020. 5. 28. 오전 10:52:28
|
|
|
|

임시 테이블은 Sqlserver 데이터베이스에서 매우 중요하며, 다음은 SQL 데이터베이스에서 임시 테이블의 특성과 사용법에 대한 자세한 소개입니다. 참고용으로만 설명하겠습니다.
임시 테이블은 영속 테이블과 유사하지만, 임시 테이블은 tempdb에 저장되며 더 이상 사용되지 않으면 자동으로 삭제됩니다. 임시 테이블에는 로컬 테이블과 글로벌 테이블 두 가지 유형이 있습니다. 이들은 이름, 가시성, 가용성으로 구별됩니다.
임시 테이블은 다음과 같은 특징을 가집니다:
- 로컬 임시 테이블은 사용자가 테이블을 생성할 때 "#" 접두사를 추가하는 테이블로, 데이터베이스 연결에 따라 독립적입니다. 로컬 임시 테이블을 만든 데이터베이스 연결만이 테이블에 접근할 수 있으며, 다른 연결은 테이블에 접근할 수 없습니다.
- 서로 다른 데이터베이스 연결에서는, 생성된 로컬 임시 테이블들이 같은 "이름"을 가지지만, 이 테이블들 사이에는 아무런 관계가 없습니다. SQLSERVER에서는 데이터베이스 연결 내 로컬 임시 테이블의 독립성을 보장하는 특별한 명명 메커니즘이 있습니다.
- 진정한 임시 테이블은 데이터베이스 임시 테이블 공간을 활용하며, 이는 데이터베이스 시스템에서 자동으로 유지되어 테이블 공간을 절약합니다. 임시 테이블스페이스는 일반적으로 가상 메모리를 사용하기 때문에 하드 디스크의 I/O 수가 크게 줄어들어 시스템 효율성도 향상됩니다.
- 임시 테이블은 트랜잭션이나 세션이 끝나면 자동으로 비워지므로, 데이터가 소진되면 데이터를 삭제할 필요가 없습니다.
로컬 임시 테이블
로컬 임시 테이블의 이름은 단일 숫자 기호(#)로 앞에 붙습니다; 이들은 현재 사용자 연결(즉, 로컬 임시 테이블을 생성하는 연결)에게만 보이며; 사용자가 SQL Server 인스턴스에서 연결을 끊으면 삭제됩니다.
예를 들어, 데이터베이스 연결에서 다음과 같은 문으로 로컬 임시 테이블을 만듭니다: #Temp
데이터베이스 연결 1:
그 후 동시에 데이터베이스 연결 2를 시작해 쿼리 #temp
데이터베이스 연결 2:
데이터베이스 연결 2의 결과가 어떻게 되는지 살펴보겠습니다.
데이터베이스 연결 2:
결과는 데이터베이스 연결 2가 테이블 #Temp을 찾을 수 없음을 보여줍니다. 즉, 임시 테이블 #Temp은 그것을 만든 데이터베이스 연결 1에만 보이고, 데이터베이스 연결 2에는 보이지 않습니다.
글로벌 임시 표
글로벌 임시 테이블의 이름은 두 개의 숫자 기호(##)로 앞에 붙으며, 생성 시 모든 데이터베이스 연결에서 보이고, 테이블을 참조하는 모든 데이터베이스 연결이 SQL Server에서 분리되면 제거됩니다.
예를 들어, 데이터베이스 연결에서 다음 문장으로 전역 임시 테이블 ##Temp을 생성한 후 세 행의 데이터를 삽입합니다
데이터베이스 연결 1:
그 다음 데이터베이스 연결 2에서 ##Temp的数据을 쿼리합니다
데이터베이스 연결 2:
데이터베이스 연결 2의 결과는 다음과 같습니다
데이터베이스 연결 2:
보시다시피, 데이터베이스 연결 2는 데이터베이스 연결 1에서 생성된 전역 임시 테이블 ##Temp에 성공적으로 접근할 수 있지만, 지금 데이터 연결 1을 닫고 데이터베이스 연결 2의 ##Temp查询语句会发生什么呢을 실행하면 어떻게 될까요? 결과는 다음과 같습니다:
데이터베이스 연결 1을 종료한 후 데이터베이스 연결 2가 다시 실행됩니다:
데이터베이스 연결 1을 종료한 후, 데이터베이스 연결 2는 전역 임시 테이블 ##Temp了을 찾을 수 없다는 것을 발견했습니다. 이는 데이터베이스 연결 1이 종료된 후 데이터베이스 연결 2에 임시 테이블 ##Temp을 사용하는 문장이 없기 때문에, sqlserver가 현재 전역 임시 테이블 ##Temp了을 참조하는 데이터베이스 연결이 없다고 인식하여 ##Temp释放掉了 하기 때문입니다.
다음으로, 데이터베이스 연결 2의 전역 임시 테이블 ##Temp持有事务中的排他锁(X-락)을 닫고 데이터베이스 연결 1을 닫으려고 시도합니다.
데이터베이스 연결 1:
데이터베이스 연결 2:
데이터베이스 연결 1을 닫으면 데이터베이스 연결 2가 실행됩니다:
결과는 데이터베이스 연결 1을 닫더라도, 데이터베이스 연결 2가 트랜잭션에서 전역 임시 테이블 ##Temp的排他锁(X 락)을 보유하고 있었기 때문에, 임시 테이블 ##Temp并没有随着数据库连接1的关闭而被释放掉 임시 테이블이 데이터베이스 연결 2에서 시작된 트랜잭션이 롤백되거나 커밋되지 않는 한 데이터베이스 연결 2가 항상 임시 테이블 ##Temp的排他锁을 보유한다는 것을 보여줍니다. 이 시점에서 Sqlserver는 여전히 글로벌 임시 테이블 ##Temp를 참조하는 데이터베이스 연결이 있다고 인식하여 ##Temp不会被释放掉가 됩니다. |
이전의:TypeScript 속성 accessor (set, get)다음:SQL Server는 현재 시스템 시간의 이전 날들을 쿼리합니다
|