2012-06-28 4 views
0

CTE를 사용하여 유효한 SQL을 작성하는 오랜 기간의 쿼리 시스템을 작성 중입니다. 간단한 시스템 내에서도 수천 가지의 표현을 만들 수있는 가능성이 있습니다. 그리고 나는 앞으로 한도에 도달 할 수 있고 시스템을 재 작업해야한다고 걱정합니다.허용되는 CTE (Common Table Expression) 식의 수에는 제한이 있습니까?

나는 높거나 낮게 조사했지만 대답을 찾을 수 없습니다. 내가 알고 싶은 것은 다음과 같습니다 :
CTE에서 허용되는 최대 표현식은 얼마입니까?

참고 : 나는 재귀를 사용하여 이 아니며입니다.

내 추측이 나는 배치 당 허용되는 문자의 수에 의해 제한하고있어한다

테스트 코드 아래

EDIT (Maximum size for a SQL Server Query? IN clause? Is there a Better Approach 참조). 내 개발 기계가 이상하게 600에 정확하게 멈췄다.

DECLARE @i int = 1, @q varchar(max); 

SET @q = 'WITH[0]AS(SELECT 1 AS c)' 

WHILE @i < 600 
BEGIN 
    SET @q = @q + ',[' + CONVERT(varchar, @i) + ']AS(SELECT * FROM[' + CONVERT(varchar, @i-1) + '])'; 
    SET @i = @i + 1; 
END; 

SET @q = @q + 'SELECT * FROM[' + CONVERT(varchar, @i-1) + ']'; 

EXEC (@q); 

프로덕션 서버에서이 문제를 테스트하는 방법에 대해 살펴 보겠습니다.

+3

내 dev 컴퓨터에서 1,000 개의 매우 간단한 CTE를 사용해 보았는데'이 쿼리를 실행하기 위해 리소스 풀 'default'에 시스템 메모리가 충분하지 않습니다 .' 왜 끝까지 테스트하지 않으시겠습니까? 테스트 한 쿼리는'; T0 (C) AS (SELECT 1), T1 (C) AS (SELECT * FROM T0), T2 (C) AS (SELECT * FROM T1),/* ... */T1000 (C) AS (SELECT * FROM T999) SELECT * FROM T1000' –

+0

제 질문은 열심히 프로그램 된 한도를 묻습니다. 내 dev 환경이 얼마나 멀리 갈 수 있는지 테스트하고 싶다면 그렇게했을 것입니다. 생산 하드웨어를 제어 할 수 없으므로 설정 한 한계를 알아야합니다. – Codesleuth

+2

글쎄, 특히 스펙이 확실하지 않은 환경에서 비슷한 스펙으로 테스트하고 메모리 오류 또는 '내부 오류 : 표현식 서비스 한계에 도달했습니다. 귀하의 질의에 잠재적으로 복잡한 표현이 있는지 살펴보고 단순화하려고하십시오. 그러면 모든 아이디어가 완전한 비 시동기라는 것을 분명히 알 수 있습니다. –

답변

0

일괄 처리에서 정의 할 수있는 비 재귀 CTE 수에 직접적인 상한선이없는 것 같습니다. 사용 가능한 자원 및 기타 적용 가능한 제한 사항에 의해서만 제한되어야합니다.

내가 연구하는 동안 나는 this이 내가 찾을 수있는 유일한 직접적인 대답입니다.

그러나 CTE의 최대 수는 the MSDN list of SQL server maximums이나 CTE 문서에 없습니다.

질문의 의견에 언급 된 마틴의 테스트는 제한 오류가 아닌 메모리 오류가 발생했기 때문에 이에 대한 특정 제한이 없음을 제안합니다. 나는 당신이 WHILE @i < 600을 사용하고 있기 때문에 당신의 시험이 정확히 600에 멈췄다는 것이 전혀 이상하지 않다고 생각합니다. 한도를 올리고 어떻게되는지 확인하십시오.

+0

600이 높았 기 때문에 리소스 오류가 발생했기 때문에 그 값에 붙여 넣기가 완전히 의도적 이었기 때문에 600이 거기에있었습니다. 업데이트 된 게시물 이후로 추가 테스트를 해본 결과, 리소스 이상으로 제한이 없다는 것이 맞다고 생각하게됩니다. 실제 테이블을 사용하는 쿼리를 작성 했으므로 실행 계획이 너무 커서로드되지 않았지만 600 이상이 실행되었습니다. 동일한 시스템에있었습니다. 아마 한도는 계획에 달려 있습니다 (깊이?) – Codesleuth

+0

아, 그 말이 맞습니다. 실행 계획이 SSMS에로드되지 않았다는 것을 의미한다고 생각하십니까? 그렇다면 SSMS 한도에 부딪 힐 수도 있습니다.하지만 나는 그것이 무엇인지 모릅니다. 아마 XML 최대?SSMS에서 QP를 XML로 표시 할 수는 있지만 기본 데이터 형식인지는 확실하지 않습니다. Sentry Plan Explorer와 같은 도구 또는 메타 데이터 개체를 사용하여 계획을 검토 할 수 있습니까? http://www.sqlsentry.com/plan-explorer/sql-server-query-view.asp –

관련 문제