728x90
인덱스 최적화 팁
저자: Alexander Chigrik

일반적인 개념
본 글에서는 적절한 인덱스를 사용하여 쿼리의 속도를 향상시키는 방법과 SQL Server가 지원하는 인덱스의 종류 및 특정한 상황에서 인덱스를 사용할 때의 장점과 단점 등에 대해서 얘기하고자 한다.

인덱스는 크게 나누어서 클러스터드 인덱스(Clustered Index)와 넌클러스터드 인덱스(Nonclustered Index)가 있다. 클러스터드 인덱스는 특별한 형태의 인덱스로 테이블에 저장되어 있는 레코드의 물리적인 순서를 재구성한 것이다. 따라서 하나의 테이블은 단 하나의 클러스터드 인덱스만을 가질 수 있다. 클러스터드 인덱스의 최종 노드(Leaf Node)는 데이터 페이지를 가지게 된다.

넌클러스터드 인덱스는 인덱스의 논리적인 순서가 디스크상에 존재하는 레코드의 물리적인 저장 순서와 일치하지 않는 인덱스이다. 넌클러스터드 인덱스의 최종 노드는 데이터 페이지 대신 인덱스 열을 가지고 있다.

클러스터드 인덱스나 넌클러스터드 인덱스를 만들 때에 fill factor 옵션을 사용하면 SQL Server가 각각의 인덱스 페이지를 최대 얼마만큼 사용할 것인지를 지정할 수 있다. 인덱스 페이지에 새로운 열을 추가할 만한 공간이 남아있지 않으면 SQL Server는 새로운 인덱스 페이지를 생성하여 기존의 페이지에 있는 열의 일부를 새로운 페이지로 옮기게 되는데 이 과정을 일컬어 페이지 스플릿(Page Split)이라고 한다. 인덱스의 각 페이지에 빈 공간을 확보하기 위해서 fill factor를 적절히 설정함으로써 페이지 스플릿이 발생하는 회수를 줄일 수 있다. fill factor는 1에서100 사이의 값을 가지며 빈 공간으로 남겨두어야 할 인덱스 페이지의 비율을 나타낸다.

fill factor의 기본값은 0이다. fill factor 0은 fill factor 100과 거의 동일한 의미를 갖는데 한가지 차이라고 한다면 fill factor 0의 경우에는 인덱스 트리의 상위 레벨에 어느 정도의 공간을 남겨둔다는 점이 다르다.

커버링 인덱스(Convering Index)는 쿼리에서 참조하는 컬럼을 모두 포함하는 인덱스를 말한다. 따라서 인덱스에 찾고자 하는 데이터가 모두 포함되어 있기 때문에 SQL Server는 굳이 테이블을 참조할 필요가 없다.

데이터 갱신 작업을 많이 한다면(삽입, 갱신, 삭제) 테이블의 단편화가 심하게 발생하게 된다. 단편화의 정도를 측정하고 싶다면 DBCC SHOWCONTIG 명령을 사용하면 된다.

최적화 팁


모든 인덱스는 삽입, 갱신, 삭제 명령이 수행되는 시간을 증가시키기 때문에 인덱스의 개수가 너무 많아서는 안 된다. 하나의 테이블에 최대 4~5개 이내의 인덱스를 사용하도록 한다. 만약 읽기 전용의 테이블을 사용하는 경우라면 인덱스의 숫자가 많아도 상관없다.

복합 인덱스가 포함하는 컬럼 개수는 가능한 적게 유지해야 한다. 이렇게 하면 인덱스의 크기를 줄일 수 있기 때문에 인덱스를 읽는 데 필요한 읽기 작업의 회수가 감소하게 된다.

문자열 컬럼보다는 숫자 컬럼에 인덱스를 생성하는 편이 좋다.

복합 인덱스(멀티 컬럼 인덱스)를 만드는 경우에는 인덱스 키의 순서가 매우 중요하다. 가장 선택도가 높은 컬럼 일수록 키의 왼쪽 편에 위치하게 하여 선택도를 향상시키는 방향으로 컬럼 순서를 구성해야 한다.

