2010-02-03 34 views
9

Uygulamam için çok büyük bir veri hacmine (yüz milyonlarca kayıt) sahip tek bir tablodan oluşan bir veritabanı deposu oluşturma aşamasındayım. Tarih alanında bir endeks almayı planlıyorum, çünkü şimdi her zaman belirli bir zaman diliminde tüm kayıtların toplu olarak kurtarılmasını yapacağım ve (örneğin, ertesi güne ait tüm kayıtları gece yarısında geri alacağım)).Oracle'da dinamik tablo bölümleme

Kayıtların sayısı çok büyük olduğundan ve performans bu sistemde önemli bir sorun olduğundan, kayıtlarımı daha hızlı alabilmem, bölümleri oluşturarak ve kesebilmem için bir yöntem olup olmadığını bilmek istiyorum. Artık ihtiyaç duymadıkları için. Örneğin, bir sonraki gün için bir bölüm oluşturmaya ve bugünkü kayıtları işledikten sonra verileri geri kalanıyla doldurmaya nasıl giderim?

cevap

3

dynamic SQL kullanımıyla bölüm oluşturma veya kısaltma işlemlerini otomatikleştirebilirsiniz. EXECUTE IMMEDIATE veya DBMS_SQL ile yordamlar yazabilir ve bunları DBMS_JOB veya DBMS_SCHEDULER (DBMS_SCHEDULER 10g özelliğiyle ve DBMS_JOB'dan çok yönlüdür) ile zamanlayabilirsiniz.

Muhtemelen önce bölüm deyimlerini el ile oluşturmak ve daha sonra DDL'ye güvendiğinizde işlemi otomatikleştirmek istersiniz. Tüm synthax'ı documentation for the ALTER TABLE statement'da bulacaksınız.

10

11g'de INTERVAL bölümlerini tanımlayabiliriz ve Oracle, anahtarlarının mevcut aralıklardan hiçbirine sığmayan yeni kayıtları aldığında otomatik olarak yeni bölümler oluşturacaktır. Bu çok güzel bir özellik. Find out more.

Unutulmaması gereken bir şey, Partitioning'in Enterprise Edition lisansının üstünde ücretli bir ek ücret olmasıdır. Yani kullanımı ucuz değil.

+2

+1 INTERVAL bölümlendirmenin tanıtımı, evdeki ihtiyacın çoğunu ortadan kaldırır bölümlerin eklenmesini otomatik olarak yönetmek için geliştirilmiş çözümler. Oracle'ın sunmasını istediğim tek geliştirme, oluşturulan bölüm adları için bir format maskesi tanımlamanın bir yoludur - şimdi sistem tarafından oluşturulan jenerik isimleri ile üretilirler ve her zaman anlamlı bilgiler için x_tab_partitions'daki LONG sütunundaki HIGH_VALUE değerine bakmak zorunda kalırım. aralık hakkında. – dpbradley

+0

@dpbradley - Gerçekten 11g'de Partitioning'i gerçek kullanmak için iyi bir şansa sahip değildim, ama bunun oldukça can sıkıcı olabileceğini görebiliyorum. – APC

+0

Sadece bir uyarı, Aralıklı bölümleme ile Referans bölümleme karıştırılamıyor. Başvuruyu bölümlendirme kullanmayı tercih ettik ve ardından, tercih ettiğimiz adlandırma kurallarımızla aylık bölümleri oluşturmak için bir işi elden bıraktık. – PenFold

1

SYSDATE ve bölümleri kullanarak bölümler oluşturmak için geldiğim bir şeyin bir örneği.

COLUMN temp_var new_value partition_name_01; 
SELECT 'TABLE_NAME_' || TO_CHAR(SYSDATE - 3, 'YYYYMMDD') AS temp_var FROM dual; 
COLUMN temp_var new_value partition_date_01; 
SELECT TO_CHAR(SYSDATE - 3, 'SYYYY-MM-DD') || ' 00:00:00' AS temp_var FROM dual; 
COLUMN temp_var new_value partition_name_02; 
SELECT 'TABLE_NAME_' || TO_CHAR(SYSDATE - 2, 'YYYYMMDD') AS temp_var FROM dual; 
COLUMN temp_var new_value partition_date_02; 
SELECT TO_CHAR(SYSDATE - 2, 'SYYYY-MM-DD') || ' 00:00:00' AS temp_var FROM dual; 
COLUMN temp_var new_value partition_name_03; 
SELECT 'TABLE_NAME_' || TO_CHAR(SYSDATE - 1, 'YYYYMMDD') AS temp_var FROM dual; 
COLUMN temp_var new_value partition_date_03; 
SELECT TO_CHAR(SYSDATE - 1, 'SYYYY-MM-DD') || ' 00:00:00' AS temp_var FROM dual; 
COLUMN temp_var new_value partition_name_04; 
SELECT 'TABLE_NAME_' || TO_CHAR(SYSDATE, 'YYYYMMDD') AS temp_var FROM dual; 
COLUMN temp_var new_value partition_date_04; 
SELECT TO_CHAR(SYSDATE, 'SYYYY-MM-DD') || ' 00:00:00' AS temp_var FROM dual; 
CREATE TABLE TABLE_NAME 
(
    SEQ_NO     NUMBER NOT NULL, 
    INSERT_DATE   DATE NOT NULL, 
    FIRST_NAME    VARCHAR2 (256 BYTE), 
    LAST_NAME    VARCHAR2 (256 BYTE), 
    ID_NUM     NUMBER, 
    ID_STATUS    NUMBER 
) 

PARTITION BY RANGE 
    (INSERT_DATE) 
    SUBPARTITION BY LIST 
     (ID_STATUS) 
     SUBPARTITION TEMPLATE (
     SUBPARTITION SP1 VALUES (0) TABLESPACE &tblspce, 
     SUBPARTITION SP2 VALUES (1) TABLESPACE &tblspce, 
     SUBPARTITION SP3 VALUES (2) TABLESPACE &tblspce) 

    (
    PARTITION &partition_name_01 
     VALUES LESS THAN 
     (TO_DATE ('&partition_date_01', 
        'SYYYY-MM-DD HH24:MI:SS', 
        'NLS_CALENDAR=GREGORIAN')), 

    PARTITION &partition_name_02 
     VALUES LESS THAN 
     (TO_DATE ('&partition_date_02', 
        'SYYYY-MM-DD HH24:MI:SS', 
        'NLS_CALENDAR=GREGORIAN')), 

    PARTITION &partition_name_03 
     VALUES LESS THAN 
     (TO_DATE ('&partition_date_03', 
        'SYYYY-MM-DD HH24:MI:SS', 
        'NLS_CALENDAR=GREGORIAN')), 
sysdate 

    PARTITION &partition_name_04 
     VALUES LESS THAN 
     (TO_DATE ('&partition_date_04', 
        'SYYYY-MM-DD HH24:MI:SS', 
        'NLS_CALENDAR=GREGORIAN'))) 

ENABLE ROW MOVEMENT; 
1

otomatik olarak ilgilenir bir ürün var: Ben SYSDATE için birleştirilmiş bir dize ile yedek parametrelerini oluşturmak zorunda kaldı. PartitionManager for Oracle, eski verileri temizleme, arşivleme ve arşivleme de dahil olmak üzere kuruluş tutma temelli otomatik bölüm yönetimi sağlar. Bunu şu adresten deneyebilirsiniz: http://www.xyrosoft.com

+0

Bu, Oracle'ın sunduğu şeylere göre hangi yollarla geliştiriliyor? –

İlgili konular