문제

최근에 저는 대체 백엔드로 MS SQL Server를 지원하기 위해 일부 애플리케이션을 변경하기 시작했습니다.

내가 만난 호환성 문제 중 하나는 MySQL의 CREATE TEMPORARY TABLE을 사용하여 영구 저장이 필요없는 세션 중에 매우 빠른 액세스를 위해 데이터를 보유하는 메모리 내 테이블을 만드는 것입니다.

MS SQL에서 동등한 것은 무엇입니까?

요구 사항은 다른 테이블과 마찬가지로 임시 테이블을 사용할 수 있어야한다는 것입니다. 특히 영구적 인 테이블을 사용하여 JOIN를 생성해야합니다.

도움이 되었습니까?

해결책

@Keith

이것은 일반적인 오해입니다. 테이블 변수가 반드시 메모리에 저장되는 것은 아닙니다.실제로 SQL Server는 변수를 메모리에 보관할지 아니면 TempDB로 넘길지를 결정합니다.테이블 데이터가 메모리에 보관되도록하는 신뢰할 수있는 방법 (적어도 SQL Server 2005에서는)이 없습니다.자세한 내용은 여기

다른 팁

테이블 변수 (메모리에)와 두 가지 유형의 임시 테이블을 만들 수 있습니다. 라코 디스 <시간>

수정 :

피드백에 따라 약간의 설명이 필요하다고 생각합니다.

#table##table는 항상 TempDB에 있습니다.

@Table 변수는 일반적으로 메모리에 있지만 보장되지는 않습니다.SQL은 쿼리 계획에 따라 결정하고 필요한 경우 TempDB를 사용합니다.

다음과 같이 SQL Server 2005에서 "테이블 변수"를 선언 할 수 있습니다. 라코 디스

그런 다음 변수처럼 참조합니다. 라코 디스

삭제할 필요가 없습니다. 변수가 범위를 벗어나면 사라집니다.

MS SQL Server 2014에서 가능합니다.

참조 : http://msdn.microsoft.com/en-us / library / dn133079.aspx

다음은 MSDN의 SQL 생성 코드 예입니다. 라코 디스

좋은 블로그 게시물 이지만 기본적으로 local temp#이있는 테이블과 ##이있는 전역 임시-예 라코 디스

이해하려는 목표를 이해합니다. 다양한 데이터베이스의 세계에 오신 것을 환영합니다!

SQL Server 2000은 테이블 이름에 # 접두사를 추가하여 로컬로 액세스 할 수있는 임시 테이블 (세션에 로컬)로 만들고 테이블 이름 앞에 ##를 추가하여 생성 된 임시 테이블을 지원합니다. 예를 들어 #MyLocalTable 및 ## MyGlobalTable.

SQL Server 2005 이상은 임시 테이블 (로컬, 글로벌) 및 테이블 변수를 모두 지원합니다. SQL 2008 및 릴리스 2의 테이블 변수에 대한 새로운 기능을주의하십시오! 임시 테이블과 테이블 변수의 차이는 크지 않지만 데이터베이스 서버가 처리하는 방식에 있습니다.

저는 7, 6과 같은 이전 버전의 SQL 서버에 대해 이야기하고 싶지 않습니다.하지만 저는 그들과 함께 일했고 어쨌든 제가 어디에서 왔는지 :-)

테이블 변수가 항상 메모리에 상주한다고 생각하는 것이 일반적이지만 이것은 잘못된 것입니다. 메모리 사용량과 트랜잭션의 데이터베이스 서버 볼륨에 따라 테이블 변수의 페이지를 메모리에서 내보내고 tempdb에 기록하고 나머지 처리는 tempdb에서 수행합니다.

tempdb는 본질적으로 영구 개체가없는 인스턴스의 데이터베이스이지만 정렬과 같은 부차적 트랜잭션 및 본질적으로 일시적인 기타 처리 작업과 관련된 워크로드를 처리합니다. 반면에 테이블 변수 (일반적으로 더 작은 데이터)는 메모리 (RAM)에 보관되므로 액세스가 더 빨라지므로 항상 임시 테이블에 비해 더 작은 데이터가있는 테이블 변수를 사용할 때 tempdb 드라이브를 사용할 때 디스크 IO가 더 적습니다. tempdb에 로그인합니다.

테이블 변수는 인덱싱 할 수 없지만 임시 테이블 (로컬 및 글로벌 모두)은 데이터 양이 많은 경우 빠른 처리를 위해 인덱싱 할 수 있습니다. 따라서 임시 트랜잭션으로 더 큰 데이터 볼륨으로 더 빠른 처리를 원하는 경우 선택을 알 수 있습니다. 또한 테이블 변수에 대한 트랜잭션 만 로깅되지 않고 롤백 할 수없고 임시 테이블에서 수행 된 트랜잭션은 롤백 할 수 있다는 점도 주목할 가치가 있습니다!

요약하면 테이블 변수는 작은 데이터에 더 적합하고 임시 테이블은 더 큰 데이터를 임시로 처리하는 데 더 좋습니다. 또한 트랜잭션 블록을 사용하여 적절한 트랜잭션 제어를 원할 경우 테이블 변수는 트랜잭션 롤백 옵션이 아니므로이 경우 임시 테이블을 사용하는 것이 좋습니다.

마지막으로 임시 테이블은 항상 tempdb를 사용하기 때문에 항상 디스크 IO를 증가시키는 반면 테이블 변수는 메모리 스트레스 수준에 따라 증가하지 않을 수 있습니다.

100 % 이상으로 더 빠른 성능을 얻기 위해 tempdb를 조정하는 방법에 대한 팁이 필요하면 알려주세요!

원하는 구문은 다음과 같습니다.

#tablename 테이블 생성

# 접두사는 테이블을 임시 테이블로 식별합니다.

CREATE TABLE #tmptablename

해시 / 파운드 기호 접두사 사용

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top