2010-02-08 2 views
0

SQL 2005 (표준판) 데이터베이스를 사용하는 데이터 기반 웹 응용 프로그램을 작성 중입니다. 테이블의SQL 2005 데이터베이스의 대규모 테이블이 더 나은 성능을 필요로합니다!

하나는 오히려 큰 (약 30 열 800 만 + 행 큰)입니다. 테이블 크기는 분명히 저장된 procs를 통해 테이블에서 항목을 선택하는 웹 사이트의 성능에 영향을 미칩니다. 테이블이 인덱싱되었지만 테이블의 많은 양의 행 때문에 성능이 좋지 않습니다 - 이것은 문제의 일부입니다 - 테이블이 업데이트 된 것과 똑같이 읽혀 지므로 인덱스를 추가/제거 할 수 없습니다. 운영이 악화됩니다.

내가 여기에있는 목표 테이블에서 항목을 선택할 때 성능을 향상하는 것입니다. 이 테이블에는 '현재'데이터와 오래되거나 거의 처리되지 않은 데이터가 있습니다. 이 단계에서 우리가 생각할 수있는 가장 효과적인 해결책은 이전 항목 (2005 년 1 월 1 일) 이전의 항목과 2005 년 1 월 1 일 이전의 항목에 대한 항목 중 하나 인 2로 표를 분리하는 것입니다. .

우리는 분산 분할 뷰 같은 것들을 알고 -하지만 이러한 모든 기능은 클라이언트가 (그리고 아니, 그것을 하드웨어를 던지는 중 하나 일이 일어날되지 않음) 구입하지 않습니다 Enterprise Edition을 필요로합니다.

답변

3

