2010-01-22 7 views
1

피사체가 완전히 내가 달성하기 위해 노력하지만, 내가 설명 할 수있는 무슨 전달 확실하지 : 우리는 스토리지 백엔드로 오라클을 사용하는 응용 프로그램을 구축하고오라클 데이터 버전 관리/분할 전략/모범 사례

. 매년, 지난 해 데이터 세트는 "Archived"가 될 것이고, 새로운 인스턴스가 생성되어 처음부터 채워질 것입니다. 동일한 스키마 내에서이 작업을 수행하기위한 옵션은 무엇입니까?

  1. 버전 정보를 레코드 수준으로 유지하십시오 (우리는 사용하기에 너무 느릴 것으로 생각됩니다).
  2. 테이블 수준에서 버전 정보를 유지하십시오. 따라서 새로운 버전마다 테이블을 새로 만들지 만 새 버전 접두어로 다시 만듭니다. (우리는 코드로 모든 것을 할 수 있기 때문에이 솔루션을 좋아합니다.)
  3. ?

우리가 Oracle에서이를 달성 할 수있는 파티션/특성/이름 공간과 같은 것이 없는가?

제 오라클 경험이 다소 제한적이라면, 어떤 도움을 주시면 매우 감사하겠습니다!

+0

일단 데이터가 보관되면 데이터에 액세스해야합니까? 결합 된 여러 해 데이터 세트를보고 해 주시겠습니까? –

+0

예 데이터는 경우에 따라 액세스되고 기록됩니다. – twiga

+0

테이블 디자인에 "YEAR"을 키로 포함시켜야하는 것 같습니다. 예를 들어 CUSTOMER 테이블과 같이 지워지지 않는 테이블이 없습니까? –

답변

1

RDBMS 개념 모델은 임시 데이터 버전을 유지하는 데 그리 좋지 않습니다. 이런 점에서 오라클이 부족한 것은 아닙니다.

레코드 수준의 버전 정보를 유지하는 것이 왜 느리다고 생각하는지 분명하지 않습니다. 새 버전을 만드는 데 너무 느립니까? 아니면 정기적 인 작업 중에 데이터 검색에 관해서는 너무 느린가?

다음은 수행 방법입니다.

create table customers 
(id number not null primary key 
    , customer_ref number not null unique key 
    , name varchar2(30) not null) 
/

v 전화 해당하는이과 같습니다 :

을 CUSTOMER_REF의 비즈니스 키 나는 일반적으로 (I 공간의 이유로 축약 구문이 아닌 최선의 방법을 사용하고) 이런 식으로 구축 할 수있는 테이블 고객을 감안할 때
create table customers 
(id number not null primary key 
    , customer_ref number not null 
    , version_number number 
    , name varchar2(30) not null 
    , constraint whatever unique (customer_ref, version_number)) 
/

이것은 VERSION_NUMBER의 현재 버전을 null로 유지하고 보관시에만 채우는 방식으로 작동합니다. 모든 조회는 and version_number is null을 포함해야합니다. 약간의 어려움이있을 수 있으며 추가로 작성한 색인에이 열을 포함해야 할 수도 있습니다.

분명히 동일한 테이블에 레코드의 모든 버전을 유지하면 성능에 영향을 줄 수있는 테이블 크기가 증가합니다. 오라클의 파티셔닝 옵션은 여기서 확실히 도움이 될 수 있습니다. 또한 내년의 데이터 세트를 만드는 데 필요한 깔끔한 방법을 제공합니다. 그러나 Enterprise License를 기반으로 추가 비용이 발생하므로 값 비싼 옵션입니다. Find out more..

가장 많은 시간을 소비하는 측면은 새로운 버전의 테이블에서 외래 키 관계를 관리하는 것입니다. 합성 기본 키를 사용한다고 가정하면 아카이브 프로세스는 새 ID를 생성 한 다음 참조하는 외래 키의 새 버전에서 종속 레코드에 종속 된 키를 생성해야합니다.

이 점에 대해 생각하면 각 버전에 대한 탁월한 테이블이 매우 매력적으로 보입니다.그 보관 당신은 버전 테이블을 작성하는 동안 다운 타임을 방지 할 수 있습니다 단순히

create table customers_n as select * from customers; 

