2013-06-26 2 views
3

이 두 부분 질문 :오라클 SQL : 데이터 테이블에서 파티션 이름을 선택하고 절단 파티션

1)은 데이터를 기반으로, SELECT 문을 사용하여 살고있는 파티션의 이름을 검색하는 것이 가능 그것의 ROWID 또는 다른 어떤 식별자?

예 :

SELECT DATA_ID, CATEGORY, VALUE, **PARTITION_NAME** 
FROM MYTABLE 
WHERE CATEGORY = 'ABC' 

2)는 다른 파티션에 저장된 데이터를 삭제하지 않고, 테이블의 단일 파티션을 절단 할 수 있습니까?

나는 10 억 개가 넘는 행이있는 테이블을 가지고 있습니다. 해시는 범주별로 파티션되어 있습니다. 소수의 카테고리 만 데이터에 문제가 있으므로 전체 테이블을 다시 만들지는 못하지만 모든 제약 조건이 비활성 인 경우에도 테이블에서 데이터를 삭제하는 것은 너무 오래 걸립니다.

+0

는 "데이터에 문제가"무엇을 의미합니까 : 사전 테이블 USER_OBJECTS 다음 OBJECT_NAME (= 테이블의 이름)와 subobject_name (= 파티션의 이름)이있다? – APC

+0

@ APC : 일부 데이터가 잘못되었거나 구형이므로 교체해야합니다. – woemler

+0

영향을받는 파티션을 테이블로 교환하고 데이터를 수정하거나 다시 만든 다음 다시 교환 할 수 있습니까? (http://docs.oracle.com/cd/E11882_01/server.112/e26088/statements_3001.htm#i2131250) –

답변

5

rowid에 대한 힌트 덕분에 해결책을 찾았습니다. rowid가 있으면 행이 속한 오브젝트를 판별 할 수 있어야합니다.

4 해시 파티션이 최소한 예 :

CREATE TABLE pt (i NUMBER) 
PARTITION BY HASH (i) (PARTITION pt1, PARTITION pt2, PARTITION pt3, PARTITION pt4); 

INSERT INTO pt SELECT ROWNUM FROM all_objects WHERE ROWNUM < 20; 

지금, 각 행은 ROWID있다. 객체 번호는 DBMS_ROWID.ROWID_OBJECT을 통해 확인할 수 있습니다.

SELECT i, 
     ROWID AS row_id, 
     dbms_rowid.rowid_object(ROWID) AS object_no, 
     (SELECT subobject_name 
      FROM user_objects 
     WHERE object_id = dbms_rowid.rowid_object(pt.ROWID)) AS partition_name 
    FROM pt 
ORDER BY 3; 

I ROW_ID    OBJECT_NO PARTITION_NAME 
6 AAALrYAAEAAAATRAAA 47832 PT1 
11 AAALrYAAEAAAATRAAB 47832 PT1 
13 AAALrYAAEAAAATRAAC 47832 PT1 
9 AAALrZAAEAAAATZAAA 47833 PT2 
10 AAALrZAAEAAAATZAAB 47833 PT2 
12 AAALrZAAEAAAATZAAC 47833 PT2 
17 AAALrZAAEAAAATZAAD 47833 PT2 
19 AAALrZAAEAAAATZAAE 47833 PT2 
2 AAALraAAEAAAAThAAA 47834 PT3 
5 AAALraAAEAAAAThAAB 47834 PT3 
18 AAALraAAEAAAAThAAD 47834 PT3 
8 AAALraAAEAAAAThAAC 47834 PT3 
1 AAALrbAAEAAAATpAAA 47835 PT4 
3 AAALrbAAEAAAATpAAB 47835 PT4 
4 AAALrbAAEAAAATpAAC 47835 PT4 
7 AAALrbAAEAAAATpAAD 47835 PT4 
+0

+1 훌륭한 답변! 그건 분명히 내 질문의 첫 번째 부분에 대한 법안에 맞는! – woemler

+0

감사합니다. 나는 주변을 조사 할 때만 그것을 사용했다. 파티션을 자르거나 변경하려면 @jonearls answer에서 'PARTITION FOR' 구문을 사용하십시오. –

3

1) no. 그렇게 할 수 없다면, ceratain 값에 대한 파티션을 찾으려면 all_tab_partitions을 질의해야합니다.

2) alter table x truncate partition y

+0

'all_tab_partitions' 테이블을 사용하여 특정 데이터 행의 파티션을 찾는 방법을 명확히 할 수 있습니까? 에 속한다? – woemler

+0

은 사용중인 파티션 유형에 따라 다릅니다 (범위를 추측하고 있습니다). 각 파티션의 높은 값은'high_value' 열에 있으므로 범위 파티션 인 경우 값이 'high_value'보다 작은 마지막 파티션이 필요합니다. [docs here]를 읽으십시오 (http://docs.oracle.com/cd/B28359_01/server.111/b28320/statviews_2096.htm) – haki

+0

해당 테이블이 범주별로 해시 분할되므로 'high_value' 열이 null입니다. . – woemler

2

대신 파티션 이름을 찾는의 PARTITION FOR 구문의 값을 사용 :

ALTER TABLE MYTABLE TRUNCATE PARTITION FOR ('ABC'); 

이 작업은 다른 파티션의 데이터에 영향을주지 않습니다하지만 그것은 당신의 인덱스를 사용할 수 없게 만들 수 있습니다 . 관련 인덱스를 다시 작성하거나 DDL에 UPDATE INDEXES을 사용하십시오.

+0

구문을 조금 설명 할 수 있습니까?필자는 예제에서와 같이''ABC'''가'CATEGORY'의 값이라고 가정하고 있는데,''ABC'''가'CATEGORY' 칼럼을 가리키는 것을 어떻게 알 수 있습니까? – woemler

+1

파티션 키, 즉 테이블을 분할하는 데 사용되는 열 (들)입니다. –