'분류 전체보기'에 해당되는 글 192건
- 2009.11.19 T-SQL::Index Script 1
- 2009.11.19 T-SQL::List all indexes in database
- 2009.11.13 성능:: 강제 매개변수화 Forced Parameterization
- 2009.11.12 SQL서버 성능counter
- 2009.11.10 Lock::Trace Flag 1204
- 2009.11.09 쿼리 Plan을 그래프로 보기
- 2009.11.09 Error:: '80004005', SQL 서버가 죽음 2
- 2009.11.04 Admin::TF 1118 사용 이유
- 2009.11.04 Admin::Allocate Extent, 익스텐드 할당&공간관리 1
- 2009.10.11 SQL Server DBA Checklist
- 2009.10.09 에러:: Error: 3456
- 2009.10.05 백업::손상된 백업에 의해 발생한 SQL Server 복원 오류에 응답
- 2009.09.28 미러링::Error: 1479, Severity: 16, State: 1.
- 2009.09.16 Active Directory Management
- 2009.09.14 Windows용 Dr. Watson
현재 존재하는 Index 스크립트 생성.
T-SQL::List all indexes in database 에 관련 함수, view 생성해야함.
-- INDEX Script SELECT CASE WHEN T.TABLE_NAME IS NULL THEN 'CREATE ' + CASE IS_UNIQUE WHEN 1 THEN ' UNIQUE' ELSE '' END + CASE IS_CLUSTERED WHEN 1 THEN ' CLUSTERED' ELSE '' END + ' INDEX [' + INDEX_NAME + '] ON [' + v.TABLE_NAME + ']' + ' (' + COLUMN_LIST + ') ON ' + FILE_GROUP ELSE 'ALTER TABLE ['+T.TABLE_NAME+']' +' ADD CONSTRAINT ['+INDEX_NAME+']' +' PRIMARY KEY ' + CASE IS_CLUSTERED WHEN 1 THEN ' CLUSTERED' ELSE '' END + ' (' + COLUMN_LIST + ')' END FROM dbo.vAllIndexes v LEFT OUTER JOIN INFORMATION_SCHEMA.TABLE_CONSTRAINTS T ON T.CONSTRAINT_NAME = v.INDEX_NAME AND T.TABLE_NAME = v.TABLE_NAME AND T.CONSTRAINT_TYPE = 'PRIMARY KEY' ORDER BY v.TABLE_NAME, IS_CLUSTERED DESC
'T-SQL' 카테고리의 다른 글
T-SQL::Attach (1) | 2009.12.01 |
---|---|
T-SQL::테이블 ROWCOUNT, 사이즈 (0) | 2009.11.27 |
T-SQL::List all indexes in database (0) | 2009.11.19 |
T-SQL::Total Disk Size 얻기 (OLE 사용) (1) | 2009.08.13 |
데이터 베이스에 있는 모든 인덱스 정보를 보기 위함.
sys.indexes, sys.index_columns, sys.columns 정보를 보면 복합 인덱스 일경우 row가 한개 이상으로 나타나서 한눈에 보기가 힘들다.
select t.name as table_name ,ind.name as index_name, ind.index_id, ic.index_column_id, col.name as column_name from sys.indexes ind inner join sys.index_columns ic on ind.object_id = ic.object_id and ind.index_id = ic.index_id inner join sys.columns col on ic.object_id = col.object_id and ic.column_id = col.column_id inner join sys.tables t on ind.object_id = t.object_id where ind.is_primary_key = 0 and ind.is_unique = 0 and ind.is_unique_constraint = 0 and t.is_ms_shipped = 0 order by t.name, ind.name, ind.index_id, ic.index_column_id
그래서 다음과 같이 처리한다.
CREATE FUNCTION dbo.GetIndexColumnOrder ( @object_id INT, @index_id TINYINT, @column_id TINYINT ) RETURNS NVARCHAR(5) AS BEGIN DECLARE @r NVARCHAR(5) SELECT @r = CASE INDEXKEY_PROPERTY ( @object_id, @index_id, @column_id, 'IsDescending' ) WHEN 1 THEN N' DESC' ELSE N'' END RETURN @r END ;
CREATE FUNCTION dbo.GetIndexColumns ( @table_name SYSNAME, @object_id INT, @index_id TINYINT ) RETURNS NVARCHAR(4000) AS BEGIN DECLARE @colnames NVARCHAR(4000), @thisColID INT, @thisColName SYSNAME SET @colnames = '[' + INDEX_COL(@table_name, @index_id, 1) + ']' + dbo.GetIndexColumnOrder(@object_id, @index_id, 1) SET @thisColID = 2 SET @thisColName = '[' + INDEX_COL(@table_name, @index_id, @thisColID) + '] ' + dbo.GetIndexColumnOrder(@object_id, @index_id, @thisColID) WHILE (@thisColName IS NOT NULL) BEGIN SET @thisColID = @thisColID + 1 SET @colnames = @colnames + ', ' + @thisColName SET @thisColName = INDEX_COL(@table_name, @index_id, @thisColID) + dbo.GetIndexColumnOrder(@object_id, @index_id, @thisColID) END RETURN @colNames END ;
CREATE VIEW dbo.V_ALLINDEXES AS SELECT TABLE_NAME = OBJECT_NAME(i.id), INDEX_NAME = i.name, COLUMN_LIST = dbo.GetIndexColumns(OBJECT_NAME(i.id), i.id, i.indid), IS_CLUSTERED = INDEXPROPERTY(i.id, i.name, 'IsClustered'), IS_UNIQUE = INDEXPROPERTY(i.id, i.name, 'IsUnique'), FILE_GROUP = g.GroupName FROM sysindexes i INNER JOIN sysfilegroups g ON i.groupid = g.groupid WHERE (i.indid BETWEEN 1 AND 254) -- leave out AUTO_STATISTICS: AND (i.Status & 64)=0 -- leave out system tables: AND OBJECTPROPERTY(i.id, 'IsMsShipped') = 0 ;
'T-SQL' 카테고리의 다른 글
T-SQL::Attach (1) | 2009.12.01 |
---|---|
T-SQL::테이블 ROWCOUNT, 사이즈 (0) | 2009.11.27 |
T-SQL::Index Script (1) | 2009.11.19 |
T-SQL::Total Disk Size 얻기 (OLE 사용) (1) | 2009.08.13 |
One of the main benefits of using a stored procedure to execute Transact-SQL code is that once a stored procedure is compiled and executed the first time, the query plan is cached by SQL Server. So the next time the same stored procedure is run (assuming the same connection parameters are used), SQL Server does not have to recompile the stored procedure again, instead reusing the query plan created during the first compilation of the stored procedure.
If the same stored procedure is called over and over again, with the query plan being reused each time, this can help reduce the burden on SQL Server's resources, boosting its overall performance.
그러나 application에서 SQL Server로 보내는 쿼리는 동적 쿼리도 존재한다. 이런 쿼리들은 매개 변수화 되지 않아서 재 사용이 이루어 지지 않는다.
ALTER DATABASE 문에서 PARAMETERIZATION 옵션을 FORCED로 설정하여 강제 매개 변스화를 설정하면 쿼리 컴파일 및 재 컴파일을 빈도를 줄여 특정 데이터베이스의 성능을 향상 시킬 수 있다.
이것을 설정하면 SELECT, INSERT, UPDATE, DELETE 문에 표시되는 리터럴 값이 쿼리 컴파일 중 매개변수로 변환된다.
다음 구문에 나타나는 리터럴은 예외이다.
WHERE T.col2 >= @bb
와 같은 변수를 참조하는 문
[code sql] ALTER DATABASE FORCED [/code]
참고:) http://msdn.microsoft.com/ko-kr/library/ms175037.aspx
'Peformance Tuning' 카테고리의 다른 글
read-ahead는 무었인가? (0) | 2009.12.03 |
---|---|
DeadLock 예제,재 실행하기 (0) | 2009.11.24 |
SQL서버 성능counter (0) | 2009.11.12 |
Lock::Trace Flag 1204 (0) | 2009.11.10 |
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, paLock Timeouts/secge, 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)명령을 짧은 시간에 걸쳐서 정기적으로 실행하십시오.
'Peformance Tuning' 카테고리의 다른 글
DeadLock 예제,재 실행하기 (0) | 2009.11.24 |
---|---|
성능:: 강제 매개변수화 Forced Parameterization (0) | 2009.11.13 |
Lock::Trace Flag 1204 (0) | 2009.11.10 |
쿼리 Plan을 그래프로 보기 (0) | 2009.11.09 |
원본출처: http://blogs.msdn.com/bartd/attachment/747119.ashx
Below you’ll see sample -T1204 output for a very simple deadlock between two spids, spid 51 and spid 52. The deadlock is represented as a list of “nodes”. Each node represents one resource – most commonly a lock – that is involved in the deadlock. For each node, or lock, information is provided about both the spid that is blocked waiting for access to this resource, and about the spid is already has a lock on the resource that is blocking the first spid. A simple deadlock involves two spids and two locked resources, but deadlocks involving 3 or more spids are also possible.
The -T1204 output is annotated to explain the most relevant parts of the output. If you are viewing this page in Internet Explorer, you may need to enable active content for the page before you can see the annotations. Hover over the comment markers to see the annotations.
spid4 Deadlock encountered .... Printing deadlock information
spid4
spid4 Wait-for graph
spid4
spid4 KEY: 7:2121058592:2 (a70064fb1eac)[BKD2] CleanCnt:1 Mode: X[BKD3] Flags: 0x0
spid4 Grant List 0::
spid4 Owner:0x42bdefa0 Mode: X[BKD4] Flg:0x0 Ref:0 Life:02000000 SPID:52 ECID:0
spid4 SPID: 52[BKD5] ECID: 0 Statement Type: DELETE[BKD6] Line #: 6[BKD7]
spid4 Input Buf: Language Event:
EXEC spClearItemStatus 152363[BKD8]
spid4 Requested By:
spid4 ResType:LockOwner Stype:'OR' Mode: U SPID:51[BKD9] ECID:0 Ec:(0x43F5F588) Value:0x42bded20 Cost:(0/10AC)
spid4
spid4 KEY: 7:1977058079:1 (02014f0bec4e)[BKD11] CleanCnt:1 Mode: X Flags: 0x0
spid4 Grant List 0::
spid4 Owner:0x42bde9a0 Mode: X Flg:0x0 Ref:0 Life:02000000 SPID:51 ECID:0
spid4 SPID: 51 ECID: 0 Statement Type: UPDATE Line #: 47
spid4 Input Buf: Language Event:
spUpdateItemProp 152363, ' QTY', 3525
spid4 Requested By:
spid4 ResType:LockOwner Stype:'OR' Mode: X SPID:52 ECID:0 Ec:(0x43983588) Value:0x42bdee40 Cost:(0/54)
spid4 Victim Resource Owner:
spid4 ResType:LockOwner Stype:'OR' Mode: X SPID:52[BKD12] ECID:0 Ec:(0x43983588) Value:0x42bdee40 Cost:(0/54)
By using the info highlighted in the first node above, and the same items from the second node, you can reconstruct the following more readable description of the deadlock scenario:
Spid 52 is running a DELETE statement on line 6 of the stored proc spClearItemStatus. He holds an X lock on the key resource KEY: 7:2121058592:2 (a70064fb1eac). This lock is blocking spid 51, who is waiting to acquire a U lock on the same key.
Spid 51 is running an UPDATE statement on line 47 of the stored proc spUpdateItemProp. He holds an X lock on key KEY: 7:1977058079:1 (02014f0bec4e). His X lock is blocking spid 52, who is waiting to acquire an X lock on the same key.
So, spid 51 is blocked by 52, while spid 52 is blocked by 51. This is a circular blocking chain, which is another name for a deadlock.
It would be better to identify the key lock using a more meaningful table name and index name instead of using cryptic resource IDs like “KEY: 7:2121058592:2 (a70064fb1eac)”. It is not possible to figure out what tables and indexes are involved from -T1204 output alone because we don’t have the necessary data to decode these lock resource IDs. For example, the resource “KEY: 7:2121058592:2 (a70064fb1eac)” corresponds to a particular index key in nonclustered index 2, on a table with object ID 2121058592, in the database with dbid 7. You can figure out what table and index this is by looking at sysobjects and sysindexes for the relevant database. After decoding the lock resource IDs and identifying the specific queries involved, the description of the first node might look like this:
'Peformance Tuning' 카테고리의 다른 글
DeadLock 예제,재 실행하기 (0) | 2009.11.24 |
---|---|
성능:: 강제 매개변수화 Forced Parameterization (0) | 2009.11.13 |
SQL서버 성능counter (0) | 2009.11.12 |
쿼리 Plan을 그래프로 보기 (0) | 2009.11.09 |
'Peformance Tuning' 카테고리의 다른 글
DeadLock 예제,재 실행하기 (0) | 2009.11.24 |
---|---|
성능:: 강제 매개변수화 Forced Parameterization (0) | 2009.11.13 |
SQL서버 성능counter (0) | 2009.11.12 |
Lock::Trace Flag 1204 (0) | 2009.11.10 |
Q:
2-3일전부터 서버가 죽어서요...
저는 NT4.0, Ms-SQL 7.0, IIS 을 사용하고 있습니다.
1. WEB
Microsoft OLE DB Provider for SQL Server error '80004005'
[DBMSSOCN]General network error. Check your network documentation.
/dbopen.asp, line 12
2. Event Log
원본( SQLCTR70 )에서 이벤트 ID( 1001 )에 대한 설명을 찾지 못했습니다. 다음 삽입 문자열을 포함합니다: Shared memory segment already exists..
Error: 17826, Severity: 18, State: 1
2002-08-22 18:36:22.35 ods Could not set up ListenOn connection 'ACCOUNT'..
Operating system error 1899., 종료점 매퍼 데이터베이스를 만들 수 없습니다.
3. Ms-SQL
02-09-13 오후 12:18:13 - + [164] ODBC Message: 109, ConnectionTransact (GetOverLappedResult()). [SQLSTATE 01000]
02-09-13 오후 12:18:13 - ! [165] ODBC Error: 4, Connection broken. [SQLSTATE 08S01]
02-09-13 오후 12:18:13 - ! [298] SQLServer Error: 4, Connection broken. [SQLSTATE 08S01]
02-09-13 오후 12:18:13 - ! [298] SQLServer Error: 109, ConnectionRead (GetOverLappedResult()). [SQLSTATE 01000]
02-09-13 오후 12:18:13 - ! [382] Logon to server '(local)' failed (ConnCachePerfCounterValues)
02-09-13 오후 12:18:14 - + [360] SQLServerAgent initiating shutdown following MSSQLServer shutdown
02-09-13 오후 12:18:16 - ! [359] The local host server is not running
02-09-13 오후 12:18:17 - ? [098] SQLServerAgent terminated (normally)
A:
이전에 제대로 실행되던 웹 응용 프로그램에서 IIS가 갑자기 알 수 없는 80004005 오류를 보고하는 이유를 확인해 달라는 질문을 받았습니다.
즉, 다음과 같은 메시지가 나타납니다.
OLE DB 공급자 오류 ODBC 드라이버 오류...데이터 원본 이름을 찾을 수 없습니다...
먼저 저는 시스템 DSN이 제 위치에 있는지를 확인했습니다.
시스템 DSN이 제 위치에 있었으므로 레지스트리 권한 문제가 아닌가 생각되어 SysInternals의 NTRegMon( http://www.sysinternals.com/ntw2k/source/regmon.shtml )을 설치하고 웹 응용 프로그램을 시작하면서 레지스트리 호출을 추적했습니다.
아니나 다를까, 3개의 레지스트리 키에서 액세스 거부가 발견되었고 이를 수정하자 응용 프로그램이 제대로 시작되었습니다.
편집자 주 이 항목에 대한 자세한 내용은 KB 기사 Q238971 http://support.microsoft.com/support/kb/articles/Q238/9/71.ASP 를 참조하십시오.
출처: 야휴 지식인
http://kr.ks.yahoo.com/service/ques_reply/ques_view.html?dnum=J&qnum=1067220
'Error Case' 카테고리의 다른 글
Error::NOLOCK 함께 스캔할 수 없음 - 601 (0) | 2009.12.08 |
---|---|
Error::Non-yielding IOCP Listener - Stack Dump analysis (0) | 2009.12.07 |
에러:: Error: 3456 (0) | 2009.10.09 |
에러::64bit 버퍼 풀 페이징 (0) | 2009.07.08 |
http://www.sqlskills.com/BLOGS/PAUL/post/Misconceptions-around-TF-1118.aspx
익스텐트 공간 할당 참고
-- Isolate top waits for server instance
;WITH Waits AS
(
SELECT
wait_type,
wait_time_ms / 1000. AS wait_time_s,
100. * wait_time_ms / SUM(wait_time_ms) OVER() AS pct,
ROW_NUMBER() OVER(ORDER BY wait_time_ms DESC) AS rn
FROM sys.dm_os_wait_stats
WHERE wait_type NOT LIKE '%SLEEP%'
)
SELECT
W1.wait_type,
CAST(W1.wait_time_s AS DECIMAL(12, 2)) AS wait_time_s,
CAST(W1.pct AS DECIMAL(12, 2)) AS pct,
CAST(SUM(W2.pct) AS DECIMAL(12, 2)) AS running_pct
FROM Waits AS W1
INNER JOIN Waits AS W2
ON W2.rn <= W1.rn
GROUP BY W1.rn, W1.wait_type, W1.wait_time_s, W1.pct
HAVING SUM(W2.pct) - W1.pct < 100 -- percentage threshold
'Trace Flag' 카테고리의 다른 글
최소로그 Flag -T610 (0) | 2011.10.13 |
---|---|
Admin::SQL Server Trace Flags (0) | 2010.06.07 |
Trace Flag (0) | 2010.06.04 |
SQL Server의 데이터베이스는 데이터 파일과 로그 파일로 구성됨.
로그 파일은 앞에서 설명한 VLF로 구성된다.
반면, 데이터 파일의 가장 작은 단위는 페이지이다.
연속적인 8개의 페이지로 extent가 구성된다.
extents는 'single-extent' (균일 익스텐트), 'mixed extent'(혼합 익스텐트) 로 나뉜다.
균일 익스텐트는 하나의 개체가 8개의 페이지를 모두 사용 하며, 혼합 익스텐트는 하나의 익스텐트에 여러 개체가 들어간다.
1 extents = 8 page = 1 page * 8kb = 64kb
테이블을 만들때는 익스텐트 단위로 일어나는데 SQL은 처음 테이블을 만들때는 항상 혼합 익스텐트 내에서 생성한다.
테이블이 커져가서 8 개의 page를 채훈 후 부터 균일 인스텐트를 할당한다.
* GAM, SGAM
SQL Server는 전역 할당 맵(GAM) 과 공유 전역 할당 맵(SGAM) 이라는 두가지 할당 맵을 사용하여 익스텐트, GAM, SGAM은 각 1bit로 하나의 익스텐트를 관리함으로 총 6400 익세텐트를 관리 (4GB)
GAM : 어떤 익스텐트가 할당되었는지 관리
SGAM : 어떤 익스텐트가 현재 혼합 익스텐트로 사용되는지, 빈 페이지를 가지는지 여부 관리
GAM비트 | SGAM비트 | 해당 익스텐트의 상태 |
1 | 0 | 비어있음, 사용중이지 않음 |
0 | 0 | 균일 익스텐트 또는 환전 혼합 익스텐트 |
0 | 1 | 빈 페이지가 있는 혼합 익스텐트 |
1. 신규 테이블 생성시 : 0:1 이 있는것에 할당함. 즉, SGAM이 1인것을 할당
SGAM : 1인것이 존재 하지 않으면, 1:0 인것을 찾아서 할당하고 비트 패턴을 0:1 로 변경한다.
2. GAM과 SGAM은 데이터 파일 하나씩 있으므로 해당 DB의 파일 개수를 늘려주면 SGAM에 대한 요구가 분산되어 보다 좋은 성능을 낼 수 잇다.
임시테이블은 모두 tempdb에서 처리됨으로 tempdb의 데이터 파일을 여러개로 분리하는 것이 많은 수의 임시 테이블 요구에 대한 할당 잠금 측면에서 유리하다.
* PFS (Page Free Space)
힙, ntext, text, image 컬럼의 페이지가 할당되었는지 여부와 각 페이지의 빈 공간 크기를 기록한다.
하나의 PFS 페이지는 약 8000 page = 1000 익스텐트 관리하며, 파일이 커지면 연결 리스트 구조로 새로운 PFS 페이지가 추가된다.
* BCM (Bulked Change Map)
마지막 Backup log 문 이후 대량 기록 작업에 의해 수정된 익스텐트를 관리, 대량 로그 복구 모델일 때 사용됨
* DCM
마지막 bakcup dataase (full backup) 이후에 변경된 익스텐트를 관리하는 페이지이며, 차등 백업의 대상 익스텐트를 찾기 위해 사용,
BCM, DCM도 1bit로 하나의 익스텐트를 관리함으로 총6400 익스텐트 관리하게 된다.
* IAM (Index Allocation Map)
개체가 사용하는 데이터베이스 파일의 익스텐트를 매핑한다.
'Common Admin' 카테고리의 다른 글
admin::여러 TCP 포트에서 수신하도록 데이터베이스 엔진 구성 (0) | 2009.12.03 |
---|---|
SQL Server Maximum Capacity (0) | 2009.12.03 |
SQL Server DBA Checklist (0) | 2009.10.11 |
[TechNet세미나] Windows Server 2003 ClusterService Troubleshooting (0) | 2009.07.24 |
SQL Server DBA Checklist
Problem
I am looking for items that I should address on a daily basis on my SQL Servers. As such, what are the critical aspects of SQL Server that should I check on a daily basis? Should I perform additional checks on a weekly, monthly or yearly basis? How can I automate some of these tasks so I do not spend my whole day reviewing SQL Servers rather working on the latest and greatest technologies?
Solution
Depending on your environment dictates all of the items that should be reviewed on a daily basis as well as their criticality in your specific organization. Based on your environment, customize the list below to ensure it meets your needs:
Daily Checklist
- Backups - Check your backups to validate that they were successfully created per your process.
- MSSQLTips.com Category: Backup and Recovery
- Nightly Processing - Review the nightly or early morning processes.
- SQL Server Error Log - Review the SQL Server error log for any errors or security issues (successful or failed logins) that are unexpected.
- Windows Event Log - Review the Application Event Log at a minimum to find out if any Windows or hardware related errors or warnings are being written.
- Some of the hardware vendors write warnings to the Windows Event Log when they anticipate an error is going to occur, so this gives you the opportunity to be proactive and correct the problem during a scheduled down time, rather than having a mid day emergency.
- SQL Server 2005 Exposed - Log File Viewer
- SQL Server Agent Jobs - Review for failed SQL Server Agent Jobs.
- HA or DR Logs - Check your high availability and/or disaster recovery process logs. Depending on the solution (Log Shipping, Clustering, Replication, Database Mirroring, CDP, etc.) that you are using dictates what needs to be checked.
- Performance Logs - Review the performance metrics to determine if your baseline was exceeded or if you had slow points during the day that need to be reviewed.
- MSSQLTips.com Category: Performance Tuning
- Security Logs - Review the security logs from a third party solution or from the SQL Server Error Logs to determine if you had a breach or a violation in one of your policies.
- Centralized error handling - If you have an application, per SQL Server or enterprise level logging, then review those logs for any unexpected errors.
- Storage - Validate you have sufficient storage on your drives to support your databases, backups, batch processes, etc. in the short term.
- Service Broker - Check the transmission and user defined queues to make sure data is properly being processed in your applications.
- MSSQLTips.com Category: Service Broker
- Corrective Actions - Take corrective actions based on the issues and/or errors that you found.
- Improvements - Look for opportunities to improve your environment based on the review and analysis you have performed.
- Learn something new - Although this review and correction process could be time consuming, take some time every day to learn something new to improve your knowledge of the technology you work on every day.
Weekly or Monthly Checklist
- Backup Verification (Comprehensive)- Verify your backups and test on a regular basis to ensure the overall process works as expected. What is meant by this is to:
- Contact your off site tape vendor to obtain a tape
- Validate that the tape goes to the correct office
- Validate that the vendor delivers the correct tape
- Validate that the vendor delivers the tape in the correct time period
- Validate that the software version you use to perform the restore is compatible with the version from the tape
- Validate that the tape does not have any restore errors
- Validate that sufficient storage is available to move the backup to the needed SQL Server
- Validate that the SQL Server versions are compatible to restore the database
- Validate that no error messages are generated during the restore process
- Validate that the database is accurately restored and the application will function properly
- Backup Verification (Simple) - Verify your backups on a regular basis.
- Windows, SQL Server or Application Updates - Check for service packs/patches that need to be installed on your SQL Server from either a hardware, OS, DBMS or application perspective
- MSSQLTips.com Category: Service Packs / Patches
- Capacity Planning - Perform capacity planning to ensure you will have sufficient storage for a specific period of time such as for 6, 12 or 18 months.
- Fragmentation - Review the fragmentation for your databases to determine if you particular indexes must be rebuilt based on analysis from a backup SQL Server.
- MSSQLTips.com Category: Fragmentation
- Maintenance - Perform database maintenance on a weekly or monthly basis.
- MSSQLTips.com Category: Maintenance
- Security - Remove unneeded logins and users for individuals that have left the organization, had a change in position, etc.
- Shrink databases - If databases or transaction logs are larger, than necessary shrink those files to free up disk space.
Opportunities for Automation
- Setup alerts for specific error levels or error messages that impact your SQL Servers in order to be notified automatically.
- Setup Jobs to query for specific conditions in your tables to validate data was loaded or data is being added to specific tables based on your business processes throughout the day.
- Setup notification on Job success, failure or completion.
- One word of warning is to check your business critical Jobs on a regular basis just to be sure they are working properly. Nothing is worse than finding out a key process has been failing for days, weeks or months and the reason notifications have not been sent are due to an incorrect configuration, full mailbox, etc. It may be 30 minutes on a weekly basis that is time well spent.
- Setup centralized error handling on a per SQL Server, application or enterprise basis then determine the business rules for specific error conditions.
'Common Admin' 카테고리의 다른 글
SQL Server Maximum Capacity (0) | 2009.12.03 |
---|---|
Admin::Allocate Extent, 익스텐드 할당&공간관리 (1) | 2009.11.04 |
[TechNet세미나] Windows Server 2003 ClusterService Troubleshooting (0) | 2009.07.24 |
SQL Server 2000 vs SQL Server 2005 Startup Parameters (0) | 2009.07.20 |
2009-10-09 13:30:25.530 spid20s Database mirroring is active with database 'XXX' as the mirror copy. This is an informational message only. No user action is required.
2009-10-09 17:19:14.180 spid20s Error: 3456, Severity: 21, State: 1.
2009-10-09 17:19:14.180 spid20s Could not redo log record (276495:119218:6),
for transaction ID (0:408286833), on page (20:508656), database 'XXX' (database ID 12).
Page: LSN = (276492:1649102:28), type = 1. Log: OpCode = 4, context 2,
PrevPageLSN: (276495:66503:4). Restore from a backup of the database, or repair the database.
2009-10-09 17:19:14.190 spid20s Error: 1454, Severity: 16, State: 1.
2009-10-09 17:19:14.190 spid20s While acting as a mirroring partner for database 'XXX', server instance '장비명' encountered error 3456, status 1, severity 21. Database mirroring will be suspended. Try to resolve the error and resume mirroring.
2009-10-09 17:19:14.700 spid20s Database mirroring is inactive for database 'XXX'. This is an informational message only. No user action is required.
http://www.errorhelp.com/ 에서 찾아봤음.
미러링되는 미러서버의 DB가 정합성이 맞지 않아서 발생. 미러도 일시 중지 상태가 됨.
미러를 재 구축 해야함.
미러DB가 아니라면 응급 모드로 변경해서 읽기라도 가능하게 하여 조치할것 조치함.
'Error Case' 카테고리의 다른 글
Error::NOLOCK 함께 스캔할 수 없음 - 601 (0) | 2009.12.08 |
---|---|
Error::Non-yielding IOCP Listener - Stack Dump analysis (0) | 2009.12.07 |
Error:: '80004005', SQL 서버가 죽음 (2) | 2009.11.09 |
에러::64bit 버퍼 풀 페이징 (0) | 2009.07.08 |
http://msdn.microsoft.com/ko-kr/library/ms190952(SQL.90).aspx
복원중 WITH CONTINUE_AFTER_ERROR 쓰게 되면 에러가 있어도 계속 복원한다.
'Backup/Restory' 카테고리의 다른 글
Admin::Recovery Model (0) | 2010.06.04 |
---|---|
백업성공보고 (0) | 2010.06.03 |
All DB 백업 (0) | 2010.06.03 |
복원후에러로그내역궁금증 (0) | 2010.04.04 |
미러링::Error: 1479, Severity: 16, State: 1.

SQL SERVER 2005 이상
미러서버의 네티워크 사용량 증라고 미러링이 재개되지 못하는 경우.
Database mirroring sessions may stop intermittently in SQL Server 2005
http://support.microsoft.com/default.aspx?scid=kb;en-us;959006&sd=rss&spid=2855
select is_send_flow_controlled column , * from sys.dm_db_mirroring_connections dynamic management
is_send_flow_controlled column 컬럼이 1 이면 네트워크 사용량이 많은거다.
(미러서버)
<Date><Time> spid16s The mirroring connection to "<EndPoint>" has timed out for database "MSS" after 120 seconds without a response. Check the service and network connections.
<Date><Time> spid16s Database mirroring is inactive for database 'MSS'. This is an informational message only. No user action is required.
<Date><Time> spid16s Restart packet created for dbid 5.
<Date><Time> spid22s Restart packet processing for dbid 5.
<Date><Time> spid22s SQL Server has encountered 1 occurrence(s) of cachestore flush for the 'Object Plans' cachestore (part of plan cache) due to some database maintenance or reconfigure operations.
<Date><Time> spid22s SQL Server has encountered 1 occurrence(s) of cachestore flush for the 'SQL Plans' cachestore (part of plan cache) due to some database maintenance or reconfigure operations.
<Date><Time> spid22s SQL Server has encountered 1 occurrence(s) of cachestore flush for the 'Bound Trees' cachestore (part of plan cache) due to some database maintenance or reconfigure operations.
<Date><Time> spid22s Starting up database '<Database name>'.
<Date><Time> spid22s Bypassing recovery for database '<Database name>' because it is marked as a mirror database, which cannot be recovered. This is an informational message only. No user action is required.
'ETC' 카테고리의 다른 글
최상위 코어 i7 프로세서를 낳은 인텔 네할렘 아키텍처 (0) | 2010.06.10 |
---|---|
유틸::엑셀이용 데이터 입력 (1) | 2010.06.03 |
Windows용 Dr. Watson (0) | 2009.09.14 |
Trouble Shooting Query Performance Issues Related to Plan Cache in SQL 2005 RTM and SP1 (1) | 2009.07.09 |
윈도우용 디버깅을 사용하면 문제시 dump를 볼 수 있는데..
비주얼 스튜디오 설치과정중에 응용 프로그램 디버거로 Visual Studio JIT 디버거가 변경되기 때문에
사용할 수 없게 된다.
Dr. Watson을 사용할 수 없도록 설정하는 방법
- 시작, 실행을 차례로 누르고 열기 상자에 regedit.exe를 입력한 다음 확인을 누릅니다.
- 다음 레지스트리 키를 찾아 누릅니다.
HKEY_LOCAL_MACHINE\Software\Microsoft\Windows NT\CurrentVersion\AeDebug참고: 3단계와 4단계는 선택 사항이지만 Dr. Watson의 기본 사용을 복구하려는 경우 필요합니다.
- AeDebug 키를 누른 다음 레지스트리 메뉴의 레지스트리 파일 내보내기를 누릅니다.
- 저장할 레지스트리 파일의 이름과 위치를 입력한 다음 저장을 누릅니다.
- AeDebug 키를 삭제합니다.
디버거 프로그램의 레지스트리 항목은 Windows의 AeDebug 키에 있습니다. Dr. Watson 프로그램은 기본적으로 Windows에 설치되어 있고 응용 프로그램 오류가 발생할 때 실행되도록 구성되어 있습니다(Auto 값에 데이터 값 1로 설정). 기본값은 다음과 같습니다.
값 이름 = Auto
종류 = 문자열(REG_SZ)
데이터 값 = 1 또는 0(기본값은 1)
값 이름 = Debugger
종류 = 문자열(REG_SZ)
데이터 값 = drwtsn32 -p %ld -e %ld -g
참고: 이 데이터 값(drwtsn32 -p %ld -e %ld -g)은 Dr. Watson에만 적용되고 다른 디버거에는 고유한 값과 매개 변수가 있습니다.
Dr. Watson을 사용할 수 있도록 설정하는 방법
- 명령 프롬프트에서 다음 명령줄을 입력한 다음 Enter 키를 누릅니다.
drwtsn32 -i
- 위의 3단계와 4단계에서 만든 .reg 파일을 두 번 누릅니다.
Dr. Watson을 사용할 수 없도록 설정하는 방법
- 시작, 실행을 차례로 누르고 열기 상자에 regedit.exe를 입력한 다음 확인을 누릅니다.
- 다음 레지스트리 키를 찾아 누릅니다.
HKEY_LOCAL_MACHINE\Software\Microsoft\Windows NT\CurrentVersion\AeDebug참고: 3단계와 4단계는 선택 사항이지만 Dr. Watson의 기본 사용을 복구하려는 경우 필요합니다.
- AeDebug 키를 누른 다음 레지스트리 메뉴의 레지스트리 파일 내보내기를 누릅니다.
- 저장할 레지스트리 파일의 이름과 위치를 입력한 다음 저장을 누릅니다.
- AeDebug 키를 삭제합니다.
디버거 프로그램의 레지스트리 항목은 Windows의 AeDebug 키에 있습니다. Dr. Watson 프로그램은 기본적으로 Windows에 설치되어 있고 응용 프로그램 오류가 발생할 때 실행되도록 구성되어 있습니다(Auto 값에 데이터 값 1로 설정). 기본값은 다음과 같습니다.
종류 = 문자열(REG_SZ)
데이터 값 = 1 또는 0(기본값은 1)
값 이름 = Debugger
종류 = 문자열(REG_SZ)
데이터 값 = drwtsn32 -p %ld -e %ld -g
참고: 이 데이터 값(drwtsn32 -p %ld -e %ld -g)은 Dr. Watson에만 적용되고 다른 디버거에는 고유한 값과 매개 변수가 있습니다.
Dr. Watson을 사용할 수 있도록 설정하는 방법
- 명령 프롬프트에서 다음 명령줄을 입력한 다음 Enter 키를 누릅니다.
drwtsn32 -i - 위의 3단계와 4단계에서 만든 .reg 파일을 두 번 누릅니다.
비스타의 경우는 Dr.Watson이 없다. 도움말 찾아보니 다음과 같은 말이..
제어하고 싶다면 XP에서 복사해서 사용하면 된다.
시스템 오류 또는 "크래시" 분석 도구인 Dr. Watson이 이 Windows 버전에서 문제 보고서 및 솔루션으로 바뀌었습니다.
'ETC' 카테고리의 다른 글
최상위 코어 i7 프로세서를 낳은 인텔 네할렘 아키텍처 (0) | 2010.06.10 |
---|---|
유틸::엑셀이용 데이터 입력 (1) | 2010.06.03 |
Active Directory Management (0) | 2009.09.16 |
Trouble Shooting Query Performance Issues Related to Plan Cache in SQL 2005 RTM and SP1 (1) | 2009.07.09 |