의 프로세스가되도록 사용의 용이성을 위해 나는 유엔 - 접두사 현재 버전을 유지하는 것입니다. 이 경우 아카이브 전환에 이르는 동안 테이블의 상태를 캡처하기 위해 구체화 된보기를 사용할 수 있습니다. 시계가 12가되면 새로 고침을 끌 수 있습니다. (경고 : 즉석에서 생각하고 있습니다. 구매하기 전에 시도한 적이 없습니다.)

여러 테이블 (및 파티션)의 장점 중 하나는 보관 된 레코드를 읽기 전용으로 이동할 수 있다는 것입니다 테이블 스페이스. 이렇게하면 원하지 않는 변경 사항이 발생하지 않을뿐만 아니라 후속 백업에서 제외 할 수 있습니다.

편집

난 당신이 보관 된 데이터가 occasionbally 수정 될 수 있다는 댓글을 달았 알 수 있습니다. 읽기 전용 테이블 스페이스로 이동하는 것은 불가능합니다.

+0

>> 에있는 버전 정보를 유지한다고 생각하는 이유가 명확하지 않습니다. >> 기록 수준이 너무 느립니다. 새 >> 버전을 만드는 데 너무 느립니까? >> 일반 >> 작업 중 데이터 검색시 너무 느립니다. 정기적인 검색 작업 중에 너무 느려지지만 너무 느린 것에 대한 내 인식은 전혀 사실에 근거하지 않고 전적으로 위장감이 있다고 말해야합니다. 우리는 클라이언트에게 파티셔닝 옵션이 있는지 확인하기 위해 프로빙 중이며, 실패 할 경우 테이블 버전 관리 전략을 진행합니다. 의견을 보내 주셔서 감사합니다. – twiga

0

APC에서 말한 것에 "네임 스페이스"를 묻는 것에 관한 유일한 추가 사항이 있습니다.

Oracle의 네임 스페이스는 스키마이므로 각 스키마에서 동일한 개체 이름을 가질 수 있습니다.

물론이 모든 것은 앱이 여러 버전에 액세스해야하는 방법에 따라 다르지만 동일한 스키마의 테이블 버전을 유지 관리하기 위해 일종의 명명 규칙을 사용하기 전에 매년 다른 스키마를 사용해야합니다. 이유는, 결국 당신은 악몽을 가질 것입니다. 최소한 다른 스키마가 있으면 모든 DDL이 동일 할 수 있으며 객체에 대한 모든 참조는 동일하며 ER 모델러 및 쿼리 도구와 같은 도구는 해당 스키마의 컨텍스트 내에서 작동합니다. 데이터 모델이 바뀌기 때문에 어느 시점에서 비교 도구를 실행해야 할 수도 있습니다. 그리고 모든 테이블의 이름이 펑키 (phyky)로되어 있고 어떤 버전의 포스트 픽스가 있으면 잘 작동하지 않습니다.

스키마 추가 touser/touser 또는 remap_schema 옵션을 사용하여 내보내기 또는 데이터 펌프로 신속하게 복사/이동 할 수 있으므로 새 버전에서 마지막 연도 데이터 정리를 제외하고 많은 코드가 필요하지 않습니다. .

스키마는 "컨테이너"로 매우 유용하며 호스트하는 대부분의 응용 프로그램에는 스키마 수준의 권한 만 있으므로 인스턴스 간 또는 인스턴스 간 이동이 쉽고 응용 프로그램이 여러 개 복사 될 수 있음을 보증합니다. 동일한 인스턴스에서 나란히 호스팅 될 수 있습니다.

0

년 사이의 스키마 변경 일 수 있습니다. 예를 들어, 2010 년에는 열이 15 개이지만 2011 년에는 열을 추가합니다. 그렇다면 동일한 애플리케이션이 2010 년과 2011 년 데이터 모두에서 작동합니다.

스키마가 정적 인 경우 'YEAR'열이있는 테이블로 이동하고 VPD/RLS/FGAC을 사용하여 YEAR = '2010'조건자를 적용하십시오.

성능에 문제가있는 경우 파티셔닝에만 신경을 써야합니다.

-1

1) 1 년 단위로 간격을두고 행의 일부 날짜 필드를 지정합니다.

2) 각 테이블 끝 부분에 추가하고 시퀀스 및 트리거를 채 웁니다.

3) 그런 다음이 연도를 구분하여 연도를 구분하십시오.

관련 문제