다음 쿼리 는 값이 0 또는 1 인 SUM
columnstore 테이블에 대해 창 을 표시하며 데이터 유형을 1500 total rows
오버플로합니다 INT
. 왜 이런 일이 발생합니까?
SELECT a, p, s, v, m, n,
SUM(CASE WHEN n IS NULL THEN 0 ELSE 1 END)
OVER (PARTITION BY s, v, a ORDER BY p) AS lastNonNullPartition
FROM (
SELECT a, p, s, v, m, n,
RANK() OVER (PARTITION BY v, s, a, p ORDER BY m) AS rank
FROM #t /* A columnstore table with 1,500 rows */
) x
WHERE x.rank = 1
--Msg 8115, Level 16, State 2, Line 1521
--Arithmetic overflow error converting expression to data type int.
전체 스크립트
완전히 포함 된 재생산 스크립트에 대해서는이 파일을 참조하십시오.
쿼리 계획
다음은 주석이 달린 추정 쿼리 계획입니다 (계획 에 붙여 넣기에 대한 전체 XML ).
성공적으로 실행되는 유사한 쿼리
다음 중 하나라도 수정하면 오류가 발생하지 않습니다.
8649
병렬 처리의 비용 임계 값에 관계없이 추적 플래그 를 사용 하여 병렬 계획을 선호9453
배치 모드를 비활성화 하려면 추적 플래그 를 사용하십시오.- 사용
COUNT
의 대신 집계 함수를SUM
기능 WHERE x.rank = 1
술어 제거
예를 들어이 쿼리는 다음과 같이 성공적으로 실행됩니다.
SELECT a, p, s, v, m, n,
SUM(CASE WHEN n IS NULL THEN 0 ELSE 1 END)
OVER (PARTITION BY s, v, a ORDER BY p) AS lastNonNullPartition
FROM (
SELECT a, p, s, v, m, n,
RANK() OVER (PARTITION BY v, s, a, p ORDER BY m) AS rank
FROM #t /* A columnstore table with 1,500 rows */
) x
WHERE x.rank = 1
OPTION (QUERYTRACEON 9453/* Disable batch mode */)