여러 개의 테이블을 조인하고 싶으면 정수 키를 대신 만들어서 이 컬럼에 인덱스를 생성하여 사용하도록 한다.

테이블에 삽입 작업이 많지 않다면 정수 타입의 프라이머리 키를 만들어서 대신 사용하도록 한다.

일정한 범위의 값을 조회하거나 GROUP BY, ORDER BY를 이용하여 결과를 정렬할 필요가 있다면 넌클러스터드 인덱스보다는 클러스터드 인덱스를 사용하는 편이 좋다.

동일한 테이블에 대해서 같은 쿼리를 반복적으로 실행해야 하는 경우에는 커버링 인덱스를 만드는 것을 고려해 보기 바란다.

데이터베이스 내의 어떤 테이블이 인덱스를 필요로 하는지 확인하기 위해서는 SQL Server 프로파일러의 트레이스 마법사(Trace Wizard)를 통해서 “Identify Scans of Large Tables” 트레이스를 이용 하면 된다. 이 트레이스는 어떤 테이블이 인덱스를 사용하지 않고 조회 중인지를 보여 준다.

데이터베이스의 모든 인덱스를 재구성 하려면 아직 문서화되지는 않았지만 sp_Msforeachtable 프로시저를 사용하면 된다. 이 프로시저는 CPU를 사용하지 않거나 작업이 뜸한 시간에 실행되도록 스케줄링을 하도록 한다.

sp_Msforeachtable @command1=”print ‘?’ DBCC DBREINDEX (‘?’)” 
728x90
올바른 순위 정렬 결과를 얻으려면 (1) : 올바른 순위 정렬 결과를 얻으려면


ORDER BY를 실행하여 정렬하면 순위를 간단히 출력할 수 있지만 아쉽게도 같은 값이 존재한다면 같은 순위를 부여해야 한다.
예를 들어 아래와 같은 순위 결과를 출력하고 싶다면 어떤 쿼리를 활용해야 할까?

성적 테이블

순위 이름 점수
1 김진수 99
2 김영은 87
2 김한영 87
4 정진은 65

위의 표에서 나타나듯 김영은씨와 김한영씨는 같은 점수이다. 결국 공동2위로 순위표가 정상으로 출력되었다.
위와 같은 결과를 출력시키기 위해서는 그 사람의 점수보다 성적이 좋은 사람이 몇 명 있는지를 계산해야 한다.
서브쿼리를 활용하여 기술하면 위와 같은 올바른 순위 정렬 결과를 얻을 수 있다.

SELECT ( SELECT COUNT (*) + 1 FROM 성적 WHERE 성적.점수 > S.점수),S.이름, S.점수 FROM 성적 S



먼저 서브 쿼리를 통해 순위값을 구한다. 자신보다 성적이 좋은 사람이 없으면 COUNT(*)의 값은 0이되고
결국 +1을 통해 순위에 1이 리턴된다.

제공 : 코리아인터넷닷컴, a 2001년 11월 19일 
728x90

SQL Server 데이터베이스의 트랜잭션 로그가 예기치 않게 커지는 것을 막는 방법

기술 자료 ID : 873235
마지막 검토 : 2006년 2월 17일 금요일
수정 : 2.0

소개

이 문서에서는 트랜잭션 로그가 허용할 수 없는 한계까지 커질 경우에 수행해야 할 작업을 설명합니다. 트랜잭션 로그가 커지면 Microsoft SQL Server 데이터베이스를 사용할 수 없게 됩니다. 이 문서에서는 또한 트랜잭션 로그 크기가 예기치 않게 커지는 것을 막기 위해 사용할 수 있는 옵션에 대해서도 설명합니다.

위로 가기

추가 정보

SQL Server 2000 및 SQL Server 2005에서 각 데이터베이스에는 데이터 파일과 트랜잭션 로그 파일이 하나 이상 포함되어 있습니다. SQL Server는 데이터를 데이터 파일에 물리적으로 저장합니다. 트랜잭션 로그 파일은 SQL Server 데이터베이스에 수행한 모든 수정 작업의 세부 정보와 각 수정 작업을 수행한 트랜잭션의 세부 정보를 저장합니다. 트랜잭션 무결성은 SQL Server의 근본적이고 본질적인 특성이므로 SQL Server에서는 트랜잭션의 세부 정보를 로깅하는 기능을 해제할 수 없습니다.

