다음을 통해 공유


CHECKSUM(Transact-SQL)

적용 대상: SQL Server Azure SQL 데이터베이스 Azure SQL Managed Instance Azure Synapse Analytics Microsoft Fabric의 SQL 분석 엔드포인트 Microsoft Fabric의 웨어하우스

CHECKSUM 함수는 테이블의 행이나 식 목록에 대해 계산한 체크섬 값을 반환합니다. CHECKSUM을 사용하여 해시 인덱스를 작성합니다.

Transact-SQL 구문 표기 규칙

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 값을 반환하므로 문자열의 추가 문자 또는 체크섬 목록의 추가 데이터에 대한 해시에 영향을 주지 않습니다. 실제 문제:

  1. 체크섬이 숫자 문자열의 음수 서명을 무시합니다.
SELECT CHECKSUM(N'1'), CHECKSUM(N'-1');
  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)