쿼리 알림 발생 시점 이해
쿼리 알림의 개념은 알림 메시지가 도착할 때까지 응용 프로그램이 캐시된 데이터에 의존할 수 있다는 점입니다. 캐시된 데이터를 신뢰할 수 있는지 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이 사용되면 알림 메시지를 생성하지 않고 구독이 제거됩니다.