블로그 이미지
보미아빠

카테고리

보미아빠, 석이 (532)
밥벌이 (16)
싸이클 (1)
일상 (1)
Total
Today
Yesterday

달력

« » 2025.11
1
2 3 4 5 6 7 8
9 10 11 12 13 14 15
16 17 18 19 20 21 22
23 24 25 26 27 28 29
30

공지사항

최근에 올라온 글

스터디 중 송혁(MSSQL PFE)의 필드 경험 하나를 블로그에 담아둔다.

아래 현상이 일어나는 원인은 잘 모르겠다. 돈있고 힘있는 분은 escalation 해 차근 차근 설명 좀 해주세요~

 

 

SQL Server 의 Affinity Mask 를 설정해 SQL Instance 가 총 16개 core중 8개의 core 를 사용하게 설정 했을경우 (다른 경우도 마찬가지 이다) Serial 하게 열심히 돌아야 하는 쿼리를 동작 시키면 하나의 core 만 열심히 사용한다.

 

Affinity Mask 가 설정되지 않았을 경우나, Network 로 Bind 시킬 경우(Soft NUMA TCP/IP 로 여러개의 코어를 할당함) 선택된 코어 중 일량(load factor) 이 낮은 곳으로 옮겨 다시며 실행한다. 이는 같은 코어에서 실행하는 것이 해당 작업은 더 빠르게 끝날 수 있지만 전체 시스템 성능(효율)을 좋게 하기위해 한가한 core Pool 내에서 옮겨 다니며 실행 하도록 한 원래 아키텍처에 위배되는 행위가 아닐까 생각된다. (이런경우 난 이해가지 않으면 버그 스럽다 혹은 개발자의 한계가 이까지 인갑다 라고 생각 한다. -_-+)

 

다른 OS 스케줄러도 거의 다 비슷하게 동작한다. 로드를 보고 이쪽 저쪽 옮겨 다니며 실행. 그런데, SQL Server 의 경우 Affinity Mask 를 설정 했을때 Serial 한 쿼리를 동작 시키면 하나의 코어먄 100% 다 쓴다.

 

참고로 Affinity Mask 는 향후 없어진다고 한다.

위 현상은 SQL Server 2005 이상에서 비슷 할 것으로 보이고, 우린 SQL Server 2008R2 에서 테스트 했다.

 

 

affinity mask 설정 후 다음을 쿼리 해보면, manual 로 바뀌어 있는것을 볼 수 있다.

select affinity_type_desc from sys.dm_os_sys_info

 

 

 

Posted by 보미아빠
, |

몇 몇 경우에 min max 함수를 사용 할 때와 order by top 1 을 사용할 때의 성능이 틀릴 때가 있다.

이 경우 workaround 로 top 1 을 사용하면 된다.

 

Fix 된 버그

http://support.microsoft.com/kb/973255/en-us

Hotfix 적용 후 4199 TF 를 enable 해줘야 한다.

 

파티션 테이블에서의 문제

http://connect.microsoft.com/SQLServer/feedback/details/240968/partition-table-using-min-max-functions-and-top-n-index-selection-and-performance

 

이거 만든사람 귀차니스트가 아닐까...... row_numner()

http://cafe.naver.com/sqlmvp/3160

Posted by 보미아빠
, |

deadlock

카테고리 없음 / 2012. 8. 25. 17:00

DeadLock MSDN

http://msdn.microsoft.com/en-us/library/ms178104(SQL.105).aspx

(마지막 그림은 화살표가 잘못 그려져 있다. babo msdn....-_-)

 

 

Request wait 는 spid -> resource

owner 는 spid <- resource 방향으로 그릴것  

 

내가본 가장 좋은 글들

http://blogs.msdn.com/bartd/archive/2006/09/09/747119.aspx
http://blogs.msdn.com/bartd/archive/2006/09/13/751343.aspx
http://blogs.msdn.com/bartd/archive/2006/09/25/770928.aspx

 

Work-around

http://msdn.microsoft.com/en-us/library/aa175791(v=sql.80).aspx