트랜잭션 로그 파일은 논리적으로 가상 로그 파일이라고 하는 보다 작은 세그먼트로 나뉘어집니다. SQL Server 2000에서는 필요한 경우 트랜잭션 로그 파일 크기가 커지도록 구성할 수 있습니다. 트랜잭션 로그 크기가 커지도록 사용자가 제어하거나, 사용 가능한 모든 디스크 공간을 사용하도록 구성할 수도 있습니다. 트랜잭션 로그 파일을 자르거나 늘리는 등 SQL Server에서 트랜잭션 로그 파일 크기를 수정하는 모든 작업은 가상 로그 파일 단위로 수행됩니다.

트랜잭션 로그 파일이 자동으로 커지도록 옵션을 설정한 상태에서 SQL Server 데이터베이스의 해당 트랜잭션 로그 파일이 채워지면 트랜잭션 로그 파일은 가상 로그 파일 단위로 커집니다. 트랜잭션 로그 파일 크기가 아주 커져서 디스크 공간이 부족해질 수도 있습니다. 트랜잭션 로그 파일이 사용 가능한 디스크 공간을 모두 사용하여 더 이상 커질 수 없어지면 데이터베이스에서 데이터를 더 이상 수정할 수 없습니다. 또한 트랜잭션 로그 크기 증가에 따른 공간 부족으로 인해 SQL Server가 데이터베이스를 주의 대상으로 표시할 수 있습니다.

