CHECKSUM(Transact-SQL)
적용 대상: SQL Server Azure SQL 데이터베이스 Azure SQL Managed Instance Azure Synapse Analytics Microsoft Fabric의 SQL 분석 엔드포인트 Microsoft Fabric의 웨어하우스
CHECKSUM
함수는 테이블의 행이나 식 목록에 대해 계산한 체크섬 값을 반환합니다. CHECKSUM
을 사용하여 해시 인덱스를 작성합니다.
Syntax
CHECKSUM ( * | expression [ ,...n ] )
참고
이 구문은 Azure Synapse Analytics의 서버리스 SQL 풀에서 지원되지 않습니다.
인수
*
이 인수는 체크섬 계산이 모든 테이블 열에 적용됨을 지정합니다. CHECKSUM
은 비교할 수 없는 데이터 형식인 열이 있는 경우에 오류를 반환합니다. 비교할 수 없는 데이터 형식에는 다음이 포함됩니다.
- cursor
- image
- ntext
- text
- XML
비교할 수 없는 다른 데이터 형식으로는 앞의 데이터 형식을 기준 형식으로 하는 sql_variant가 있습니다.
expression
비교할 수 없는 데이터 형식을 제외한 모든 형식의 식입니다.
반환 형식
int
설명
CHECKSUM
은 인수 목록에 대해 체크섬이라고 하는 해시 값을 계산합니다. 이 해시 값을 사용하여 해시 인덱스를 작성합니다. CHECKSUM
함수가 열 인수인 경우 결과는 해시 인덱스이며 인덱스는 계산된 CHECKSUM
값을 통해 작성됩니다. 이 결과는 열에 대한 등가 검색에 사용할 수 있습니다.
CHECKSUM
함수는 해시 함수 속성을 만족합니다. 즉 두 식 목록에 적용된 CHECKSUM
은 두 목록의 해당 요소가 같은 데이터 형식을 갖고 해당하는 요소가 같음(=) 연산자를 사용하여 비교했을 때 동일하면 동일한 값을 반환합니다. 지정된 형식의 Null 값은 CHECKSUM
함수에서는 동일한 것으로 비교되게 정의됩니다. 식 목록에 있는 값 중 하나 이상이 변경되면 목록 체크섬도 변경될 수 있습니다. 그러나 이는 보장되지 않습니다.
따라서 값이 변경되었는지 여부를 검색하려면 애플리케이션에서 가끔 누락된 변경을 허용할 수 있는 경우에만 CHECKSUM
을 사용하는 것이 좋습니다. 그렇지 않으면 HASHBYTES
를 대신 사용하는 것이 좋습니다. 지정된 MD5 해시 알고리즘을 사용하면 HASHBYTES
에서 두 개의 다른 입력에 대해 같은 결과를 반환할 가능성이 CHECKSUM
에 비해 훨씬 낮습니다.
CHECKSUM
은 nchar 및 nvarchar 대시 문자(N'-'
또는 nchar(45)
)를 무시합니다. 따라서 유일한 차이점이 대시인 두 문자열에서는 해시 충돌이 보장됩니다. 즉, Select checksum(nchar(45));
및 Select checksum(N'-');
는 둘 다 0
값을 반환하므로 문자열의 추가 문자 또는 체크섬 목록의 추가 데이터에 대한 해시에 영향을 주지 않습니다.
실제 문제:
- 체크섬이 숫자 문자열의 음수 서명을 무시합니다.
SELECT CHECKSUM(N'1'), CHECKSUM(N'-1');
- 체크섬 비교는 코드가 저장 프로시저 정의에서 주석 처리되었다는 것을 검색할 수 없습니다.
CREATE PROCEDURE Checksum_Test AS
BEGIN
RAISERROR('Error Raised',18,1);
RETURN 1;
END
GO
-- get checksum for original proc definition.
SELECT
checksum(definition),
definition
FROM sys.sql_modules
WHERE object_id = object_id('Checksum_Test');
GO
-- comment out a line of code in the proc.
ALTER PROCEDURE Checksum_Test AS
BEGIN
--RAISERROR('Error Raised',18,1);
RETURN 1;
END
GO
-- get checksum for altered proc definition. Note the definition text now includes the -- comment dashes.
SELECT
checksum(definition),
definition
FROM sys.sql_modules
WHERE object_id = object_id('Checksum_Test');
DROP PROCEDURE Checksum_Test
CHECKSUM
은 nchar 및 nvarchar 문자열에서 후행 공백을 트리밍합니다. 효과는 무시된 대시의 문제와 동일합니다.
식 순서는 계산된 CHECKSUM
값에 영향을 미칩니다. CHECKSUM(*)
에 사용되는 열의 순서는 테이블 또는 뷰 정의에 지정된 열의 순서입니다. 계산 열도 마찬가지입니다.
CHECKSUM
값은 데이터 정렬에 따라 달라집니다. 같은 값이 다른 데이터 정렬로 저장된 경우 다른 CHECKSUM
값이 반환됩니다.
CHECKSUM ()
은 고유한 결과를 보장하지 않습니다.
예제
이 예에서는 CHECKSUM
를 사용하여 해시 인덱스를 작성합니다.
해시 인덱스를 구성하기 위해 첫 번째 예에서는 계산된 체크섬 열을 인덱스하려는 테이블에 추가합니다. 그런 다음, 체크섬 열에서 인덱스를 작성합니다.
-- Create a checksum index.
SET ARITHABORT ON;
USE AdventureWorks2022;
GO
ALTER TABLE Production.Product
ADD cs_Pname AS CHECKSUM(Name);
GO
CREATE INDEX Pname_index ON Production.Product (cs_Pname);
GO
이 예에서는 체크섬 인덱스를 해시 인덱스로 사용하는 것을 보여 줍니다. 이렇게 하면 인덱싱할 열이 긴 문자 열일 때 인덱싱 속도를 높일 수 있습니다. 또한 등가 검색에도 체크섬 인덱스를 사용할 수 있습니다.
/*Use the index in a SELECT query. Add a second search
condition to catch stray cases where checksums match,
but the values are not the same.*/
SELECT *
FROM Production.Product
WHERE CHECKSUM(N'Bearing Ball') = cs_Pname
AND Name = N'Bearing Ball';
GO
계산된 열에 인덱스를 만들면 체크섬 열이 만들어지고 ProductName
값의 변경 사항이 체크섬 열에 전파됩니다. 또는 인덱싱할 열에 직접 인덱스를 작성할 수 있습니다. 그러나 긴 키 값의 경우 기본 인덱스가 체크섬 인덱스처럼 수행되지 않을 수 있습니다.
참고 항목
CHECKSUM_AGG(Transact-SQL)
HASHBYTES(Transact-SQL)
BINARY_CHECKSUM(Transact-SQL)