2014-05-17 1 views
0

SQL 2012 데이터베이스에 응용 프로그램 이벤트를 기록해야합니다. 기본 레코드 구조 요구 사항은 매우 간단합니다.대용량 로그 레코드를 구성하는 올바른 방법은 무엇입니까

CREATE TABLE [dbo].[EventLog] 
(
    [ProcessId] INT NOT NULL, 
    [ApplicationId] INT NOT NULL, 
    [Created] DateTime NOT NULL, 
    CONSTRAINT [PK_EventLog] PRIMARY KEY CLUSTERED ([ProcessId],[ApplicaionId],[Created] ASC) 
) 

성능 문제가 있습니다. 하루에 최대 100 만 개의 이벤트가 생성 될 수 있으며 행 수가 증가하면 삽입 성능이 저하되어 로거가 이벤트를 따라갈 수 없습니다.

중간 중간 일반 텍스트 파일에 이미 로그 일괄 처리를 작성한 다음 주 응용 프로그램 로거와 별도로 실행되는 서비스를 사용하여 이러한 파일을 처리하고 있습니다.

나는 그 범인이 색인을 유지하고 있을지도 모른다고 생각하며이 문제에 대해보다 효율적으로/효율적으로 접근 할 수있는 방법에 대한 조언을 드리고 싶습니다.

조언을 주시면 감사하겠습니다.

+0

범위 파티셔닝을 고려 했습니까? – Lennart

+0

나는 그렇지 않다. 솔직히 말해서, 나는 그 용어에 대해 들어 보지 못했지만 조사 할 것이다. - 고마워. – Neilski

답변

1

성능 문제의 주요 원인은 아마도 클러스터 된 인덱스를 구성하는 열의 선택 일 것입니다.

클러스터 된 인덱스에서 데이터는 실제로 인덱스 키 열에 정의 된 순서대로 인덱스의 리프 수준 페이지에 저장됩니다. 따라서 귀하의 테이블에서 데이터는 ProcessID, ApplicationID, Created 순서로 저장됩니다.

귀하의 데이터를 보지 않고도, 다양한 ProcessIDApplicationID 초 동안 시간이 지남에 따라 로그 항목이 생성되고 있다고 가정합니다. 이 경우 모든 삽입에 대해 SQL은 실제로 각 로그 항목을 로그 테이블의 중간 지점에 삽입합니다. SQL Server가 테이블 끝에 레코드를 삽입하는 것보다 시간이 많이 걸립니다. 또한 삽입 된 레코드가 해당 페이지에 맞지 않을 경우 페이지 분할이 발생하여 클러스터 된 인덱스가 조각화되어 성능을 더욱 저하시킵니다.

이상적으로 클러스터링 키는 가능한 한 작고 고유 한 것이어야합니다. 따라서 한 가지 방법은 ID로 새 ID 열을 만들고 그 위에 클러스터 된 인덱스를 만드는 것입니다. 예 :

+1

시몬 감사합니다, 이것이 정말로 문제였습니다. 세 가지 데이터 필드에 대한 개별 인덱스를 제안하고 추가하면서 간단한 PK를 추가했으며 이제 새 레코드를 삽입하기위한 일관된 실행 시간을보고 있습니다. 조언과 설명에 감사드립니다. – Neilski