http://ko.sunningview.com/article/5325  퍼옴.

메모리 구조를 보장하기 위해 래치 래치 일관성 경량 동기화 메커니즘 SQL Server 엔진은 무엇입니까. 이러한 인덱스, 데이터 페이지 (예 : 비 잎 수준 인덱스 페이지 등) 내부 구조 등.

< 래치는

래치는 메모리 구조를 보장하기 위해 일관성있는 경량 동기화 메커니즘 SQL Server 엔진이 무엇인지입니다. 이러한 인덱스, 데이터 페이지 (예 : 비 잎 수준 인덱스 페이지 등) 내부 구조 등. SQL Server는 I / O 래치 보호가 버퍼 풀 페이지에로드되어 있지 않은, 사용 비 버퍼 래치 보호 메모리 내부 구조와, 버퍼 래치 보호 페이지 버퍼 풀을 ​​사용합니다.
  1. 버퍼 래치 : 작업자 스레드 전에 페이지가 버퍼 풀에 액세스 할 때, 먼저이 페이지에 래치 받아야합니다. 주로 사용자 개체 및 시스템 개체 페이지를 보호하기 위해 사용된다. 근로자가 요구하는 액세스 페이지가 버퍼 풀에없는, 그것은 풀에 해당하는 페이지를로드 스토리지 시스템에서 비동기 I / O를 보낼 것입니다 : _ *
  2. I / O를 래치 형 성능 PAGELATCH을 기다립니다. 이 과정은, 해당 페이지의 I / O 래치 얻을 호환 래치 풀로 동일한 페이지를로드 다른 스레드를 방지한다. 유형 성능 PAGEIOLATCH을 기다립니다 _ *
  3. 비 버퍼 래치 : 버퍼 풀 페이지 외부에서 내부 메모리 구조를 보호하기 위해 사용. 유형 성능있는 Latch_XX을 기다립니다.
래치 인보다는 ​​전체 트랜잭션을 유지하는 로크로만 대응 페이지 또는 내부 구조의 동작 동안 유지. 예를 들어, WITH NOLOCK 테이블을 조회하여. 쿼리 프로세스는 테이블의 모든 수준에서 공유 잠금을 획득하지 않지만 데이터 페이지 전에 읽을 수 있습니다, 당신은 얻을이 페이지를 래치 할 필요가있다.
=
래치 모드
래치 잠금 장치와 함께, 그것은 SQL 서버 엔진 동시성 제어의 일부입니다. 높은 동시성의 경우 래치하는 것은 피할 수없는 경쟁 환경. SQL 서버는 다른 마무리 대상 리소스를 액세스하기 위해 래치 대상 리소스를 해제 할 때까지 기다릴 호환 개의 래치에게 요청 스레드를 강제로 호환 모드를 사용한다.
래치 모드 5 종류가 있습니다 :
  • KP - 래치 구조 기준에 의해 파괴되지 않도록 유지 SH
  • - 필요한 경우 공유 래치는 데이터 페이지를 읽고
  • UP - 업데이트 래치 데이터 변경 페이지가 필요할 때
  • EX - 필요가 데이터 페이지를 작성하는 경우 독점 래치 전용 모드가 주로 사용됩니다
  • DT - 데이터가 필요
래치 모드 호환성에 의해 참조 될 때 래치 구조적 손상을 파괴, Y는 N을 나타내고, 호환 나타냅니다 호환되지 않습니다 :
KP SH UP EX DT
Y Y Y < /td> Y N
Y Y Y N N
Y Y N < /td> N N
Y N N N N
N N N < /td> N은 N
& LT/div>
  • 래치 경합에 미치는 영향 요인
요소 SLEEP_TASK
논리적 CPU 어떤 멀티 코어의 과도한 사용을 고백 래치 경합 시스템이 나타납니다. 래치 경합은 시스템의 허용 수준, 사용 16 이상의 코어의 대부분을 초과합니다.
건축 설계 및 액세스 모드 크기 B 트리 깊이, 인덱스, 밀도 및 페이지 디자인, 데이터 액세스 모드 동작이 과도 래치 경합으로 이어질 가능성이 높다
응용 프로그램 계층 동시성 높은 래치 경합 애플리케이션 층의 가장 높은 동시 요청을 동반한다.
레이아웃 데이터베이스 논리 파일 논리 파일 배치함으로써 경쟁 래치의 정도에 영향을 미치는 레이아웃, (등 PFS, GAM, SGAM, IAM, 등) 분배 장치 구조에 영향을 미친다. 이것의 가장 유명한 예는 다음과 같습니다 자주 PFS 페이지의 tempdb의 경쟁의 결과로 작성하고 임시 테​​이블을 삭제할 때
I / O 서브 시스템의 성능 PAGEIOLATCH는 SQL 서버의 I / O 서브 시스템을 기다리는 많은 의미 기다립니다 .
더 얕은 B 트리 많은 수의. 페이지 분할을 수행 할 때, 우리는 모든 수준에서 B- 트리 EX 래치를 수정 SH 래치를 얻고 데이터의 모든 페이지에서 얻을 필요가있다. 삽입의 경우에 발생하는 B- 트리 루트 페이지 분할로 매우 높은 동시성뿐만 아니라, 매우 가능성이 리드를 삭제합니다. 루트 페이지 분할 비 버퍼 래치로 이어질 것입니다 : ACCESS_METHODS_HBOT_VIRTUAL_ROOT을.
진단 래치 경합
주요 진단 방법과 도구는 다음과 같습니다 :
  • 관측 성능 모니터 CPU 사용률 및 SQL Server 대기 시간이 있는지 두 개의 관련 결정합니다.
  • 은 DMV 래치 특정 유형의 자원 경쟁에 의해 발생하기.
  • 특정 비 버퍼 래치 경합 진단, 또한 SQL 서버 프로세스의 메모리 덤프 파일을 획득하고 분석하기 위해 함께 윈도우 디버깅 툴을 결합해야.
