편집하다:
아래 Martin의 의견을 참조하십시오.
CTE는 메모리의 테이블로 구체화되지 않습니다. 쿼리 정의를 캡슐화하는 방법 일뿐입니다. OP의 경우 인라인되고 방금 수행하는 것과 동일 SELECT Column1, Column2, Column3 FROM SomeTable
합니다. 대부분의 경우 사전에 구체화되지 않으므로 행이 리턴되지 않으므로 WITH T(X) AS (SELECT NEWID())SELECT * FROM T T1 JOIN T T2 ON T1.X=T2.X
실행 계획을 확인하십시오. 때로는 스풀을 얻기 위해 계획을 해킹하는 것이 가능합니다. 이에 대한 힌트를 요청하는 연결 항목이 있습니다. – Martin Smith 2 월 15 일 12시 17:08
원래 답변
CTE
MSDN에서 더 읽어보기
CTE는 메모리에서 사용중인 테이블을 작성하지만 그 뒤에 오는 특정 쿼리에만 유효합니다. 재귀를 사용할 때 효과적인 구조가 될 수 있습니다.
테이블 변수 사용을 고려할 수도 있습니다. 이것은 사용 으로 임시 테이블을 사용하고 가입 각각에 대해 다시 구체화 할 필요없이 여러 번 사용할 수 있습니다. 또한 지금 몇 개의 레코드를 유지해야하는 경우 다음 선택 후 몇 개의 레코드를 추가하고 다른 op 다음에 몇 개의 레코드를 추가 한 다음 소수의 레코드 만 리턴하면 편리한 구조가 될 수 있습니다. 실행 후 삭제하지 않아도됩니다. 주로 구문 설탕. 그러나 행 수를 낮게 유지하면 디스크로 구체화되지 않습니다. SQL Server에서 임시 테이블과 테이블 변수의 차이점 은 무엇입니까?를 참조하십시오 . 상세 사항은.
임시 테이블
MSDN에 대한 자세한 내용-약 40 % 아래로 스크롤
임시 테이블은 말 그대로 모든 사람이 삭제할 수있는 특정 데이터베이스에서 디스크에 생성 된 테이블입니다. 더 이상 필요하지 않을 때 해당 테이블을 삭제하는 것은 좋은 개발자의 책임이지만 DBA도 테이블을 지울 수 있습니다.
임시 테이블은 로컬과 글로벌의 두 가지 종류가 있습니다. MS Sql Server의 #tableName
경우 로컬 ##tableName
지정과 전역 지정을 사용합니다 (식별 특성으로 단일 또는 이중 #을 사용합니다).
임시 변수 테이블에서는 테이블 변수 또는 CTE와 달리 일반적인 단어 의미의 테이블이므로 인덱스 등을 적용 할 수 있습니다.
일반적으로 더 길거나 더 큰 쿼리에는 임시 테이블을 사용하고 이미 작은 데이터 세트가 있고 작은 코드를 신속하게 스크립팅하려는 경우 CTE 또는 테이블 변수를 사용합니다. 다른 사람들의 경험과 조언에 따르면 CTE를 적은 수의 행으로 반환하는 경우 CTE를 사용해야합니다. 숫자가 큰 경우 임시 테이블에서 색인을 작성하는 기능이 도움이 될 수 있습니다.