2012-03-01 4 views
1

나는 스케줄을위한 타임 슬롯을 추적하는 테이블을 가지고있다. 2 명의 사용자가 동일한 시간대에 약속을 예약하지 않도록 "잠금 장치"의 기록입니다.SQL 인덱스를 사용하지 않을 때

프로덕션에서 교착 상태 문제가 발생했으며이 테이블에 5 개의 인덱스가 있음을 발견했습니다.

이 테이블은 자주 읽고 쓰지만 거의 수백 개의 행을 갖지는 않습니다.

5 개의 색인이 지나치게 과장된 것처럼 보입니다. 1000 행 이하의 테이블에 대해서는 인덱스가 필요 없다고 생각합니다.

그 가정에서 나는 맞습니까?

TIA

+0

교착 상태 문제가 색인과 관련이 없습니다. 그룹 별 및 집계 함수는주의하십시오. – danihp

+1

"데드락 문제가 인덱스와 관련이 없습니다"- 완전히 정확하지 않음 ... '올바른'인덱스로 인해 종종 블로킹이 적어 질 수 있습니다. –

+0

@MitchWheat - 어떤 상황에서 인덱스가 데드락으로 이어질 수 있습니까? – MatBailie

답변

2

빠른 답변 : 비교적 작은 테이블 (일반적으로 100,000 개 미만의 행)에서 기본 키의 고유 인덱스를 제외한 모든 인덱스를 삭제하십시오.

0

색인은 잠금에 영향을주지 않습니다. 모든 쓰기 작업은 인덱스도 변경해야합니다. 성능에 문제가있을 수 있지만 잠금에 영향을 미치지 않습니다. 테이블의 행 수가 1000 개인 경우 인덱스를 삭제할 수 있습니다. log1000 이상의 반복은 1000 행을 훨씬 넘는 반복이 아닙니다.

This table is read and written frequently but it would rarely have more than a few hundred rows it. 

행 잠금은 일반적인 상황입니다. 교착 상태가 때때로 발생할 수도 있습니다. DB 공급자가 교착 상태를 처리합니까? 그것 자체를 공개해야합니다. 아마도 잠금은 A, B 순서로 행을 갱신하려고 시도하고, 두 번째 트랜잭션은 B, A 순서로 행을 갱신합니다.

+0

이 테이블은 예약 된 리소스에 응용 프로그램 수준 잠금을 사용하고 있습니다. 그래서 나는 location + datetime에 대한 색인을 가지고있다. 2 명의 사용자가 동일한 약속 시간을두고 경쟁하고 있고 색인이있는 경우 - 나는 그것이 충돌의 원인이 될 것으로 생각합니다. 내 감각은 5 개의 인덱스가 가능한 동시성 문제가 더 자주 발생하도록 쓰기 작업을 느리게하고 있다는 것입니다. – sproketboy

+0

5 개의 인덱스가있는 쓰기 작업은 인덱스가없는 작업보다 속도가 느립니다. 이론적으로 DB가 잠금을 해제하면 데드 록의 양을 줄일 수 있습니다. 그러나 나는 그것이 사실이라고 생각하지 않는다. 인덱스를 삭제하고 테스트 해보십시오. – Anton

관련 문제