쿼리 알림 발생 시점 이해
쿼리 알림의 개념은 알림 메시지가 도착할 때까지 응용 프로그램이 캐시된 데이터에 의존할 수 있다는 점입니다. 캐시된 데이터를 신뢰할 수 있는지 SQL Server에서 더 이상 보장할 수 없는 경우 SQL Server는 알림 메시지를 보냅니다. SQL Server는 다음 이벤트 중 하나가 발생할 때 구독에 대한 쿼리 알림을 보냅니다.
쿼리 결과에 포함된 행이 변경되었습니다.
구독이 만료됩니다.
서버를 다시 시작합니다.
쿼리 알림 구독을 만들 수 없습니다(예: SELECT 문이 알림에 대한 쿼리 만들기에 지정된 요구 사항에 맞지 않는 경우).
서버 부하가 높습니다.
구독이 의존하는 개체가 삭제되거나 변경됩니다.
SQL Server는 데이터를 변경하지 않는 이벤트에 대한 응답이나 쿼리 결과에 실제 영향을 주지 않는 변경 사항에 대한 응답으로 쿼리 알림을 생성할 수도 있습니다. 예를 들어 UPDATE 문으로 쿼리에 의해 반환되는 행 중 하나가 변경되면 행에 대한 업데이트로 쿼리 결과의 열이 변경되지 않은 경우에도 알림이 발생할 수 있습니다. 쿼리 알림은 데이터를 캐시하는 응용 프로그램의 전반적인 성능 향상 목표를 지원하기 위해 디자인되었습니다. 서버 부하가 높은 경우 SQL Server는 쿼리의 결과가 변경되는지 여부를 확인하는 작업을 수행하는 대신 구독에 대해 쿼리 알림 메시지를 생성할 수도 있습니다.
알림 구독은 데이터베이스 엔진이 구독 요청에 있는 각 문을 실행하기 전에 발생합니다. 따라서 명령에 쿼리와 쿼리에 의해 반환되는 데이터를 변경하는 문이 모두 포함된 경우 응용 프로그램은 해당 구독 요청이 포함된 명령이 완료되기 전에 알림 메시지를 받을 수 있습니다.
각 구독에는 최소 수명이 지정되어 있습니다. 최소 수명 이후에는 SQL Server가 구독을 제거하고 알림 메시지를 만듭니다. 이 메시지는 알림이 더 이상 사용되지 않으며 SQL Server가 더 이상 쿼리의 변경 내용을 추적하지 않음을 응용 프로그램에 알려 줍니다.
SQL Server가 시작할 때 서버는 데이터베이스에 있는 모든 쿼리 알림 구독에 대해 쿼리 알림 메시지를 자동으로 만듭니다. 이렇게 하면 응용 프로그램에서 캐시된 데이터를 즉시 새로 고칠 수 있으며 각 알림에 있는 쿼리를 처리하지 않고 SQL Server를 시작할 수 있습니다. 데이터베이스를 삭제하면 데이터베이스 엔진이 해당 데이터베이스에 등록된 모든 구독에 대해 쿼리 알림 메시지를 생성합니다.
알림 구독 요청이 쿼리 알림에 대한 요구 사항에 맞지 않는 쿼리와 함께 전송되면 데이터베이스가 즉시 쿼리 알림 메시지를 생성합니다. 이 메시지는 쿼리가 구독에 대한 요구 사항에 맞지 않음을 응용 프로그램에 알려 줍니다. 또한 SQL Server는 쿼리에 대한 변경 내용을 추적할 수 없기 때문에 응용 프로그램은 즉시 쿼리의 결과를 오래된 것으로 고려해야 합니다.
[!참고]
ADO.NET의 SqlDependency와 같은 종속성 개체에 의해 관리되는 쿼리 알림 구독은 응용 프로그램과 데이터베이스 간의 연결이 끊어진 경우에도 이벤트를 생성하지 않습니다. 하지만 응용 프로그램이 다시 한 번 데이터베이스에 연결하면 데이터베이스에 연결하지 못한 동안 생성된 모든 알림이 응용 프로그램에 즉시 보내집니다.
명령이 알림 메시지를 생성할 때 알림 메시지를 만들고 보내는 프로세스는 알림 메시지를 생성하는 트랜잭션 내에서 문의 일부로 발생합니다. 데이터베이스 엔진이 알림 메시지를 성공적으로 만들고 보낼 수 없는 경우 명령이 실패하고 SQL Server 오류 로그에 이 오류가 기록됩니다. 알림 메시지가 생성되면 데이터베이스 엔진에서 이 알림 메시지를 성공적으로 생성했는지 여부에 관계없이 데이터베이스 엔진이 알림 구독을 제거합니다.
[!참고]
구독을 만든 데이터베이스 사용자 계정이 삭제 또는 해제되거나 구독이 포함된 데이터베이스가 연결되거나 구독을 제거하는 데 KILL QUERY NOTIFICATION SUBSCRIPTION이 사용되면 알림 메시지를 생성하지 않고 구독이 제거됩니다.