Oracle DELETE 성능 향상 전략
Oracle 11g 설치가 확대되기 시작했습니다.이 데이터베이스는 클러스터에서 실행되는 병렬 최적화 시스템의 백엔드입니다.프로세스에 대한 입력은 최적화 단계의 출력과 함께 데이터베이스에 포함됩니다.입력에는 원격 구성 데이터와 일부 이진 파일(11g의 SecureFiles 사용)이 포함됩니다.출력에는 현재 DB에 저장된 1D, 2D, 3D 및 4D 데이터가 포함됩니다.
DB 구조:
/* Metadata tables */
Case(CaseId, DeleteFlag, ...) On Delete Cascade CaseId
OptimizationRun(OptId, CaseId, ...) On Delete Cascade OptId
OptimizationStep(StepId, OptId, ...) On Delete Cascade StepId
/* Data tables */
Files(FileId, CaseId, Blob) /* deletes are near instantateous here */
/* Data per run */
OnedDataX(OptId, ...)
TwoDDataY1(OptId, ...) /* packed representation of a 1D slice */
/* Data not only per run, but per step */
TwoDDataY2(StepId, ...) /* packed representation of a 1D slice */
ThreeDDataZ(StepId, ...) /* packed representation of a 2D slice */
FourDDataZ(StepId, ...) /* packed representation of a 3D slice */
/* ... About 10 or so of these tables exist */
리퍼 스크립트는 매일 제공되며 다음과 같은 사례를 찾습니다.DeleteFlag = 1
그리고 계속 진행합니다.DELETE FROM Case WHERE DeleteFlag = 1
캐스케이드가 계속되도록 허용합니다.
이 전략은 읽기/쓰기에 매우 효과적이지만, 이제 데이터를 삭제해야 할 때 우리의 기능을 능가하고 있습니다!케이스 삭제는 크기에 따라 최대 20-40분이 소요되며 아카이브 공간에 과부하가 걸리는 경우가 많습니다.제품의 다음 주요 버전은 문제를 해결하기 위해 "처음부터" 접근 방식을 취할 것입니다.다음 부 버전은 데이터베이스에 저장된 데이터 범위 내에 있어야 합니다.
따라서 마이너 릴리스의 경우 삭제 성능을 향상시키고 데이터베이스를 적당히 변경할 수 있는 접근 방식이 필요합니다.
- REF 파티셔닝, 그러나 문제는 어떻게 하는 것입니까?는 INTERVAL을 저을는인하싶습다니에 하고 .
Case
나머지는 REF입니다. 하지만 지원되지 않습니다.수동으로 파티션을 분할할 수 있는 방법이 있습니까?OptimizationRun
타고CaseId
방아쇠를 통해서? - 삭제에 대한 보관/재실행 로그를 사용하지 않도록 설정하시겠습니까?이것과 어울리는 힌트를 찾을 수 없습니다.그것이 실현 가능한지 조차 확실하지 않습니다.
-
자르기?이 경우 복잡한 테이블 설정이 필요할 수 있습니다.하지만 제가 선택할 수 있는 모든 것을 고려하고 있지는 않을 수도 있습니다.(대답당, 타격)
문제를 설명하는 데 도움이 되는 사례당 데이터의 범위는 15MiB에서 1.5GiB이며, 20K에서 2M 행입니다.
업데이트: 현재 DB 크기는 ~1.5입니다.TB.
데이터를 삭제하는 것은 데이터베이스에 엄청난 일입니다.이미지를 생성하기 전에 인덱스를 업데이트하고 redo 로그를 작성하고 데이터를 제거해야 합니다.이것은 느린 과정입니다.이 작업을 수행할 수 있는 창이 있는 경우 원하는 데이터를 포함하는 새 테이블을 만드는 것이 가장 쉽고 빠릅니다.이전 테이블을 삭제하고 새 테이블의 이름을 변경합니다.이를 위해서는 몇 가지 설정 작업이 필요하며, 이는 명백하지만 매우 가능합니다.한 단계 덜 극단적인 방법은 삭제하기 전에 인덱스를 삭제하는 것입니다.저는 CTAS(Create Table As Select from)에 투표하여 새로운 테이블을 구축할 것입니다.좋은 파티셔닝 스키마가 도움이 될 것입니다. 다음 릴리스에서는 Oracle이 인터벌 파티셔닝과 참조 파티셔닝을 결합할 수 있습니다.그것은 매우 좋을 것입니다.
삭제에 대해 로깅...을 비활성화할 수 없지만 CTAS에서 로깅을 사용할 수 있습니다.준비가 되면 백업을 하고 대기 데이터베이스가 있는 경우 데이터 파일을 전송해야 합니다.
몇 가지 생각이 있습니다.
모든 외부 키에 대한 색인이 있을 것입니다.ON DELETE CASCADE는 케이스 삭제가 완료될 때까지 행 수준 잠금을 유지하고 인덱스가 없으면 테이블 잠금을 유지합니다. 저는 당연히 매우 느리다고 믿습니다.
지연된 제약 조건이 있습니까?이렇게 하면 Oracle이 다양한 테이블 삭제 작업을 진행하는 속도가 느려질 가능성이 높습니다.
삭제 캐스케이드에 의존하는 대신 영향을 받는 모든 테이블에 대해 개별적으로 삭제를 시도했습니까?쉽지는 않지만, 여러분은 놀랄지도 모릅니다.
편집:
한 가지 더 생각해 보세요.사례 테이블에서 소프트 삭제를 수행하는 것을 고려할 수 있습니다. 즉, 해당 사례가 고려되어야 하는지 여부를 앱에 알려주는 상태 필드가 있습니다.이 플래그는 여러 가지 값을 가질 수 있지만, 활성일 경우 'A', 비활성일 경우 'I'일 수 있습니다.케이스를 항상 다른 테이블에 조인할 때 드라이브/기본 테이블로 사용한다고 가정하면 HARD가 모두 삭제되는 것을 방지할 수 있습니다(때로는 원하는 일정에 따라 정리 작업을 수행할 수도 있습니다).앱은 당연히 이 플래그를 인식해야 하며, 사례 테이블에 다시 참여해야 합니다.당신의 상황에 맞을 수도 있고 안 맞을 수도 있습니다...
CASCADE DELETE
내부적으로 느리게, 어, 행 단위로 실행됩니다.
일부 옵션:
CTAS를 사용하여 제거할 모든 케이스를 스크래치 테이블에 스냅샷으로 저장합니다.그런 다음 제거 작업을 테이블 위에 루프하여 각 사례(및 해당 자식)를 개별적으로 삭제합니다.이는 특히 수백만 개의 하위 행에 부딪힐 경우 불쾌할 수 있습니다.우리는 최근 [비즈니스 수정]에서 문제가 될 만한 자녀 수를 가진 최종 부모를 결정하기 위해 프로세스 중 하나를 변경해야 했습니다.
rownum
문제가 있는 하위 테이블에 대해 삭제 제한을 설정합니다.속도는 빠르지 않지만, 적어도 실행 취소/재실행 관리 관점에서는 트랜잭션의 크기에 상한선을 두는 것이 더 안전합니다.를 사용하는
CASCADE DELETE
편의상, 당신은 항상 그렇게 할 수 없었습니다.종속성 트리 "bottom up"에서 삭제하는 보다 정교한 삭제 루틴을 작성해야 합니다.삭제에서 을 수행할 , 를 범위 할 수 있습니다.
DeleteFlag
합니다.BY REFERENCE
MOVENT.를 .삭제 시 할 때 실행 하지만, 입니다.DeleteFlag = 1
그 이상은 아닙니다.스토리지를 추가하는 것은 상대적으로 저렴합니다.날짜 기반 보존 옵션이 있는 경우 이 옵션을 사용하고 소프트 삭제 옵션을 사용하여 응용 프로그램 프런트 엔드에서 데이터를 숨깁니다.우아하지는 않지만, 그렇다면, 그것도 그렇고요.
CASCADE DELETE
.
활성 데이터베이스에는 권장되지 않습니다.
- 삭제 속도가 느린 테이블을 참조하는 외부 키 제약 조건을 비활성화했습니다.
- 삭제를 실행했습니다.
- 외부 키를 다시 활성화했습니다.
Enterprise Manager를 사용하여 AWR 보고서를 만들고 시스템의 병목 현상에 대한 자세한 지침을 제공하는 statspack 분석기를 통해 실행합니다.AWR 보고서는 데이터베이스가 특정 시간 동안 수행한 작업과 소요 시간에 대한 모든 종류의 데이터를 포함하는 텍스트 파일입니다.이 통계 팩 분석기는 자동 DBA가 수행해야 할 작업을 알려줍니다.
Statspack Analyzer에서 유용할 수 있다는 메시지를 표시하고 I/O를 배포하는 데 사용할 수 있는 유휴 디스크가 몇 개 있을 때까지 파티션을 잊어버립니다.
자를 생각은 하지 마세요.강제로 약속을...
그런데 저는 Statspack Analyzer에 소속되어 있지 않습니다. 하지만 Oracle을 위한 매우 실행 가능한 일반적인 튜닝 방식이라고 생각합니다. 특히 DBA가 없는 경우에는 더욱 그렇습니다.
언급URL : https://stackoverflow.com/questions/5792425/strategy-to-improve-oracle-delete-performance
'programing' 카테고리의 다른 글
Oracle의 STANDARD_HASH와 일치하도록 Python의 정수 해시 (0) | 2023.07.22 |
---|---|
Spring boot 응용 프로그램의 사용자 지정 오류 페이지로 리디렉션하는 중 오류 발생 (0) | 2023.07.22 |
웹 앱을 Spring Boot 2.4로 업그레이드한 후 잘못된 StateException (0) | 2023.07.22 |
이 코드의 의미는 무엇입니까?void(*int sig, void(*func)(int))(int); (0) | 2023.07.22 |
Pandas Data Frame에서 음수를 0으로 대체하는 방법 (0) | 2023.07.22 |