2010-06-09 3 views

답변

19

with (rowlock)은 행 범위에서 잠금을 유지해야한다는 데이터베이스에 지시하는 힌트입니다. 즉, 데이터베이스가 블록 또는 테이블 범위에 잠금을 확대하는 것을 피할 수 있습니다.

단일 또는 소수 행만 쿼리에 의해 영향을 받으면 쿼리에서 삭제되지 않는 행을 잠그지 않도록 잠금을 유지하기 위해 힌트를 사용합니다. 그러면 다른 쿼리가 삭제가 완료 될 때까지 기다리지 않고 관련없는 행을 동시에 읽을 수 있습니다.

행을 많이 삭제하는 쿼리에서이 쿼리를 사용하면 데이터베이스가보다 효율적으로 잠금을 더 큰 범위로 확대하는 것을 방지하기 때문에 성능이 저하 될 수 있습니다.

일반적으로 데이터베이스에 어떤 종류의 잠금을 사용할 지 알기 때문에 이러한 힌트를 쿼리에 추가 할 필요가 없습니다. 데이터베이스가 잘못된 결정을 내렸고 쿼리에 그러한 힌트를 추가해야하기 때문에 성능 문제가 발생하는 경우에만 해당됩니다.

+0

루프에서 한 번에 2000 개의 행을 삭제하는 delete 문에서 사용 하시겠습니까? – RPS

+0

데이터베이스가 스스로 결정을 내릴 수 있어야합니다. 좋은 이유가있는 경우 에스컬레이션합니다. 내가 데이터베이스에없는 것을 알고있는 것처럼 좋은 이유가 없다면, 나는 그것을 과도하게 다스리는 것을 피할 것이다. – Brandon

+0

@Brandon : 예, 좋은 지적입니다. 일반적으로 데이터베이스는 프로그래머가 할 수있는 것보다 훨씬 잘 사용할 잠금을 알고 있습니다. – Guffa

4

노 걸이는주의해서 사용해야합니다 쿼리 힌트 :

DELETE TOP (@count) 
FROM ProductInfo WITH (ROWLOCK) 
WHERE ProductId = @productId_for_del; 

때 그냥 일을해야을 모든 쿼리 힌트).

생략하면 정확한 동작을 유지할 수 있으며 행간 잠금 만 사용한다는 보장은 없으므로 힌트가 필요합니다. 자물쇠 경합 기회에 대한 깊이있는 지식이 없다면 옵티마이 저가 가능한 최상의 잠금 전략을 고를 것이며 이러한 것들은 일반적으로 결정하기 위해 데이터베이스 엔진에 맡기는 것이 가장 좋습니다.

ROWLOCK은 SQL이 영향을받는 행만 잠글 수 있으며 삭제를 수행 할 때 데이터가 저장된 테이블 또는 페이지의 전체 페이지를 잠글 수 없음을 의미합니다. 이는 삭제가 실행되는 것과 동시에 테이블에서 읽는 다른 사용자에게만 영향을 미칩니다.

테이블 잠금을 사용하면 삭제가 완료 될 때까지 테이블에 대한 모든 쿼리가 대기하게되고 행 잠금은 특정 행의 읽기만 선택하여 대기하게됩니다.

N을 여러 행으로 삭제하면 어떤 경우에도 테이블을 잠글 가능성이 큽니다.

관련 문제