부하가 있는 동안 기본값으로 열을 추가하는 가장 좋은 방법
기본값과 제약 조건이 null이 아닌 테이블에 열을 추가하는 경우.단일 문으로 실행하는 것이 좋습니까, 아니면 데이터베이스가 로드되는 동안 단계별로 분할하는 것이 좋습니까?
ALTER TABLE user ADD country VARCHAR2(4) DEFAULT 'GB' NOT NULL
대
ALTER TABLE user ADD country VARCHAR2(2)
UPDATE user SET country = 'GB'
COMMIT
ALTER TABLE user MODIFY country DEFAULT 'GB' NOT NULL
성능은 사용하는 Oracle 버전에 따라 달라집니다.잠금은 어차피 생성됩니다.
버전 <= Oracle 11.1인 경우 #1은 #2와 동일합니다.어쨌든 그것은 느립니다.Oracle 11.2부터 Oracle은 첫 번째 명령문(명령 하나로 모든 것을 수행)에 대해 최적화된 기능을 도입했습니다.명령을 변경할 필요는 없습니다. Oracle은 다르게 작동합니다.각 실제 행을 업데이트하는 대신 데이터 사전에만 기본값을 저장합니다.
그러나 과거에 이 기능과 관련된 버그가 몇 가지 발생했음을 말씀드리고 싶습니다(Oracle 11.2.0.1).
- direct=를 사용하여 내보내기를 수행한 경우 기존 가져오기 실패y
- 병합 문에서 ORA-600을 발생시킬 수 있음 [13013](내부 오라클 오류)
- 이러한 테이블을 사용하는 쿼리의 성능 문제
현재 버전 11.2.0.3에서는 이 문제가 해결되었다고 생각하므로 이 기능을 사용하는 것이 좋습니다.
얼마 전에 우리는 같은 문제에 대한 가능한 해결책을 평가했습니다.이 프로젝트에서는 테이블에 있는 모든 인덱스를 제거하고 변경 작업을 수행한 후 인덱스를 다시 복원해야 했습니다.
시스템에서 테이블을 사용해야 하는 경우 DBMS_Redefinition이 유일한 선택입니다.
언급URL : https://stackoverflow.com/questions/10633960/best-way-to-add-column-with-default-value-while-under-load
'programing' 카테고리의 다른 글
Firebase Firestore의 수집 스냅샷 항목 매핑 (0) | 2023.07.11 |
---|---|
잘못된 정방향 참조 또는 컴파일되지 않은 형식에 대한 참조 (0) | 2023.07.11 |
PL/SQL 저장 프로시저의 AST(추상 구문 트리)에 액세스하려면 어떻게 해야 합니까? (0) | 2023.07.11 |
스프링 부트 실행 파일 병을 추출할 수 없는 이유는 무엇입니까? (0) | 2023.07.11 |
베어러 토큰이 필요한 API를 사용하여 Python에서 API 호출하기 (0) | 2023.07.11 |