그것을 할 수있는 올바른 방법으로 냄새가없는 경우에도 당신은 항상 "가난한 사람의 분할/DPV"자신의 롤 할 수 있습니다. 동일한 구조, 동일한 인덱스 -

  1. 현재 연도의 데이터를 새 테이블을 만들기 : 이것은 단지 광범위한 개념적인 접근 방법이다. 두 테이블 모두에 쓰도록 기본, 큰 테이블에 쓰는 저장 프로 시저를 조정하십시오 (일시적으로). 스토어드 프로 시저의 로직을 IF CURRENT_TIMESTAMP> = '[시간이없는 일부 전체 날짜]'라고 지정하는 것이 좋습니다. 이렇게하면 로깅을 시작하는 프로 시저의 변경보다 먼저이 테이블의 데이터를 백필 할 수 있습니다.

  2. 는 기본 테이블에서 SELECT INTO를 사용하여 역사에 매년 새 테이블을 만듭니다. 현재 데이터베이스의 오버 헤드를 피하기 위해 동일한 인스턴스의 다른 데이터베이스에서이 작업을 수행 할 수 있습니다. 내역 데이터는 변경되지 않습니다. 따라서이 다른 데이터베이스에서는 완료되었을 때만 읽을 수 있습니다 (읽기 성능이 크게 향상 될 것입니다).

  3. 일단 전체 테이블의 복사본이 있으면 현재 연도와 현재 데이터베이스 간의 UNION ALL을 사용하여 2005를 현재 연도로 참조하는 다른 뷰를 현재 연도를 참조하는 뷰를 만들 수 있습니다 2005 년 이전의 테이블)를 참조하는 다른 테이블 (예 :> 2005) 및 세 개의 테이블 세트 (언급 된 테이블 및 2005 년 이전 테이블) 모두를 참조하는 테이블이 있습니다. 물론 당신은 이것을 좀 더 깨뜨릴 수 있습니다.하지만 나는 그 개념을 최소한으로 유지하기를 원했습니다.

  4. 데이터를 읽는 저장 프로 시저를 "더 똑똑하게"변경하십시오. 요청한 날짜 범위가 현재 역년 내에 있으면 가장 작은보기 만 사용하십시오. 날짜 범위가 2005보다 큰 경우 두 번째보기를 사용하고 세 번째보기를 사용하십시오. 현재 연도에만 관련된 새로운 데이터를 삽입하는 것 이상의 일을하는 경우 비슷한 논리를 따라 작성하는 저장 프로 시저를 수행 할 수 있습니다. 당신이 거대한 테이블에 삽입 중단하고, 모든 것이 작동하는 입증되면, 그것을 삭제하고 디스크 공간을 확보 (그리고에 의해 내가 데이터 파일에 공간을 확보 의미 할 수 있어야한다이 시점에서

  5. (s)를 사용하여 축소 된 db를 수행하지 마십시오. 다시 공간을 사용하게됩니다.

나는 상황의 모든 세부 사항이없는하지만 당신이 질문이나 문제가 있으면 후속하시기 바랍니다.지금 당장 진행되는 프로젝트를 포함하여 여러 가지 마이그레이션 프로젝트에서이 접근 방식을 사용했습니다.

+0

답변 주셔서 감사합니다. 원래 우리는 과거 데이터가 여전히 업데이트 가능하지만 최근에 우리가 읽기 전용으로 만들 수 있음을 알게되었습니다. 그래서 당신의 대답은 좋은 옵션, 건배처럼 들리네. – Scozzard

1

모든 색인을 다시 작성하십시오. 이렇게하면 쿼리 성능이 향상됩니다. 그것을 할 방법 는 here

둘째 DB가 저장되어있는 드라이브에 드 조각을 수행 클러스터 및 클러스터되지 않은 인덱스의 재 구축에 효과 this 및 더 많은 것입니다.

+0

재건/재구성과 같은 색인 유지 관리 작업을 위해서는 다시 작성하기위한 색인과 다시 구성 할 색인을 추측하는 데 도움이되는 유틸리티 중 하나를 사용해야합니다. Michelle Ufford의 스크립트가 있습니다. 곧 새로운 버전이 나올 블로그를보실 수 있습니다. http://sqlfool.com/2009/06/index-defrag-script-v30/ Ola Hallengren의 스크립트는 http : // ola입니다. hallengren.com/ –

+0

일상적인 유지 관리의 일환으로 인덱스를 자주 재구성하고 다시 작성합니다. 인덱스는 최대한 최적화되어 있습니다. 드라이브의 조각 모음 처리가 완료된 것입니다. 시스템은로드 균형 조정이없는 24 시간 시스템이므로 드라이브의 전체 조각 모음을 수행 할 수있을만큼 오래 시스템을 오프라인 상태로 만들 수 없습니다. 그게 이상적은 아니지만, 이상적이지 않은 세상에서의 휴식입니다. – Scozzard

+0

파일에 대한 자동 증가 설정이란 무엇입니까? 파일 시스템 조각화는 자동 증가 설정이 실제로 작거나 디스크 레이아웃이 적절하게 계획되지 않은 경우가 아니면 성능 문제가 될 수 없습니다. –

1

성능으로 인해

800 만 행이 모든 미친 소리하지 않는 테이블의 행의 깎아 지른듯한 금액에 좋지 않습니다. 쿼리 계획을 확인 했습니까? 당신이 실제로 인덱스 컬럼을 업데이트하는

업데이트로

테이블은 똑같이 읽거나 동일하게 읽기와 는에를 삽입?

는 RAM 먼지 저렴하기 때문에 유감

을 (그리고 아니, 그것을 하드웨어를 던지는 중 하나 일이 일어날되지 않음).

+0

귀하의 권리, 800 만 행이 미친되지 않습니다. 그러나이 테이블은 시스템에서 가장 일반적으로 사용되며 읽기 및 쓰기가 자주 발생합니다. 읽기 및 쓰기 모두에 대한 쿼리 계획은 다른 쿼리 최적화 계획으로 인해 비참합니다. 즉, 우리는 어려움에 처해 있습니다. – Scozzard

+0

Re : 읽기/업데이트 예, 저의 글을 쓰고 싶습니다. (삽입 된) -이 테이블에 대한 쓰기 작업은 시스템의 SQL 타임 아웃의 30 %를 담당합니다. 유감스럽게도 이것은 동기식 웹 응용 프로그램이므로 성능이 이미 일반적인 불만 사항이므로 시간 제한을 길게하는 사치가 없으며 이로 인해 더 악화 될 수 있습니다. 우리는 현재의 구조가 계속해서 작동하지 않을 것이며 처음부터 응용 프로그램을 재구성하는 것을 포함하지 않는 최상의 대체 구조를 찾고 있습니다. 이상적으로는 발생하지 않을 것입니다. – Scozzard

+0

Re : RAM - 네 말이 맞아요. 불행히도 계약하는 세계에서 우리는 우리가 원하는만큼 조언 할 수 있지만 궁극적으로 결정은 고객입니다. 그들은 단지 그것을위한 새로운 하드웨어를 구입하고 새로운 새로 고침 (또는 심지어 업그레이 드) 3 년 거리입니다. 어느 시점에서도 DB 구조는 중복 된 기존 데이터와 현재 데이터의 양에 맞게 수정해야합니다. 패치가 아닌 수정을 시도하고 싶습니다. – Scozzard

관련 문제