My Job

2 articles
  1. 2012.12.06 How to debug SQL deadlocks?
  2. 2012.11.20 정규형

SQL: How to debug SQL deadlocks


What is a deadlock?


A deadlock occurs when two system server process IDs (SPIDs) are waiting for a resource and neither process can advance because the other process is preventing it from getting the resource. For example, Andrew holds a lock on table A and requests a lock on table B; Lindsay holds a lock on table B and requests a lock on table A.

The lock manager(Lock Monitor)Æs thread checks for deadlocks. When a lock managerÆs deadlock detection algorithm detects a deadlock, the lock manager chooses one of the SPIDs as a victim. The lock manager initiates a 1205 error message that is sent to the client, and the lock manager kills the SPID.

Transaction (Process ID %d) was deadlocked on {%Z} resources with another process and has been chosen as the deadlock victim. Rerun the transaction.

Killing the SPID frees the resources and allows the other SPID to continue. In a well-designed application, the front-end application should trap for the 1205 error, reconnect to SQL Server, and then re-submit the transaction. Although deadlocks can be minimized, they cannot be completely avoided. That is why the front-end application should be designed to handle deadlocks.


So what can cause deadlocks?

  1. Locks
  2. Worker threads
  3. Memory
  4. Parallel query execution-related resources
  5. Multiple Active Result Sets (MARS) resources.

How to debug deadlocks


Turn on deadlock trace


          DBCC TRACEON(1204,1222)


This will enable deadlock tracing for all existing connetions and new. You can check out KB832524 for more details. Trace flag 1204 reports deadlock information formatted by each node involved in the deadlock. Trace flag 1222 formats deadlock information, first by processes and then by resources.

Use SQL Profiler to trace deadlock events and get the resource ID of the table or index under contention. The steps to do this are:

  1. Start SQL profiler
  2. On the Trace Properties dialog box, on the General tab, check Save to file and specify a path to save the trace
  3. Click the Events tab, only add Locks\Lock:deadlock and Locks\Lock:deadlock chain
  4. Click the Data columns tab, add DatabaseID, IndexID, ObjectID

This trace will record all deadlocks on this SQL Server instance, along with the ID of the source table of contention. To translate the database id and object id into names (although DatabaseName and ObjectName are selectable columns, the data is not always presented in the trace), you can do


           SELECT database_name(DatabaseID)


           SELECT object_name(ObjectID)


Use SQL Profiler to trace batch statements or RPC statements, to trace which statement causes the deadlock. The restriction of this is that if the repro is far between and you have a busy system, the trace file will grow too large to be useful.

You can also run following query to check which process is being blocked.


            SELECT * FROM sys.sysprocesses WHERE blocked <> 0

           

            Get the SPID from blocked column

           

            DBCC inputbuffer (SPID)

 

            sp_who2

           

            sp_lock2


You can also use SP_LOCK2 to receive detailed locking view.


'My Job > MSSQL' 카테고리의 다른 글

정규형  (0) 2012.11.20

정규형

My Job/MSSQL 2012. 11. 20. 20:23

1정규형 (1NF)

- 각 행의 데이터들은 원자적 값을 가져야 하며 각 행은 기본 키를 가져야 한다.

- 원자적 열은 그 열에 같은 타입의 데이터를 여러 개 가질 수 없거나 (예를 들어 취미생활
이라는 열에 데이터가 독서, 영화보기, 축구처럼), 같은 타입의 데이터를 여러 열에 가질 수 없는 것 (예를 들어 똑 같은 취미생활이라는 타입의 열이 취미생활1’, ‘취미생활2’ 의 두 개의 열로 구성)을 말한다.

- 기본 키는 NULL이 될 수 없으며(NOT NULL로 선언) 레코드가 삽입될 때 값이 있어야 하고,
간결하며, 값이 변경되지 않아야 한다.

 

2정규형 (2NF)

- 1정규형 (1NF)을 만족해야 한다.

- 부분적 함수 종속(의존)이 없다.

- 부분적 함수 종속(의존)이란 합성키 사용시에 발성하며, 키가 아닌 열이 합성키 일부에
의존할 때 발생한다.

- 부분적 함수 종속을 없애고 싶다면 테이블 안의 모든 열이 기본 키의 일부 이거나,
하나의 열로 된 기본 키를 가진다.

- 부분적 함수 종속의 예

ID

생년월일

이름

생일

주소

1

1979-1-1

홍길동

1-1

방배동

2

1980-12-1

이순신

12-1

서초동

ID와 생년월일 2개의 합성키로 이루어진 테이블에서 생년월일()의 값이 변경되면
생일 값도 종속되어 변경되어야 하므로 키가 아닌 열이 합성키 일부에 의존한다.

 

 

3정규형 (3NF)

- 이행적 함수 종속이 없다.

- 이행적 함수 종속은 키가 아닌 열이 다른 키가 아닌 열과 관련될 때
, 키가 아닌 열이 변할 때, 다른 키가 아닌 열이 변경되면 이행적 함수 종속이다.

- 이행적 함수 종속의 예

ID

생년월일

이름

생일

주소

1

1979-1-1

홍길동

1-1

방배동

2

1980-12-1

이순신

12-1

서초동

    
2정규형(2NF)을 만족하기 위하여 ID column만 기본 키로 해 놓았지만, 키가 아닌
생년월일 값이 변경되면 키가 아닌 생일 값도 바뀌는 이행적 함수 종속이 발생한다.
이럴 경우 생일 column이나, 생년월일 column을 따로 빼내어 다른 테이블로 만들어
참조키 설정 후 연결하게 되면 제3정규형을 만족하는 테이블을 얻을 수 있다.

 

'My Job > MSSQL' 카테고리의 다른 글

How to debug SQL deadlocks?  (0) 2012.12.06