문제

SQL 2005 (Standard Edition) 데이터베이스를 사용하는 데이터 중심 웹 응용 프로그램을 작업 중입니다.

테이블 중 하나는 다소 큽니다 (약 30 개의 열이있는 8 백만 행). 테이블의 크기는 저장된 Procs를 통해 테이블에서 항목을 선택하는 웹 사이트의 성능에 분명히 영향을 미칩니다. 테이블이 색인화되었지만 테이블의 엄청난 양의 행으로 인해 성능이 저하되어 있습니다. 이것은 문제의 일부입니다. 테이블은 업데이트 된 것만 큼 똑같이 읽으므로 색인을 추가 / 제거 할 수 없습니다. 작업이 더 나빠집니다.

내가 여기서 가지고있는 목표는 테이블에서 항목을 선택할 때 성능을 높이는 것입니다. 테이블에는 '현재'데이터와 이전 / 간신히 터치 된 데이터가 있습니다. 이 단계에서 우리가 생각할 수있는 가장 효과적인 솔루션은 표를 2, 즉 하나의 오래된 항목 (특정 날짜 이전, 2005 년 1 월 1 일)과 새로운 항목 (2005 년 1 월 1 일 또는 1 월 1 일 이전)으로 분리하는 것입니다. .

우리는 분산 된 파티션 뷰와 같은 것들을 알고 있지만 이러한 모든 기능에는 고객이 구매하지 않는 Enterprise Edition이 필요합니다.

도움이 되었습니까?

해결책

올바른 방법처럼 냄새가 나지 않더라도 항상 "가난한 사람의 파티셔닝 / DPV"를 굴릴 수 있습니다. 이것은 단지 광범위한 개념적 접근입니다.

  1. 현재 연도의 데이터에 대한 새 테이블을 만듭니다 - 동일한 구조, 동일한 인덱스. 메인, 큰 테이블에 쓰는 저장된 절차를 조정하여 두 테이블에 두 테이블에 씁니다 (일시적으로). 저장된 절차에서 논리를 만드는 것이 좋습니다. current_timestamp> = '[시간이없는 전체 날짜]' -이 테이블의 데이터를 쉽게 백필 할 수있어서 로그를 시작하는 프로 시저의 변경 사항을 사전 데이트 할 수 있습니다.

  2. 메인 테이블에서 선택을 사용하여 매년 역사상 새 테이블을 만듭니다. 현재 데이터베이스의 오버 헤드를 피하기 위해 동일한 인스턴스의 다른 데이터베이스에서이를 수행 할 수 있습니다. 역사적 데이터는 내가 생각하지 않기 때문에이 다른 데이터베이스에서는 완료 될 때만 읽을 수도 있습니다 (읽기 성능을 크게 향상시킬 수 있음).

  3. 전체 테이블의 사본이 있으면 현재 연도를 참조하는 뷰를 만들 수 있습니다. 2005 년에 참조하는 또 다른 뷰는 현재 테이블과 다른 데이터베이스 사이에 Union을 사용하여> = 2005입니다. ), 그리고 다른 하나는 세 세트의 테이블 세트 (언급 된 것, 2005 년 사전 데이트 테이블)를 참조합니다. 물론 당신은 이것을 더욱 분류 할 수 있지만 개념을 최소화하고 싶었습니다.

  4. 데이터를 "똑똑한"것으로 읽는 저장된 절차를 변경 - 요청 된 날짜 범위가 현재 달력 내에 떨어지면 로컬에만 가장 작은 견해를 사용하십시오. 날짜 범위가> = 2005 인 경우 두 번째보기를 사용하면 세 번째보기를 사용하십시오. 현재 연도에만 관련된 새로운 데이터를 삽입하는 것 이상을 수행하는 것 이상을 수행하는 경우 작성하는 저장된 절차로 유사한 논리를 따를 수 있습니다.

  5. 이 시점에서 당신은 대규모 테이블에 삽입을 중지하고 일단 모든 것이 작동하는 것으로 입증되면, 그것을 떨어 뜨리고 디스크 공간을 되 찾으십시오 (그리고 그로 인해 재사용을 위해 데이터 파일의 공간을 확보하는 것을 의미합니다. 수축 DB를 수행하지 않음 - 해당 공간을 다시 사용하므로).

상황에 대한 모든 세부 사항이 없지만 질문이나 우려 사항이 있으면 후속 조치를 취하십시오. 나는 현재 진행중인 프로젝트를 포함하여 여러 마이그레이션 프로젝트 에서이 접근법을 사용했습니다.

다른 팁

테이블의 깎아 지른 행으로 인해 성능이 좋지 않습니다.

8 백만 행은 그다지 미친 소리가 나지 않습니다. 쿼리 계획을 확인 했습니까?

테이블은 업데이트 된 것만 큼 똑같이 읽습니다

실제로 인덱싱 된 열을 업데이트하고 있습니까? 삽입 에게?

(아니, 하드웨어를 던지는 것은 일어나지 않을 것입니다)

램은 흙이 싸기 때문에 유감입니다.

모든 색인을 재건하십시오. 이렇게하면 쿼리의 성능이 향상됩니다. 그것을하는 방법입니다 이것 클러스터 및 비 클러스터 인덱스의 재건에 미치는 영향 여기

둘째, DB가 저장되는 드라이브에서 탈퇴를 수행하십시오.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top