정상적인 경우만.....

 

DECLARE @Tries tinyint
SET @Tries = 1
WHILE @Tries <= 3
BEGIN
  BEGIN TRANSACTION
  BEGIN TRY
    INSERT Authors VALUES
      (@au_id, @au_lname, '', '', '', '', '',
'11111', 0)
    WAITFOR DELAY '00:00:05'
    SELECT * FROM authors WHERE au_lname LIKE 'Test%'
    COMMIT
    BREAK
  END TRY
  BEGIN CATCH
    SELECT ERROR_NUMBER() AS ErrorNumber
    ROLLBACK
    SET @Tries = @Tries + 1
    CONTINUE
  END CATCH;
END

 

특이현상들

1. 리소스 없는 Deadlock

리소스 없는 deadlock 이 발생하면 row lock 이 가능한지 인덱스 상황을 점검하는것이 좋다.

row lock 이 불가능한 상황에서 여러 세션에서 update 를 치면 리소스가 없는 deadlock 이 발생하는 현상이 발생하게 된다.

 

CREATE TABLE TBLX
(IDX INT )

CREATE CLUSTERED INDEX CL_TBLX ON TBLX (IDX)

 

SELECT ALLOW_ROW_LOCKS, ALLOW_PAGE_LOCKS, *
  FROM SYS.INDEXES
 WHERE OBJECT_ID = OBJECT_ID ('TBLX')
 
EXEC SP_INDEXOPTION TBLX, DISALLOWROWLOCKS, 1;

 

SELECT ALLOW_ROW_LOCKS, ALLOW_PAGE_LOCKS, *
  FROM SYS.INDEXES
 WHERE OBJECT_ID = OBJECT_ID ('TBLX')
 
-- ALTER TABLE DBO.TBLX SET (LOCK_ESCALATION = DISABLE )

2. 중첩Tran에 의한 DeadLock

dbcc traceon (1204, 1222, -1) 옵션으로 추적 후 그린것

http://www.sqler.com/511218

 

예전에 정리한 내글

http://cafe.naver.com/sqlmvp/465

 

sp_lock2

http://sqlsql.tistory.com/8

 




클러스터 인덱스와 비클러스터 인덱스 업데이트 deadlock 제거 


drop table tblx 

go


WITH TEMP AS 

(

SELECT TOP 10000

    CAST(ROW_NUMBER() OVER (ORDER BY (SELECT 1)) AS INT) IDX 

  , 'PNAME_'+RIGHT(REPLICATE('0',7)+CAST(CAST(ABS(CHECKSUM(NEWID())) % 1000 AS INT) AS VARCHAR(10)),7)+CHAR(ASCII('A') + ABS(CHECKSUM(NEWID()))%10) PRODUCTNAME

  FROM SYS.OBJECTS A1

 CROSS JOIN SYS.OBJECTS A2

 CROSS JOIN SYS.OBJECTS A3

 CROSS JOIN SYS.OBJECTS A4

 CROSS JOIN SYS.OBJECTS A5

SELECT IDX, PRODUCTNAME, CAST(SUBSTRING(PRODUCTNAME,7,7) AS INT) PRODUCTID

  , CAST(ABS(CHECKSUM(NEWID())) % 100 AS INT) SHOPID

  , CAST(ABS(CHECKSUM(NEWID())) % 100 AS INT) PRICE

  , cast ('a' as char(3000)) d

  , DATEADD(MINUTE, CAST(ABS(CHECKSUM(NEWID())) % 20000 AS INT) * -1, GETDATE()) INSERTTIME

  INTO TBLX 

  FROM TEMP 

GO


select * from tblx 


create clustered index cl_tblx on tblx (idx) 

create nonclustered index nc_tblx_01 on tblx (shopid) 



update a

 set a.inserttime = getdate()

from (

 select idx 

 from tblx with (nolock) 

 where shopid = 61

 ) b 

 join tblx a 

 on a.idx = b.idx 

 

Posted by 보미아빠
, |

최근에 달린 댓글

최근에 받은 트랙백

글 보관함