트랜잭션 로그 파일 크기가 예기치 않게 커질 수 있는 시나리오에 대한 자세한 내용은 Microsoft 기술 자료의 다음 문서를 참조하십시오.
317375 (http://support.microsoft.com/kb/317375/) INF: SQL Server에서 트랜잭션 로그가 예기치 않게 커지거나 가득 찬다

위로 가기

트랜잭션 로그 크기 줄이기

트랜잭션 로그 크기가 허용할 수 없는 한계까지 커지는 상황에서 복구하려면 트랜잭션 로그 크기를 줄여야 합니다. 이렇게 하려면 트랜잭션 로그에서 비활성 트랜잭션을 잘라내고 트랜잭션 로그 파일을 축소해야 합니다.

참고 트랜잭션 로그는 데이터베이스의 트랜잭션 무결성을 유지하는 데 매우 중요합니다. 따라서 데이터베이스와 트랜잭션 로그의 백업 복사본을 만든 후에도 트랜잭션 로그 파일을 삭제하지 않아야 합니다.

트랜잭션 로그에서 비활성 트랜잭션 잘라내기

트랜잭션 로그 크기가 허용할 수 없는 한계까지 커지면 즉시 트랜잭션 로그 파일을 백업해야 합니다. 트랜잭션 로그 파일의 백업 복사본을 만드는 동안 SQL Server는 트랜잭션 로그의 비활성 부분을 자동으로 잘라냅니다. 트랜잭션 로그 파일의 비활성 부분에는 완료된 트랜잭션도 포함되므로 복구 프로세스 동안 SQL Server는 더 이상 트랜잭션 로그 파일을 사용하지 않습니다. 또한 트랜잭션 로그 크기가 계속 커져서 추가 공간을 사용하도록 허용하는 대신 이렇게 잘라낸 트랜잭션 로그의 비활성 공간을 재사용합니다.

트랜잭션 로그의 백업 복사본을 만들 때 고려해야 할 문제와 트랜잭션 로그 백업을 복원할 때 고려해야 할 문제에 대한 자세한 내용은 SQL Server 온라인 설명서의 다음 항목을 참조하십시오.
트랜잭션 로그 백업
트랜잭션 로그 백업 및 복원
또한 Truncate 메서드를 사용하여 트랜잭션 로그 파일에서 비활성 트랜잭션을 삭제해도 됩니다. 트랜잭션 로그를 자르는 방법에 대한 자세한 내용은 SQL Server 온라인 설명서의 "트랜잭션 로그 잘라내기" 항목을 참조하십시오.

중요 수동으로 트랜잭션 로그 파일을 자른 후에는 트랜잭션 로그 백업을 만들기 전에 전체 데이터베이스 백업을 만들어야 합니다.

트랜잭션 로그 파일을 자를 때 발생할 수 있는 문제에 대한 자세한 내용은 Microsoft 기술 자료의 다음 문서를 참조하십시오.
62866 (http://support.microsoft.com/kb/62866/) INFO: SQL 트랜잭션 로그가 잘리지 않는 이유

트랜잭션 로그 파일 축소

백업 작업이나 Truncate 메서드는 로그 파일 크기를 줄이지 않습니다. 트랜잭션 로그 파일의 크기를 줄이려면 트랜잭션 로그 파일을 축소해야 합니다. 요청한 크기로 트랜잭션 로그 파일을 축소하고 사용하지 않는 페이지를 제거하려면 DBCC SHRINKFILE 연산을 사용해야 합니다. DBCC SHRINKFILE Transact-SQL 문은 로그 파일 내부의 비활성 부분만 축소할 수 있습니다.

참고 DBCC SHRINKFILE Transact-SQL 문은 단독으로 로그를 자르고 로그 파일 내부에서 사용된 공간을 축소하지 못합니다.

트랜잭션 로그 파일을 축소하는 방법에 대한 자세한 내용은 SQL Server 설명서의 다음 항목을 참조하십시오.
트랜잭션 로그 축소
DBCC SHRINKFILE
SQL Server 2000에서 트랜잭션 로그 파일을 축소하는 방법에 대한 자세한 내용은 Microsoft 기술 자료의 다음 문서를 참조하십시오.
272318 (http://support.microsoft.com/kb/272318/) INF: SQL Server 2000에서 DBCC SHRINKFILE을 사용하여 트랜잭션 로그를 축소하는 방법
트랜잭션 로그 파일을 축소할 때 발생할 수 있는 문제에 대한 자세한 내용은 Microsoft 기술 자료의 다음 문서를 참조하십시오.
814574 (http://support.microsoft.com/kb/814574/) PRB: 오류 메시지: "... 로그 파일을 축소할 수 없습니다."가 트랜잭션 로그 파일을 축소할 때 발생한다
324432 (http://support.microsoft.com/kb/324432/) PRB: DBCC SHRINKFILE 및 SHRINKDATABASE 명령이 부족하게 채워진 Text, Ntext 또는 Image 열 때문에 작동하지 않을 수 있다

위로 가기

트랜잭션 로그 파일이 예기치 않게 커지는 것을 막기

트랜잭션 로그 파일이 예기치 않게 커지는 것을 막으려면 다음 방법 중 하나를 사용하십시오.
트랜잭션 로그 파일이 자동으로 커지지 않도록 트랜잭션 로그 파일 크기를 큰 값으로 설정합니다.
최적의 메모리 크기를 철저하게 계산한 후 백분율 대신 메모리 단위를 사용하여 트랜잭션 로그 파일의 자동 증가 옵션을 구성합니다.

자동 증가 옵션을 구성할 때 고려해야 할 문제에 대한 자세한 내용은 Microsoft 기술 자료의 다음 문서를 참조하십시오.
315512 (http://support.microsoft.com/kb/315512/) INF: SQL Server에서 자동 증가와 자동 축소 구성을 위한 고려 사항
복구 모델을 변경합니다. 재해나 데이터 손상이 발생한 경우에는 데이터베이스의 트랜잭션 무결성과 데이터 일관성이 유지되도록 데이터베이스를 복구해야 합니다. 데이터베이스에 있는 데이터의 중요도에 따라 아래의 복구 모델 중 하나를 사용하여 데이터 백업 방법과 어떤 것이 데이터 손실에 노출되는지 확인할 수 있습니다.
단순 복구 모델
전체 복구 모델
대량 로그 복구 모델
단순 복구 모델을 사용하면 데이터베이스의 최신 백업으로 데이터베이스를 복구할 수 있습니다. 전체 복구 모델이나 대량 로그 복구 모델을 사용하면 트랜잭션 로그 파일 백업으로 데이터베이스를 복원하여 실패가 발생한 시점으로 데이터베이스를 복구할 수 있습니다.

기본적으로 SQL Server 2000 및 SQL Server 2005에서는 SQL Server 데이터베이스에 대한 복구 모델이 전체 복구 모델로 설정되어 있습니다. 전체 복구 모델에서는 트랜잭션 로그 파일 크기가 데이터베이스 크기와 불균형적으로 커지는 것을 막기 위해 트랜잭션 로그를 정기적으로 백업합니다. 그러나 트랜잭션 로그를 정기적으로 백업하지 않으면 트랜잭션 로그 파일 크기가 디스크를 채울 정도로 커져서 SQL Server 데이터베이스에서 데이터를 수정하지 못할 수 있습니다.

재해 복구 작업 동안 트랜잭션 로그 파일을 사용하지 않으려면 전체 복구 모델에서 단순 복구 모델로 변경할 수 있습니다.
정기적으로 트랜잭션 로그 파일을 백업하여 트랜잭션 로그에서 비활성 트랜잭션을 삭제합니다.
트랜잭션을 작게 설계합니다.
커밋되지 않은 트랜잭션이 무기한 계속 실행되지 않도록 합니다.
매일 실행되도록 통계 업데이트 옵션을 예약합니다.
프로덕션 환경에서 작업 부하 성능을 향상시키기 위해 인덱스 조각을 모으려면 DBCC DBREINDEX Transact-SQL 문 대신 DBCC INDEXDEFRAG Transact-SQL 문을 사용합니다. SQL Server 데이터베이스가 전체 복구 모드에 있을 때 DBCC DBREINDEX 문을 실행하면 트랜잭션 로그가 상당히 증가할 수 있습니다. 또한 DBCC INDEXDEGRAG 문은 DBCC DBREINDEX 문과 달리 잠금을 장시간 유지하지 않습니다.

SQL Server 2000에서 인덱스 조각을 모으는 방법에 대한 자세한 내용은 다음 Microsoft 웹 사이트를 참조하십시오.
http://www.microsoft.com/technet/prodtechnol/sql/2000/maintain/ss2kidbp.mspx (http://www.microsoft.com/technet/prodtechnol/sql/2000/maintain/ss2kidbp.mspx)(영문)
데이터베이스 유지 관리 계획의 일부 작업으로 DBCC DBREINDEX 문을 실행해야 할 경우에는 이 작업을 여러 개의 작업으로 나누어야 합니다. 또한 각 작업 실행 사이에 자주 트랜잭션 로그를 백업해야 합니다.

위로 가기

참조

복구 프로세스 동안 추가 디스크 공간 요구 문제를 해결하는 방법에 대한 자세한 내용은 SQL Server 온라인 설명서의 "디스크 공간 부족" 항목을 참조하십시오. 트랜잭션 로그 아키텍처에 대한 자세한 내용은 SQL Server 온라인 설명서의 다음 항목을 참조하십시오.
트랜잭션 로그 아키텍처
트랜잭션 로그 논리 아키텍처
트랜잭션 로그 물리 아키텍처
SQL Server 2000의 복구 모델에 대한 자세한 내용은 SQL Server 온라인 설명서의 다음 항목을 참조하십시오.
복구 모델 선택
단순 복구
전체 복구
대량 로그 복구
복구 모델 전환





Microsoft 제품 관련 기술 전문가들과 온라인으로 정보를 교환하시려면 Microsoft 뉴스 그룹 (http://support.microsoft.com/newsgroups/default.aspx)에 참여하시기 바랍니다.

위로 가기


본 문서의 정보는 다음의 제품에 적용됩니다.
Microsoft SQL Server 2000 Standard Edition
Microsoft SQL Server 2005 Standard Edition
Microsoft SQL Server 2005 Developer Edition
Microsoft SQL 2005 Server Enterprise
Microsoft SQL Server 2005 Express Edition
Microsoft SQL 2005 Server Workgroup

+ Recent posts