래치 경합 정상적인 활동이고, 래치 경합이 발생하는 자원에 대한 액세스를위한 타겟 및 기다리는 시간이 시스템 처리량에 영향을 미치지 만하면 해로운 것으로 믿어졌다. 경합의 적당한 정도를 확인하기 위해, 함께 성능, 시스템 스루풋 처리, IO 및 CPU 자원 분석의 조합을 필요로한다.
[
래치 경합으로 시간이 애플리케이션 성능에 미치는 영향
1. 페이지 래치 평균 대기 시간의 성장과 증가 시스템 처리량을 처리 계약 을 측정 기다립니다. 페이지 래치 평균 대기 시간이 시스템 처리량을 증가시키고, 특히 성장 버퍼 래치 대기 시간을 일관된 성장을 관리하는 저장 시스템의 응답 시간을 초과하는 경우
, 현재 대기중인 작업을 확인할 sys.dm_os_waiting_tasks 사용해야한다. 또한 관찰 시스템 활동 및 부하 특성의 조합을 필요로한다. 일반 공정 진단 :
  • 사용 "쿼리 세션 ID 발주 sys.dm_os_waiting_tasks"스크립트 또는 "계산 대기 시간 동안"스크립트는 현재 작업하고 평균 대기 시간 상황 래치 대기를 관찰합니다.
  • 사용 "QueryBufferDescriptorsToDetermineObjectsCausingLatch"스크립트가 경합 (인덱스 및 테이블)의 발생 위치를 결정합니다.
  • MSSQL이 % 인스턴스 이름 % StatisticsPage 래치 WaitsAverage 대기 시간 또는은 sys.dm_os_wait_stats가 관찰 된 평균 대기 시간 페이지 래치 방문 기다립니다 관찰 할 성능 카운터를 사용.
(o.name), i.name, 총 대기 시간의 비즈니스 피크 대기 시간 래치 비율 (2).
래치는 비율이 하중 증가에 따라 선형 적으로 증가 대기 시간을 경우, 경합이 성능에 영향을 래치 할 수있다, 우리는 최적화 할 필요가있다. 하여 대기 통계 성능 수는 페이지와 비 페이지 래치가 상황을 기다려야 관찰했다. 그런 다음 CPURAMIONetwork 처리량 관련 카운터와 비교. 예를 들어, 거래 / 분파 및 배치 요청 / 초를 사용하여 자원 활용도를 측정합니다. 이 마지막 인스턴스 시작 (또는 비워) 이후 기록이기 때문에
은 sys.dm_os_wait_stats는 데이터를 기다린 후, 기다리는 대기 시간의 모든 유형을 포함하지. 또한 DBCC SQLPERF을 할 수 있습니다 ( '은 sys.dm_os_wait_stats는', '클리어') 수동으로 비 웁니다. 시간은 sys.dm_os_wait_stats 데이터를 취할 피크 사업하기 전에, 다음, 비즈니스에서 피크를 취할 차이를 계산합니다.
-
3. 증가없이 시스템 처리량 처리 (또는 감소), 응용 프로그램이로드가 무거운, SQL 서버에서 사용할 수있는 CPU 증가하면서 .
높은 동시성 및 멀티 CPU 시스템에서, 클러스터 된 인덱스가 자려 동시 삽입 유사 지금 등의 종류가 발생할 것이다 : CPU는 수를 증가 및 대기 래치 페이지가 증가하면서 시스템 스루풋이 저하된다.
4. 부하의 성장을 적용 할 때 CPU 사용률이 증가하지 않았다.
CPU 사용률 성장 나타내는 SQL 서버 리소스 (래치 경합 성능)을 기다리고 애플리케이션로드와의 동시가 없을 때.
으로
쿼리 현재 래치
현재 실시간 대기 정보 볼 수 있습니다 다음 쿼리. * 및 PAGEIOLATCH_ * 버퍼 래치가 기다리고 PAGELATCH_하는 wait_type.
SELECT wt.session_id, wt.wait_type
, er.last_wait_type 그대로 last_wait_type
, wt.wait_duration_ms
, wt.blocking_session_id , wt.blocking_exec_context_id, resource_description
FROM sys.dm_os_waiting_tasks 중량
가입 바로 sys.dm_exec_sessions ES ON wt.session_id = < /span> es.session_id
가입 sys.dm_exec_requests 어 ON wt.session_id = er.session_id
여기서 es.is_user_process es.is_user_process OBJECT_ID '
1 와 wt.wait_type )) 클러스터 < /span> '
ORDER ' ' ORDER 에 o.type

wt.wait_duration_ms

DESC
OBJECT_ID '
쿼리 열을 리턴으로 설명 :
설명 의 session_id
세션 ID 작업이 속한 Wait_type
현재 대기 유형 Last_wait_type
마지막 대기 유형은 Wait_duration_ms
대기 시간 합계 (MS)의 대기 유형을 기다립니다 Blocking_session_id
현재 차단되는 세션 ID Blocking_exec_context_id
현재 발생 한다, '버퍼'순서 ID
Resource_description
특정 대기
다음 쿼리는 반환 비 버퍼 래치 정보 을 선택 * sys.dm_os_latch_stats를에서 latch_class & LT의 리소스 작업 wait_time_ms에 의해 DESC
는 열 지침을 반환 :
설명 대기 시간 Latch_class
래치 유형 Waiting_requests_count
현재 래치 유형이 발생 < /div> Wait_time_ms
현재 래치 유형 합 대기 시간을 발생
Max_wait_time_ms
현재 래치 형 발생한 가장 긴
=
래치 일반적인 시나리오 경합을 <기다리는 동안/div>
데이터 마지막​​ 페이지 삽입 경합
, 그것은 경쟁을 래치 될 수 있습니다 . 이 시나리오에서
테이블은 거의 아카이브 삭제 및 업데이트 작업 할 때를 제외하고 적용되지/div>
인덱스에 데이터를 삽입 :
1 B- 트리를 검색, 새로운 페이지로 이동하여 저장하는 것입니다
이 페이지 플러스 전용 래치 (PAGELATCH_EX)에 2 ,. 다른 작업이 동시에이 페이지를 수정하지 마십시오. 모든 비 리프 페이지 플러스 공유 래치 (PAGELATCH_SH).
때때로 페이지가 직접 비 리프 페이지에 영향을 개로 나누어 독점 래치, 비 리프 페이지에.
3.이 행이 변경되었음을 나타냅니다 로그 파일에 기록을 작성
4. 페이지에 새 행을 작성하고 더러운 페이지로 표시 5. 릴리스 모든 래치. 线程获取到页上排他Latch。假设A获取EX Latch,则B就需要等待。则B就会在 sys.dm_os_waiting_tasks表现出等待类型为PAGELATCH_EX的等待。
, 새로운 라인이 페이지는 가득 찰 때까지, B- 트리의 마지막 페이지에 삽입됩니다. 높은 동시로드, 그것은 B- 트리가 가장 오른쪽 페이지 경합이다 집계 및 비 클러스터형 인덱스로 이어질 것입니다. 일반적으로이 메인 페이지와 밀도 인덱스를 삽입하는 동시성 경합이 발생합니다. sys.dm_db_index_operational_stats으로 상황은 라스 페이지 경합와 B 트리 리프 페이지에게 중앙 아프리카 래치 경합을 관찰 할 수있다.
예를 들어
동시에 스레드와 스레드 B는 새 행 (예 : 1999 등) Last (마지막)로 삽입합니다. 논리적으로, 둘 다 동시에 해당 행 수준의 행 마지막 페이지 단독 잠금을 얻을 수 있습니다. 그러나, 메모리의 무결성을 유지하기 위해
  • 하나는 하나의
  • 스레드 페이지에 배타적 래치를 획득 할 수있다. 이 EX 래치를 얻기 가정, 다음 B 기다릴 필요가있다. 그런 다음 B가 sys.dm_os_waiting_tasks에 전시된다 타입 PAGELATCH_EX 대기를 기다립니다. 작은 테이블의 임의 삽입에 리드
  • (32)
