2010-05-02 3 views
7

쿼리가 중단 될 수있는 독점적 인 비 -SQL DB를 사용하여 프로젝트 작업을 해왔으며 코드베이스에는 해당 functionnality가 사용되었고 완벽한 의미를 갖는 곳이 상당 부분있었습니다 (예 : 사용자에 의해 취소되는 장기 실행 쿼리 또는 더 최근의 쿼리가 발생하고 이전 쿼리가 사용되지 않는 경우 등) 이전에 이런 종류의 "인터럽트 된 쿼리"를 본 적이없고 실현할 수 있다고 생각했습니다. 좋은 질문 (몇 가지 질문이지만 모두 똑같은 것과 관련이 있습니다) :SQL : 쿼리 인터럽트

  • SQL 쿼리를 중단 할 수 있습니까?

  • 은 SQL 표준의이 부분입니까?

  • SQL 표준에 포함되지 않은 SQL 데이터베이스는 쿼리가 중단 될 수 있도록 허용합니다.

  • 더 이상 결과에 대해 신경 쓰지 않을 것이라는 것을 알게되는 DB 쿼리 (SQL 또는하지 않음)를 중단하는 것이 일반적입니까? (내가 작업 한 코드베이스에서 서버로드를 줄이는 데 도움이됩니다.)

답변

6

"중단됨"은 "종료됨"으로 대체되어야합니다. 인터럽트 개념은 나중에 쿼리를 다시 시작할 수 있다고 생각하기 때문에 혼란 스러울 수 있습니다.

SQL 표준은 실행중인 쿼리를 인터럽트하거나 종료하는 방법을 제공하지 않지만, 내가 아는 모든 DBMS는 KILL 명령 또는 유사한 것을 구현합니다. 예를 들어, MySQL에서 사용자는 SHOW [FULL] PROCESSLIST를 사용하여 실행중인 모든 쿼리 (및 해당 상태, 쿼리 ID 등)를 볼 수 있습니다. 그런 다음 KILL 권한이있는 사용자는 쿼리를 종료 할 수 있습니다.

대부분의 KILL은 쿼리가 너무 오래 실행되거나 다른 쿼리를 차단할 수 있기 때문에 발생합니다. 테이블에 인덱스가 없거나 디스크가 꽉 찼습니다. 결과 (예 : 사용자가 사이트 탐색을 취소 한 경우)는 종종 웹 서버 자체가 프로세스를 중단하고 따라서 쿼리 자체가 중단됩니다 (수동 또는 프로그래머 상호 작용이 필요 없음).

4

모든 RDBMS 액세스 계층 I ' 실행 쿼리를 비동기 적으로 취소하는 취소 방법을 제공합니다. 사용중인 데이터 액세스 기술 스택에 대한 설명서를 확인하십시오. .NET/ADO/JDBC는 '취소'방법을 제공합니다. ODBC - SQLCancel입니다. 분명히 기본 RDBMS 공급 업체 데이터 액세스 드라이버도이 방법을 구현해야합니다.

취소의 유용성 측면에서 나는 그것을 정기적으로 사용하는 모든 구성표를 비판하는 경향이 있습니다. 필자의 의견으로는 조정이나 디자인이 관리상의 필요성을 줄이는 경향이있다.

RDBMS의 내부, 트랜잭션 및 격리 스키마의 특성에 중요한 종속성이 있습니다. RDBMS가 낙관적 동시성 모델 (즉, 커밋이 본질적으로 무료)을 사용하는 경우 실행중인 쿼리를 취소하면 잠재적으로 값 비싼 롤백 작업이 수반 될 수 있습니다. 최악의 경우, 취소 시점까지 한 시간 동안 실행되는 쿼리는 롤백하는 데 한 시간이 걸릴 수 있습니다.