이 클러스터되지 않은 인덱스 래치 경합
임시 큐 구조는 일반적으로이 시나리오를 발생으로 테이블을 사용합니다. 다음 조건 (EX와 SH 포함) 래치 경합이 발생할 수 있습니다 사항 :
높은 동시 INSERT, DELETE, UPDATE 및 Operations (작업) 페이지 밀도, 좁은 라인 테이블의 행의 수는 적게, 그래서 B-나무도 등급 2-3 인덱스 깊이 얕은입니다. 페이지 분할을 일으킬 가능성이 INSERT의 임의의 실행의 를 필터링 ( o.name), i.name, 지수는 스크립트 다음 테이블의 깊이를 관찰 할 수있다 : 선택 o.name 으로 - 모든 인덱스 키 범위에 기존 데이터 분포를 사용하는 열은 테이블 ] , i.name 으로
SomeInt [ 인덱스 ] HashValue INDEXPROPERTY 으로 변경
OBJECT_ID 테이블 ' indexDepth + [ INDEXPROPERTY 차 TINYINT INDEXPROPERTY OBJECT_ID (o.name), i.name, ' isClustered
( SomeInt 등 깊이, 변경 리프 수준을 계산하지 않습니다보고 클러스터 된 인덱스 깊이 테이블 [ 행 ] , i.origFillFactor 차 모드 2 이동 CPU 코어는 TransactionId 번호 제 키 인덱스로 모듈로 사용하여, 삽입 작업이보다 균일하게 분산 된 테이블로된다. ( [ 행 ]
, i.origFillFactor ( BIGINT [ FILLFACTOR ] 그대로 의 경우 INT INDEXPROPERTY
( INT (o.name), i.name 널 (null) isClustered ] <그 속도를 대량로드 기술을 사용하는 것이 좋습니다span> 다음 때 '
1 (32) 다음 NULL ' - o.id 때 i.id
0 기능 [ 12 -
클러스터되지 않은 latch_contention_table 다른 )
와 통계
' 끝 - 표 입력 할 때 < /span> IX_Transaction_ID
SYSINDEXES에서 나는 가입 sysobjects의 O hash_col ' = '
여기서 ) = ( ' U '와 ') 파티션 구성표 )), ( (o.name), i.name, NOT isHypothetical '
) 의 사용을 필요로한다. 제 키의 지수는 일반적으로 선택된 열 또는 해시 열을 산출하고, 다른 열을 형성하도록 함께 결합 된 후 일부 열을 식별한다. 유일한 ID 열 값이 너무 과도 키 간격의 결과는 데이터 테이블의 물리적 구조를 만들기 때문에 열 열화를 이용한 해시 연산이 우수하다. 이하 해시 계산 열 인덱스 키 범위가 있지만, 래치 경합 INSERT 부하를 분산시키기 위해 감소된다하더라도, 충분하고있다. 예를 들어, 판매 시스템은하면 해시 값 모듈로서 CPU 코어 STORE_ID 번호를 사용할 수있다. 0 ' 가상 인덱스 ') INDEXPROPERTY OBJECT_ID ' isStatistics
' =
0
  • o.name
래치 PFS 경합 페이지
이 그것은
병목
상황을 할당에 속한다. PFS 레코드 공간 이용 데이터 페이지. 바이트 (바이트) 페이지의 PFS 페이지의 사용을 나타냅니다을 사용합니다. PFS 페이지 정도로 모든 8088 개의 데이터 페이지가 PFS 페이지가있을 것이다, 8088 데이터 페이지를 나타낼 수있다. 두 번째 페이지의 데이터 파일 PFS 페이지이다 (된 pageid = 2). 새 개체 또는 데이터 조작을위한 공간을 할당해야하는 경우
, SQL Server는 SH 래치를 사용할 단순한 대상 페이지가 있는지 여부를 확인 PFS 페이지에 사용할 수 있습니다. 존재하는 경우, 그것은 PFS 래치를 얻고, 해당 페이지 공간 사용량 정보를 업데이트한다. 유사한 프로세스는 SAM, GSAM 페이지에 발생합니다. 멀티 CPU 시스템, 파일 그룹, 몇 데이터 파일, 과도한 PFS 페이지 요청에, 그 래치 경합을 초래할 수있다. tempdb의 가장자리 장면은 몇 가지 비교적 흔한 것입니다. PFS 나 SGAM 페이지에 나타나면
Tempdb를 더 PATHLATCH_UP 대기, 당신은 래치 경합을 제거하기 위해 다음과 같은 방법을 수행 할 수 있습니다
임시 데이터베이스 데이터 파일은 코어 = CPU 번호의 수를 증가시키기 위해 < strong> 추적 플래그 (TF) 1118 사용
래치 Tempdb를 테이블 반환 ​​함수이 때문에 PFS와 래치 경합이 같은 발생
충돌로 이어집니다. 모든 다중 문 테이블 반환 ​​함수는 항상 래치 경합의 원인, 쿼리에 다중 문 테이블 반환 ​​함수를 생성하고 테이블을 삭제하는 많은 변수를 탄생 될 수있는 다수의 참조 테이블 변수를 생성하고 삭제할 호출 .
다른 모드가 경합을 래치 해결 은행 ATM 시스템에서 ATM_ID 장면의 사용을 고려하여 처리합니다 INSERT 작업 테이블은 모든 주요 범위로 배포됩니다. 동시에, 사용자는 단지 하나의 ATM을 사용할 수 있기 때문이다. 이러한 장면은 Checkout_ID STORE_ID 열 또는 열을 사용하여 고려할 수, 시스템을 판매 할 예정이다. 이 방법은 고유 지수

이 방법은, 인덱스 조각화를 증가 스캔 성능의 범위를 감소시킬 것이다. 또한, 이러한 절 새로운 인덱스 구조에 따라 조정해야 WHERE 같이, 애플리케이션 아키텍처를 수정할 필요가있다. 예 : 트랜잭션 테이블에서 32 코어 시스템에서 원래의 테이블 구조 : 생성 테이블 표
( 왼쪽 는 TransactionId BIGINT 없습니다
널 (null) ( 아이디 INT 하지

널 (null)
에 대한 < /span> INT
없습니다 널 (null) )
표 추가

제약
pk_table1 < /span> 키

클러스터 (는 TransactionId, 아이디) 이동 1. 모든 데이터가 사용자 ID 첫 번째 키를 사용하기 위해 인덱스와 방법, 작업을 삽입하기 위해 배포됩니다 페이지. 주 : 인덱스 변경, 모든 선택이 방정식 ID와는 TransactionId를 지정해야합니다 WHERE합니다. 테이블
표 VALUES 는 TransactionId BIGINT 없습니다
널 (null) 표 아이디 INT 없습니다
없습니다
널 (null)
0 INT
없습니다 널 (null) )
이동 표 추가

제약
pk_table1 키

클러스터 (사용자 ID,는 TransactionId)
테이블 널 (null) 는 TransactionId 없습니다
int 아이디
(

널 (null) 1
SomeInt 없습니다
) 이동 - ( 표 추가 [ 2 ] TINYINT AS ALTER < /span> ( CONVERT 9 [] ] 3 ABS [< /span>
는 TransactionId ) %
( ))) PERSISTED NOT
변경 테이블 표
추가
제약
pk_table1
  表分区能减少Latch争用。使用计算列对表进行Hash分区,一般的步骤:
  1. 클러스터
  2. (HashValue,는 TransactionId, 아이디)
이동
첫 번째 키 인덱스로 GUID 열을 사용하여
이 나는 난 아주 많이 여기의 무결성을 유지 플러스, 그것을 분석하고 싶지 않아, 동의하지 않습니다. 레디 스 제품을로드, 서브 테이블, 파티션을 배포 또는 사용하는 등 극단적 인 방법을 필요로 할만큼 심각한 동시로드 및 래치 경합 GUID는 더 나은 방법입니다. 테이블 해시 파티션의 계산 열을 사용하여 테이블 파티셔닝은 래치 경합을 줄일 수 있습니다. 테이블 해시 파티션의 계산 열, 일반적인 단계를 사용하여
새 또는 지구를 호스팅 기존의 파일 그룹을 사용하여 새 파일 그룹을 사용하는 경우, 당신은 데이터 입출력 서브 시스템 최적화 및 파일 그룹을 고려할 필요가 문서의 합리적 분배. INSERT 부하 비율이 높은 경우, CPU 코어의 1/4의 데이터 파일 그룹 추천 수 (또는 1/2와 같은 경우, 혹은 등전위가 될 수있다).
표는 N 개의 파티션으로 분할되어 파티션 함수를 만들 사용. N 값은 스텝 데이터 파일의 수와 동일하다. 파일 그룹에 결합 파티션 구성표를 만들 파티션 기능을 사용하고 해시 열의 SMALLINT 또는 TINYINT 유형을 추가 한 다음 해당 해시 분포 값 계산 (예를 들어 HashBytes 값 모듈에 대한 또는 Binary_Checksum 값을). 샘플 코드 : 파티션 방식과 기능을 생성, CPU 코어의 수를이 정렬 1 : 1까지 에 ( 코어 컴퓨터 ) 16 코어 시스템에 정렬이 아래에 대한 CREATE 있도록 파티션 pf_hash16
] (, ) , 범위 , , , (, , , , , , , 9, 4 , 5 , 6 , 7 , 8 , , ]
, 10 , 11 , , 13 [, (14) (15) CREATE ( 를 ps_hash16 ] < /span>

그대로 파티션
[ pf_hash16
] 모든 ] ( [ ALL_DATA 을 속도를 대량로드 기술을 사용하는 것이 좋습니다 ) -
(이 오프라인 작업입니다) 기존 테이블에 계산 된 열을 추가 ALTER ( DBO AS 0 [, ] 추가 [ HashValue [ ( CONVERT ( [
TINYINT ] ABS
(binary_checksum (Create the index on the new partitioning scheme
[ ] % (16) CREATE IX_Transaction_ID )))
PERSISTED CLUSTERED NULL - 새로운 분할 방식에 인덱스를 생성 ] < /span> UNIQUE ([ INDEX [, [ ON )
DBO ]
.
[
latch_contention_table
]
(
  • [
  • T_ID
  • ]

ASC

,

[

HashValue

]


Posted by Sumin Family

1. SQL Error Log 발생한 에러 

2012-11-27 17:16:55.590 spid3477     Error: 7886, Severity: 20, State: 1.2012-11-27 17:16:55.590 spid3477     A read operation on a large object failed while sending data to the client. A common cause for this is if the application is running in READ UNCOMMITTED isolation level. This connection will be terminated.

 


[그림 1-1]


- 어떤 쿼리(프로시저) 에서 발생하는 에러 인지를 찾기 에러가 주로 발생하는 시간 주기적 (15분 ~ 20분 사이) 발생하여 
   발생 후 10분 뒤부터 10분 동안 sp_trace_create 를 사용하여  Trace 수집

-  SQL Error Log 시간대의 TRC 파일 비교 분석 하여 에러 원인 분석 



- 원인 및 해결 방법  


[그림 1-2]

이 프로저의 에서 호출하는 1개의 ROW  Image 데이터 형식으로 라는 marshaled_data 필드를 가지고 있다. [그림 1-1] 601 에러가 먼저 발생 우 Error: 7886, Severity: 20, State: 1 가 발생한것을 알수 있다. [그림 1-2] SET TRANSACTION ISOLATION LEVEL READ UNCOMMITTED; 으로 인해 테이블 접근시 NOLOCK 로 커밋되지 않는 읽기르 우선 데이터를 읽어서 LOB 영역의 marshaled_data 데이터를 읽으려고 했으나 실제 marshaled_data 필드에 접근해 보니 일부 데이터의 위치가 변경되어 데이터를 찾지 못하게 되어  클라이언트에 데이터를 보내는 동안 큰 개체에서 읽기 작업이 실패 하게 되었고 클라이언트와 연결이 종료 된것으로 에러가 SQL LOG 에 찍히게 된것이다. 

해결 방법은 프로시저에 적용 하였던 SET TRANSACTION ISOLATION LEVEL READ UNCOMMITTED; 를 제거 후 해결 되었다. 



Posted by Sumin Family

2009-11-22 03:20:39.810       로그온   오류: 17806, 심각도: 20, 상태: 2.

2009-11-22 03:20:39.810       로그온   SSPI handshake failed with error code 0x80090311 while establishing a connection with integrated security; the connection has been closed. [클라이언트: IP]


 

배포자에서 위와 같은 에러

네트워크 문제로

Active Directory서버(Domain Controller라 부름)와의 통신상에 문제가 발생하였을 경우 생성됨

Posted by Sumin Family





SQL서버 성능카운터 활용을 위한 팁

 


원문링크 : http://www.sql-server-performance.com/performance_monitor_counters_sql_server.asp

번역 : 종균 (jkkim@techdata.co.kr)

 
 


SQL서버에서 과도한 I/O의 원인 중 하나는 페이지 분할 입니다페이지 split은 인덱스나 데이터 페이지가 꽉 찰 경우에 발생하며현재 페이지와 새로이 할당되는 페이지 사이에서 분할이 이루어 집니다.  가끔 발생하는 페이지 분할은 정상입니다만과도한 페이지 분할은 과도한 디스크 I/O를 유발하게 되며이는 느린 성능을 야기합니다.

SQL서버가 과도한 페이지 분할을 일으키고 있는지를 찾기 원한다면 성능카운터에서 SQL Server Access Methods 개체의 Page Splits/Sec 항목을 모니터 하십시오만일 과도한 페이지 분할이 발생하고 있다면인덱스의 채우기 비율을 높게 설정하시는걸 고려하십시오채우기 비율을 높게 설정하시면 데이터가 가득 차거나페이지 분할이 발생하기 전에 데이터 페이지에 보다 더 많은 여유 공간이 있으므로페이지 분할을 감소시킬 수 있습니다

높은 Page Splits/sec 은 무얼 의미하는가이것은 운영하는 시스템의 I/O하부 시스템에 따라 다르므로 이에 대한 간단이 답을 할 수 없습니다그러나 만일 당신이 평상시에 디스크 I/O의 성능 문제가 발생하고이 카운터 값이 100을 초과한다면채우기 비율을 높여서 성능이 호전 되는지 그렇지 않은지 실험해 보는 것도 좋을 것 입니다.

 

*****

물리적인 메모리를 SQL서버 Data캐시에 얼마나 할당되었는지 알고 싶다면SQL Server Buffer Manager Object: Cache Size (pages) 항목을 모니터링 하십시오이 수치는 페이지 수로 표시되므로이 값에 8K(8192 bytes)를 곱하면, Data캐시로 사용되고 있는 총 메모리의 사용량을 알 수 있습니다.

일반적으로이 수치는 서버의 총 메모리 량에 근접해야 합니다. SQL서버로 운영하는 시스템에서 OS커널이나, SQL서버 그리고 기타 유틸리티 프로그램이 사용하는 메모리 량을 최소화 하십시오.

만일 Data캐시 용도로 할당된 메모리 양이 여러분이 생각하는 것 보다 훨씬 작다면왜 그런지 원인을 찾으셔야 합니다아마도, SQL서버가 메모리를 동적으로 할당하도록 설정하지 않고대신에 뜻하지 않게 SQL서버가 적은 메모리를 사용하게 구성 하셨을 겁니다. SQL서버가 가용할 수 있는 Data캐시의 총량은 SQL서버 성능에 아주 큰 영향을 미치기 때문에 원인이 무엇이든 간에 여러분은 해결방안을 찾아야 합니다.

실제로는, SQL서버가 메모리가 부족한지 아닌지를 알기 위해 보다 많은 카운터들이 존재하고더 효율적이기 때문에 저는 이러한 카운터(SQL Server Buffer Manager Object: Cache Size (pages))를 모니터 하는데 많은 시간을 사용하지 않습니다.  (그래서 어쩌라고.ㅜㅜ)

 

*****

SQL서버가 얼마나 바쁜지 알기 위해서SQLServer: SQL Statistics: Batch Requests/Sec 카운터를 모니터 하십시오이 카운터는 초당 SQL서버가 받는 배치 요청 수를 측정하고일반적으로 서버의 CPU들이 얼마나 바쁜지 나타냅니다말하자면초당 1000배치가 넘어서면, SQL서버가 매우 바쁘다는 것을 나타내며, CPU병목 현상이 아직 나타나지 않고 있다면조만간 CPU병목 현상이 나타날 것임을 알 수 있습니다물론 이 수치는 상대적인 것이며여러분의 하드웨어가 고 사양이라면보다 더 많은 초당 배치요청 수를 커버할 수 있을 것입니다.

네트워크 병목의 관점에서 보자면, 100Mbps 네트워크 카드는 초당 3000 배치 요청을 처리 할 수 있습니다만일 네트워크 병목이 심한 서버를 운영하고 계시다면네트워크 카드를 2개이상 늘리거나, 1Gbps 네트워크 카드로 교체 할 필요가 있을 것입니다.

몇몇 DBA들은 전체 SQL서버활동량을 측정하기 위해서 SQLServer: Databases: Transaction/Sec: _Total 카운터를 모니터 하는데이는 좋은 방법이 아닙니다. Transaction/Sec 카운터는 전체 활동량이 아닌 한 트랜잭션의 내부활동을 측정하며왜곡된 값을 나타냅니다대신에, SQL서버의 전체 활동량을 측정하는 SQLServer: SQL Statistics: Batch Requests/Sec 카운터를 사용하시기 바랍니다

 

*****

TSQL코드의 컴파일은 SQL서버의 일반적인 동작입니다그러나이 컴파일이 CPU와 다른 리소스들을 많이 잡아 먹기 때문에, SQL서버는 가능한 많은 실행계획을 캐시에 저장해서 실행계획이 컴파일 되지 않고 재사용되도록 시도합니다(실행계획은 컴파일이 발생할 때 생성됩니다). 보다 더 많은 실행계획이 재 사용 되어지면서버에 대한 부담은 더 적어지게 되며전체적인 성능은 더욱 더 향상 됩니다.

SQL서버가 얼마나 많은 컴파일을 하고 있는지 확인 하려면SQLServer: SQL Statistics: SQL Compilations/Sec 카운터를 모니터 하십시오여러분이 기대하시는 것처럼이 카운터는 초당 얼마나 많은 컴파일이 SQL서버에 의해서 실행되었는지를 측정합니다.

말하자면이 카운터의 수치가 초당 100을 넘어서면불필요한 컴파일 오버헤드를 경험하고 계신 것 입니다이러한 높은 수치는 여러분의 서버가 매우 바쁨을 나타내거나불필요한 컴파일들이 실행되고 있다고 볼 수 있겠습니다예를 들어오브젝트의 스키마가 변경되거나병렬로 실행계획이 잡혀있던 것이 직렬로 실행되어야 하거나통계가 다시 계산되었다거나 하는 등의 이유로 SQL서버로부터 재 컴파일 하라는 지시를 받았을 수도 있습니다어떤 경우에는불필요한 컴파일을 줄이기 위해서 여러분의 노력이 필요할 수 도 있습니다. (역주잘 아시듯이, adhoc 쿼리를 저장프로시져로 만들면 컴파일 이슈가 없어지죠)

만약여러분의 서버가 초당 100회 이상의 컴파일을 수행한다면이 원인이 여러분이 조절할 수 있는 것인지 아닌지 찾기 위해 애 쓰셔야 합니다너무 많은 컴파일은 SQL서버의 성능에 악영향을 끼칩니다.

 

*****

SQLServer: Databases: Log Flushes/sec 카운터는 초당 플러쉬 된 로그 수를 나타냅니다이 카운터는 데이터베이스 별로 측정되거나단일 SQL서버의 전체 데이터베이스에 대한 값으로 측정 될 수 있습니다.

로그 플러쉬란 무엇일까요이해를 쉽게 하기 위해서 예를 들어 설명 하는 게  좋을 것 같습니다. 10개의 INSERT명령이 있는 트랜잭션을 시작한다고 가정하겠습니다트랜잭션이 시작되고그리고첫 번째 INSERT가 실행되고새 데이터가 데이터 페이지로 삽입 되어질 때필수적으로 동시에 두 가지의 일이 발생합니다버퍼캐시의 데이터페이지는 새로이 삽입된 데이터로 변경됩니다그리고 이 단일 INSERT명령에 대한 적당한 로그용 데이터가 로그캐시에 쓰여집니다이 과정은 트랜잭션이 완료 될 때까지 계속 됩니다이때로그캐시에 기록된 트랜잭션을 위한 로그 데이터는 즉시 로그파일에 기록됩니다그러나 버퍼캐시에 있는 데이터는 다음 체크포인트 프로세스가 실행되기 전까지 버퍼캐시에 머무르게 됩니다그리고그때 데이터베이스는 새로이 삽입된 행으로 업데이트 됩니다.

여러분은 로그캐시에 대해서 한번도 들어보지 못했을지도 모릅니다이것은 SQL서버가 로그파일에 쓰여질 데이터를 기록하는 메모리의 한 영역입니다.  로그캐시의 목적은 트랜잭션이 커밋 되기 전에 특정상황이 발생하여 롤백 해야 하는 상황에서 트랜잭션을 롤백 하는 용도로 사용되기 때문에 매우 중요합니다그러나트랜잭션이 완료되면 (완료되면 절대 롤백 되지 않음), 로그 캐시는 즉시 물리적인 로그파일로 플러시 됩니다이것이 정상적인 절차입니다. SELECT쿼리는 데이터를 수정하지도 않고 트랜잭션을 생성하지도 않고로그 플러시를 발생하게 하지도 않음을 명심 하십시오.

본질적으로로그캐시에 있는 데이터가 물리적인 로그파일로 쓰여질 때 하나의 로그 플러시가 발생합니다따라서하나의 트랜잭션이 완료될 때마다로그 플러시는 발생하며많은 수의 로그 플러시 발생은 SQL서버로부터 수행되는 많은 수의 트랜잭션과 관련이 있습니다그리고짐작하시는 것처럼 로그 플러시(얼마나 많은 데이터가 로크 캐시로부터 디스크에 기록 되어졌는가의 크기는 트랜잭션에 따라 다릅니다이 내용이 도움이 되었나요?

우리가 디스크 I/O 병목현상을 격 고 있고그 원인을 확신하지 못하고 있다고 가정합시다디스크 I/O에 대한 병목을 해결하기 위한 하나의 방법은 Log Flushes/sec 카운터 데이터를 수집하고이 과정을 처리하는데 얼마나 바쁜지 보는 것입니다여러분의 서버에 많은 트랜잭션이 발생하고 있다며로그 플러시 양은 당연히 많을 것입니다따라서 이 카운터 항목으로 보는 값은 트랜잭션을 발생하는 활동 형 쿼리가 얼마나 바쁜가에 따라 서버마다 다양할 것입니다이 카운터 정보로써 여러분은 초당 발생하는 로그 플러시 수가 운영하는 서버에서 예상되는 트랜잭션의 수 보다 확연하게 높은가에 대한 상황 판단에 도움을 줄 것이다.

예를 들어매일 1,000,000행을 한 테이블로 삽입하는 작업을 한다고 가정합시다이 행들이 삽입되어질 수 있는 방법은 다양합니다첫째각 행은 따로따로 삽입되어 질 수 있습니다각 INSERT는 단일 트랜잭션 내부에 감싸집니다둘째모든 INSERTS는 단일 트랜잭션 내에서 수행되어 질 수 있습니다마지막으로, INSERTs 1 1,000,000사이의 어딘가에 여러 개의 트랜잭션으로 나누어 질 수 있습니다각 형태의 처리는 다르며, SQL서버와 초당 플러시 되는 로그 수에 매우 다른 영향을 미칩니다더구나프로세스가 멀티 트랜잭션으로 처리되고 있는데단일 트랜잭션으로 처리되고 있다고 착각할 수 도 있다많은 사람들이 단일 프로세스를 단일 트랜잭션으로 생각하고 있는 경향이 있습니다.

첫째의 경우에서만일 1,000,000행이 1,000,000개의 트랜잭션으로 삽입되어진다면, 1,000,000번의 로그 플러시가 발생할 것입니다그러나두 번째 경우에는단일 트랜잭션에서 1,000,000행이 삽입되어 질 것이고단지 하나의 로그 플러시가 발생할 것입니다그리고세 번째  경우 에는 플러시 되는 로그의 수는 트랜잭션의 수와 같을 것입니다명백히로그 플러시의 크기는 1,000,000트랜잭션이 1트랜잭션보다 훨씬 클 것입니다그러나대개의 경우 성능의 관점에서 여기서 언급한 내용은 그다지 중요하지 않습니다.

어떤 옵션이 가장 좋은가요모든 경우에서많은 디스크 I/O를 유발할 것입니다. 1,000,000행을 핸들링 할 경우에는 I/O양을 줄일 묘안이 없습니다그러나하나 혹은 적은 수의 트랜잭션을 사용함으로써 로그 플러시 양을 많이 줄일 수 있을 것이고이는 디스크 I/O양을 줄이게 되어, I/O병목 감소와 성능을 높여줄 것입니다.

우리는 두 가지 포인트를 배웠습니다첫째는여러분이 플러시 되는 로그 양을 가능한 많이 줄이길 원할 것이라는 것과둘째여러분의 서버에서 발생하는 트랜잭션의 수를 줄이는 것입니다.

 

*****

SQL서버를 사용하는 많은 수의 사용자는 성능에 영향을 미치기 때문에여러분은 SQL Server General Statistics Object: User Connections 카운터에 관심을 가질것입니다이 카운터는 사용자 수가 아닌, SQL서버에 현재 연결된 사용자 연결 수를 나타냅니다

이 수치를 해석할 때하나의 단일 사용자는 여러 개의 연결들로 열릴 수 있음을 유념하십시오그리고 또한여러 명의 사람이 하나의 단일 사용자 연결을 공유할 수 도 있습니다이 수가 실제 사용자수를 나타낸다고 가정하지 마십시오대신에서버가 얼마나 바쁜가에 대한 상대적 척도로 사용하십시오여러 시간에 걸쳐서 이 수치를 모니터 해보시면서버가 많이 사용되고 있는지적게 사용되고 있는지 느낄 수 있을 것 입니다.

 

*****

만약 여러분들의 데이터베이스들이 데드락 문제로 괴로워하고 있다면SQL Server Locks Object: Number of Deadlocks/sec 카운터를 통해서 추적할 수 있습니다그러나이 값이 상대적으로 높지 않다면이 값은 초단위로 측정되기 때문에 여러분은 더 많이 보기 원할 것입니다그리고눈에 띄게 보여지기 위해서는 다량의 데드락이 있어야 합니다. (ㅜㅜ)

그러나여전히 이 카운터는 여러분이 데드락 문제를 가지고 있는지 확인하기 위해서 가치있는 항목입니다차라리데드락을 추적하기 위해서 프로필러를 이용하십시오이는 보다 상세한 정보를 제공할 것입니다데드락 문제를 발견하기 위해서 Number of Deadlocks/sec 카운터를 활용하시고좀 더 세부적인 분석을 위해서 프로필러를 사용하십시오.

 

*****

만약에사용자들이 트랜잭션의 완료를 위한 대기시간 때문에 불만을 나타낸다면여러분은 개체 잠금이 이 문제가 되고 있는지 찾고 싶을 것 입니다문제점을 찾기 위해서SQL Server Locks Object: Average Wait Time (ms) 카운터를 사용하십시오이 카운터는 database, extent, key, page, RID, table의 다양한 잠금에 대한 평균 대기 시간 정보를 측정합니다.

DBA로써여러분은 평균 대기 시간이 얼마 정도까지 허용될 수 있는지 결정해야 합니다한가지 방법으로써개별 잠금 종류에 대해서 장시간 동안 이 카운터 항목을 모니터 하시고각 잠금 별 평균을 파악하시는 겁니다그리고 그 평균값을 참고 자료로 활용 하시는 거죠예를 들어, RID의 평균 잠금 대기시간이 500ms 라면, 500보다 큰 대기시간을 가지는 개체들은 , 잠재적인 문제점을 가지고 있다고 판단할 수 있을 것입니다특히 500보다 훨씬 크거나장시간 동안 연장되는 개체들은 더 쉽게 판단할 수 있습니다.

여러분이 트랜잭션 지연에 의한 단일 혹은 다양한 종류의 잠금을 확인 할 수 있다면어떤 트랜잭션들이 잠금의 원인이 되었는지 확인할 수 있는지 알기 위해서 조사하길 원할 것 입니다.

 

*****

그런데 가끔 인덱스 탐색보다 테이블 스캔이 빠른 경우에일반적으로 적은 테이블 스캔이 보다 많은 테이블 스캔 보다 좋다여러분의 서버에서 얼마나 많은 테이블 스캔이 발생하는지 알아보기 위해서SQL Server Access Methods Object: Full Scans/sec 카운터를 사용하십시오.이 카운터는 단일 데이터베이스가 아닌 전체 서버에 대한 값이라는 사실을 염두에 두셔야 합니다이 카운터 값으로 알게 될 사실 하나는 가끔씩 예측이 가능한 스캔 형태를 나타낸다는 것 입니다대부분의 경우에 이 값들은 SQL서버가 내부적으로 사용하는 것 들입니다.

여러분의 응용프로그램에서 나타나는 불규칙적인 테이블 스캔들을 파악하길 원하실 것입니다과도한 테이블 스캔이 발생될지를 고려하기 위해서 프로필러 데이터를 수집하고 인덱스 튜닝 마법사를 통해서어떤 것이 원인이 되는지 결정 할 수 있게 도움을 받을 수 있습니다그리고 몇몇 인덱스를 추가함으로써 테이블 스캔을 줄일 수 있을 것 입니다물론 SQL서버는 이 작업을 훌륭하게 수행할 것이고더 효율적이라면인덱스를 사용하는 것 대신에 테이블 스캔을 수행 할 것입니다그러나 내부적으로 어떤 일이 발생하는지 찾아 보지 않는 한 여러분은 알지 못 할 것입니다.

*****

만일 백업 및 복원 명령이 최적이 아닌 속도로 수행된다면SQL Server Backup Device Object: Device Throughput Bytes/sec 카운터를 이용해서이 문제를 확인 할 수 있습니다이 카운터는 여러분의 백업이 얼마나 빨리 수행되는지 알려 줄 것입니다또한 문제에 대한 의구심을 해결하기 위해서 Physical Disk Object: Avg. Disk Queue Length 카운터를 같이 조사해 볼 수 도 있습니다대부분의 경우에 백업과 복원의 성능 문제가 있다면, I/O 병목에 의한 것들입니다.

DBA로써 경험하고 다루게 되는 I/O병목에 대한 판단의 작업 또한 수행할 것입니다예를 들면느린 백업 또는 복원의 원인이 같은 시점에 수행되는 단순한 DTS작업 때문일 수 있으며작업에 대한 일정의 재조정으로 문제를 해결 할 수 있습니다.

 

*****

여러분이 트랜잭션 복제를 사용하고 계신다면로그 리더가 트랜잭션들을 데이터베이스의 트랜잭션 로그로부터 배포 데이터베이스로 옮겨질 때까지의 지연시간을 모니터하길 원하실 것입니다.

또한 배포 에이젼트가 트랜잭션들을 배포데이터베이스에서 구독자 데이터베이스로 옮기는데 소요되는 시간을 모니터 하길 원할 것입니다.이 두 지연시간의 합은 하나의 트랜잭션이 게시 데이터베이스에서 구독 데이터베이스로 전달되는 총 소요시간입니다.

이 두 카운터는 SQL Server Replication LogReader: Delivery Latency  SQL Server Replication Dist.: Delivery Latency 입니다.

만약둘 중의 하나의 과정중에 과도한 지연시간 증가를 발견한다면이것은 어떤 새로운 변화가 발생하여 지연 시간을 증가 시켰는지 살펴봐야 한다는 신호입니다.

 

*****

관찰하여야 할 주요한 카운터는 SQL Server Buffer Manager Object: Buffer Cache Hit Ratio 입니다이것은 SQL서버가 데이터를 액세스 하기 위해 하드디스크가 아닌 버퍼를 얼마나 자주 참조하는가를 나타냅니다보다 높은 이 수치는, SQL서버가 데이터를 가져오기 위해서 하드디스크에 아주 가끔 액세스한다는 것이며이는 SQL서버의 성능을 극대화 시킵니다.

SQL서버를 모니터하는 다른 카운터들과는 달리이 카운터는 SQL서버가 다시 시작한 시점 이후부터의 버퍼 캐시 히트율의 평균 값입니다다른 말로이 카운터는 현재 시점의 측정 값이 아니라 SQL서버가 시작된 이후의 모든 날들의 평균값입니다현재 시점의 버퍼캐시에서 어떤일이 발생하고 있는지 정확한 자료를 얻기 원한다면여러분은 SQL서버를 중지 했다가 다시 시작해야만 하고정확한 버퍼 캐시 히트율을 확인하기 위해 SQL서버를 여러 시간 동안 일반적인 활동을 하게 내버려 둬야 합니다.

만약 최근에 SQL서버를 재 시작 하지 않았다면여러분이 보고 있는 버퍼 캐시 히트율은 아마도 현재 발생하는 버퍼 캐시 히트율을 위해서는 정확한 정보가 아닐 것 입니다또한 버퍼 캐시 히트율이 좋아 보일지라도오랜 시간의 평균값으로 계산되었기 때문에 실제로는 좋지 않을 지도 모릅니다.

OLTP 응용프로그램 환경에서이 수치는 90~95% 이상이어야 합니다그렇지 않다면여러분은 성능 향상을 위해서 서버에 RAM을 추가할 필요가 있습니다.

OLAP 응용프로그램 환경에서는, OLAP작동하는 기본특성 때문에 이 수치는 OLTP 보다 더 작을 수 있습니다어떤 경우라도더 많은 RAM SQL서버의 OLAP 활동의 성능을 증가 시킬것입니다.

 

*****

이 두 카운터를 관측하는걸 고려하십시요. SQLServer:Memory Manager: Total Server Memory (KB) and SQLServer:Memory Manager: Target Server Memory (KB)첫번째 카운터 SQLServer:Memory Manager: Total Server Memory (KB)  mssqlserver서비스가 메모리를 얼마나 사용하고 있는가를 말해줍니다이것은 SQL서버 Bpool영역으로 커밋된 전체 버퍼수를 포함하고, ‘OS in Use’ 로 표시되는 OS버퍼들도 포함합니다.

두번째 카운터, SQLServer:Memory Manager: Target Server Memory (KB) SQL서버가 얼마나 많은 메모리를 가용할 수 있는가를 나타냅니다이는 SQL서버가 시작시에 예약한 버퍼수에 기초합니다.

만약, Total Server Memory (KB)이 Target Server Memory (KB)보다 작다면이는 SQL서버가 충분한 메모리를 가졌고효율적으로 사용하고 있다는 것을 의미합니다반면에 Total Server Memory (KB)이 Target Server Memory (KB)보다 크거나 같다면이는 SQL서버가 메모리 압박을 받고 있고더 많은 물리적 메모리에 액세스 하고 있음을 나타냅니다.

 

*****

디스크로부터 데이터를 읽는 대신에 버퍼 캐시로부터 데이터를 가져온다면 SQL서버는 보다 적은 자원으로 보다 훨씬 더 빠르게 수행합니다몇몇 경우에메모리 집중적인 명령들로 인해 데이터 페이지들이 이상적으로 플러시 되기 전에 캐시 밖으로 밀려 나가기도 한다이는 버퍼 캐시가 충분히 크지 않거나 메모리 집중적인 명령의 작업을 위한 더 많은 버퍼 공간 요구에 의해  발생할 수 있습니다이런 경우에는 버퍼에 추가 적인 공간을 만들기 위해서 플러시 된 데이터 페이지들은 디스크로부터 읽혀지게 되며성능에 안 좋은 영향을 미치게 됩니다.

여러분들의 SQL서버가 이러한 문제를 가지고 있는지 확인 하기 위한 3개의 SQL 서버 카운터가 있습니다.

·  SQL Server Buffer Mgr: Page Life Expectancy 이 성능 카운터는 데이터 페이지가 얼마나 오랫동안 버퍼공간에 머무르는지를 평균적으로 나타내 줍니다만약 이 값이 300초 보다 작은 값을 보인다면여러분의 SQL서버는 성능의 극대화를 위해서 추가적인 메모리가 필요함을 잠재적으로 나타내는 것입니다.

·  SQL Server Buffer Mgr: Lazy Writes/Sec 이 카운터는 버퍼 공간을 비우기 위해서 지연기록기 프로세스가 더티 페이지들을 버퍼공간에서 디스크로 초당 얼마나 많이 옮겼는지 나타냅니다일반적으로 말하자면이 항목은 높은 값(초당 20정도)이어서는 안됩니다이상적으로, 0에 가까워야 합니다만약 이 값이 0이라면여러분의 SQL서버는 아주 큰 버퍼 공간을 가지고 있고일정한 체크 포인트가 발생하여 더티페이지가 반환되기를 기다리는 대신에더티페이지 반환을 하지 않아도 됨을 나타냅니다만약 이 값이 높다면보다 더 많은 메모리가 필요함을 나타냅니다.

·  SQL Server Buffer Mgr: Checkpoint Pages/Sec체크포인트가 발생할 때모든 더티 페이지들은 디스크에 쓰여 집니다이것은 일반적인 절차이며체크포인트가 처리되는 동안에 이 카운터가 발생하는 근원이 됩니다시간에 걸쳐서 이 카운터의 높은 값을 보길 원치 않으실 것입니다이는 SQL서버의 귀중한 자원을 많이 사용할 수 있는 체크포인트 프로세스가 보다 더 자주 실행됨을 나타냅니다만약 이 값이 높은 값을 가진다면빈번한 체크 포인트 발생을 줄이기 위해서 더 많은 RAM을 추가할 것을 고려하시거나, SQL서버의 구성옵션 중에 복구 간격(recovery interval)’ 옵션 값을 늘려주십시오.

이러한 성능 모니터 카운터들은 메모리 부족의 잠재적인 진단을 위해서 고려되거나고도화하거나정제하기 위해 사용되어야 합니다.

 

*****

래치는 본질적으로 경량 잠금” 입니다기술적인 관점에서래치는 가볍고짧은 동기화 개체입니다래치는 마치 잠금 처럼 동작하고예상치 않은 변화로부터 데이터를 보호하기 위한 목적을 가지고 있습니다예를 들면하나의 행이 버퍼로부터 SQL서버의 저장소 엔진으로 이동될 때이 매우 짧은 시간 동안의 이동 중에 행 내부의 데이터 변형을 방지하기 위해서 SQL서버에 의해서 래치가 사용되어 집니다.

마치 잠금과 같이래치는 데이터베이스의 행들에 대해 접근하지 못하게 SQL서버를 방해 할 수 있고이는 성능에 안 좋은 영향을 줍니다이러한 이유 때문에 여러분은 래치 시간을 최소화하길 원하실 것입니다.

SQL서버는 래치의 활동을 측정하기 위한 3가지 다른 방법을 제공합니다.

·  Average Latch Wait Time (ms)래치 요청들을 위해 대기해야 하는 시간입니다이는 오직 대기해야 하는 래치 요청들에 대한 측정값입니다대부분의 경우에 대기가 없습니다따라서이 값은 모든 래치에 대한 것이 아니라대기 해야 하는 래치에 대해서만 적용된 값임을 유념하십시오.

·  Latch Waits/sec이 값은 즉시 승인 받지 못한 래치 요청수입니다다시 말해서, 1초 동안에 대기 해야 했던 총 래치의 수입니다따라서이는 Average Latch Wait Time으로 부터 측정된 래치들 입니다.

·  Total Latch Wait Time (ms)이는 지난 초 동안의 총 래치 대기 시간 (ms) 입니다.

이 값을 읽을 때성능카운터에서 배율을 정확히 읽었는지 확인하십시오배율은 카운터 값마다 다르게 표시될 수 있습니다.

제 경험에 비추어 볼 때, Average Latch Wait Rime 카운터는 거의 변함이 없습니다반면에 다른 두 개의 카운터(Latch Waits/sec , Total Latch Wait Time (ms) SQL서버가 뭘 하느냐에 따라서 큰 변동폭을 보일 수 있습니다.

각각의 서버가 약간씩 다르기 때문에래치 활동도 각 서버마다 다릅니다전형적인 작업부하가 있을 때이 카운터에 대한 기준 값을 확보해 두시는 것은 아주 좋은 생각입니다이는 현재 어떤 일이 발생하고 있는가에 대해서 래치 활동이 평상시 보다 많은지 적은지에 대한 비교자료가 될 것입니다.

래치 활동이 기대치 보다 높다면이는 종종 하나 혹은 두 개의 잠재적인 문제점들을 나타냅니다첫째여러분의 SQL서버가 보다 많은 메모리를 사용할 수 있음을 의미할지도 모릅니다래치 활동이 높다면버퍼 캐시 히트 비율이 어떤지 확인하십시오이 값이 99% 이하라면보다 더 많은 양의 메모리가 서버의 성능에 도움을 줄 것입니다만약 99% 이상이라면문제를 유발하는 것은 IO시스템일수도 있습니다빠른 IO시스템은 서버 성능에 유리합니다.

래칭에 대해서 보다 더 많이 배우고실험해보고 싶으시면여기 두 개의 명령이 있습니다.

SELECT * FROM SYSPROCESSES WHERE waittime>0 and spid>50

이 쿼리는 현재 대기상태에 있는 waittype, waittime, lastwaittype, waitresource, SPID들을 표시해 줍니다. lastwaittype은 래치 종류를, waitresource SPID가 어떤 개체를 위해 대기 중인지를 알려줍니다이 쿼리를 실행하게 되면실행 시점에 대기가 발생하고 있지 않다면아무런 결과도 얻지 못 할 지도 모릅니다그러나 계속해서 실행하다 보면결국 몇몇 결과를 얻게 될 것입니다.

DBCC SQLPerf (waitstats, clear)      --대기 통계초기화 
DBCC SQLPerf (waitstats)      -- SQL
서버 재시작(대기 통계 초기화이후의 대기 통계정보

이 쿼리는 대기유형대기시간과 함께 현재의 래치들을 나타내줍니다여러분은 아마도 통계정보를 초기화하길 원할 겁니다그런 다음에는 어떤 래치가 가장 많은 시간을 차지하는지 알기 위하여, DBCC SQLPerf(waitstats)명령을 짧은 시간에 걸쳐서 정기적으로 실행하십시오.

Posted by Sumin Family

http://yoonsy.tistory.com/29


여기 참고, 


동적 awe 관련 참고. 


http://ddoung2.tistory.com/244


http://technet.microsoft.com/ko-kr/library/ms190730(v=sql.105).aspx

Posted by Sumin Family


ALTER DATABASE [test] MODIFY FILE ( NAME = N'test_log', MAXSIZE = 10240000KB )

GO




Posted by Sumin Family


mssql 서버 사용시.   ldf  파일 을 분실 혹은 사용하지 못할경우, 


2005 2008 에서 복원 방법. 


-- 기존 데이터 베이스에서 mdf 파일을 다른곳을 보관, 

-- 기존 데이터 베이스 삭제.  

-- 기존 데이터 베이스와 동일한 이름으로 데이터 베이스 생성, 


-- 해당 데이터 베이스 긴급장애 모드로 변경 한뒤 싱글 모드로 변경, 


ALTER DATABASE recovery_test_2 SET EMERGENCY;
ALTER DATABASE recovery_test_2 SET SINGLE_USER;


새로 생성된 mdf 파일과 ldf 파일삭제후  동일한 위치에 기존 백업해둔 mdf 파일을 복사.

** 이때 sql 서비스를 정지해야 할필요도 있다. 


-- 다시 sql 을 올려보면,  문제가 있고 테이블도 안되고 그럴것이다. 

-- ldf 파일이 없으므로,  해당 파일을 다시 재 생성해준다. 

alter database test rebuild LOG ON (name=test_log,filename='C:\Program Files\Microsoft SQL Server\MSSQL10_50.MSSQLSERVER\MSSQL\DATA\test_log.ldf')


-- 위의 작업이 정상적으로 되면,  에러 메시지가 발생하게 되는데.  

이는  해당ldf 와 mdf 가 동일한 싱크가 아니기 때문이다. 


-- 아래 명령어를 통해서  해당 데이터 베이스를 체크 한다. 

  이때 에러메시지 발생시 해당 메시지 대로 별도로 진행 한다. 

use test 

dbcc checkdb



-- 에러가 발생 하지 않으면 아래 메시지대로 multi_user 로 변경 한다. 

alter database test set SINGLE_USER WITH ROLLBACK IMMEDIATE

alter database test set multi_user with rollback immediate


-- 그뒤 복구 모드를  원상 복구 시켜준다.  

ALTER DATABASE [test] SET RECOVERY FULL WITH NO_WAIT



최종적으로 다시 한번 확인. 

sp_helpdb test




Posted by Sumin Family

sp_readerrorlog   명령어이다. 
해당 명령어 프로시져는 아래와 같이 되어 있으며, 

각 하위 옵션은 아래내용확인 바란다. 

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
CREATE PROC [sys].[sp_readerrorlog](
   @p1     INT = 0,
   @p2     INT = NULL,
   @p3     VARCHAR(255) = NULL,
   @p4     VARCHAR(255) = NULL)
AS
BEGIN
   IF (NOT IS_SRVROLEMEMBER(N'securityadmin') = 1)
   BEGIN
      RAISERROR(15003,-1,-1, N'securityadmin')
      RETURN (1)
   END  
   IF (@p2 IS NULL)
       EXEC sys.xp_readerrorlog @p1
   ELSE
       EXEC sys.xp_readerrorlog @p1,@p2,@p3,@p4
END

 

This procedure takes four parameters:

1. Value of error log file you want to read: 0 = current, 1 = Archive #1, 2 = Archive #2, etc...

2. Log file type: 1 or NULL = error log, 2 = SQL Agent log

3. Search string 1: String one you want to search for

4. Search string 2: String two you want to search for to further refine the results

Posted by Sumin Family

slow 쿼리 확인 방법. 


간략.. 샘플.  1초 이상 쿼리만 조회.


select top 100 t.text, q.*

from (

 select (total_elapsed_time / execution_count) / 1000000 as AvgDuration, * 

 from sys.dm_exec_query_stats

 where (total_elapsed_time / execution_count) > 1000000 -- 1 sec

) as q

cross apply sys.dm_exec_sql_text(sql_handle) as t

order by AvgDuration desc



-----------------------------------


select top 10 * from sys.sysprocesses

where blocked<>0


exec sp_who2


dbcc inputbuffer(10)

go


dbcc inputbuffer(1)

go

Posted by Sumin Family


변수선언

declare @tname varchar(50)
declare @totalname varchar(200)
set @tname='t_user_test'
set @totalname = 'insert into ' + @tname + '  select DISTINCT * from [34].[testc].[dbo].[' + @tname + ']'
exec (@totalname)

Posted by Sumin Family


티스토리 툴바