2013-08-08 4 views
4

я иметь следующую таблицуOracle DB ежедневное разделение

CREATE TABLE "METRIC_VALUE_RAW" 
    ( 
    "SUBELEMENT_ID" INTEGER NOT NULL , 
    "METRIC_METADATA_ID" INTEGER NOT NULL , 
    "METRIC_VALUE_INT" INTEGER, 
    "METRIC_VALUE_FLOAT" FLOAT(126), 
    "TIME_STAMP" TIMESTAMP NOT NULL 
    ) ; 
  1. Каждый час данные будут загружены в таблицу с помощью SQL загрузчика.
  2. Я хочу создать разделы, чтобы данные за каждый день переходили в раздел.
  3. В таблице я хочу хранить данные в течение 30 дней. Поэтому, когда он пересекает 30 дней, самый старый раздел должен быть удален.

Вы можете поделиться своими идеями о том, как я могу проектировать разделы.

+0

, когда речь заходит о автоматизации раздела, существует ОГРОМНАЯ разница между 10 и 11 г, поэтому вам нужно указать версию, которую вы используете. – haki

+0

Я использую 10g. Также будет полезно узнать о 11g, поскольку мы планируем обновить его в будущем. Следовательно, будет полезно узнать об обоих. – user2032118

ответ

1

Как я уже сказал, существуют большие различия в автоматизации разделов между 10 и 11g. В 10G вам придется вручную управлять разделами во время вашего процесса ETL (я уверен, что каждые 10g DBA имеют служебный пакет, который он написал для управления разделами ...).

Процедуру 1 & 2, у вас есть несколько вариантов

  1. загрузки данных непосредственно на повседневную перегородку.
  2. загружает данные в новый раздел и объединяет их в ежедневный.
  3. загружает данные в новый раздел каждый час, а во время обслуживания окно объединяет все почасовые переходы в ежедневный раздел.

Правильный способ зависит от ваших потребностей. Спрашиваются ли недавно добавленные данные немедленно? Каким образом? Вы запрашиваете данные за несколько часов (или загрузок ...)? Вы показываете скопления? выполняете ли вы операции DML по данным (операции DDL на разделах вызывают массовую блокировку).

около 3, снова - вручную. отбросить старые разделы.

В 11G у вас есть новая функция разделения интервалов с автоматизацией некоторых из упомянутых выше задач.

0

Ниже приведен пример создания таблицы SQL для parititon данные:

CREATE TABLE quarterly_report_status (
    report_id INT NOT NULL, 
    report_status VARCHAR(20) NOT NULL, 
    report_updated TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP 
) 
PARTITION BY RANGE (UNIX_TIMESTAMP(report_updated)) (
    PARTITION p0 VALUES LESS THAN (UNIX_TIMESTAMP('2008-01-01 00:00:00')), 
    PARTITION p1 VALUES LESS THAN (UNIX_TIMESTAMP('2008-01-02 00:00:00')), 
    PARTITION p2 VALUES LESS THAN (UNIX_TIMESTAMP('2008-01-03 00:00:00')), 
    PARTITION p3 VALUES LESS THAN (UNIX_TIMESTAMP('2008-01-04 00:00:00')), 
    PARTITION p4 VALUES LESS THAN (UNIX_TIMESTAMP('2008-01-05 00:00:00')), 
    PARTITION p5 VALUES LESS THAN (UNIX_TIMESTAMP('2008-01-06 00:00:00')), 
    PARTITION p6 VALUES LESS THAN (UNIX_TIMESTAMP('2008-01-07 00:00:00')), 
    PARTITION p7 VALUES LESS THAN (UNIX_TIMESTAMP('2008-01-08 00:00:00')), 
    PARTITION p8 VALUES LESS THAN (UNIX_TIMESTAMP('2008-01-09 00:00:00')), 
    PARTITION p9 VALUES LESS THAN (MAXVALUE) 
); 

Paritions будет создан DBA и остальные будут позаботятся оракула. Если вы хотите удалить раздел, вам придется писать для него отдельные задания.

+0

Это пример MySQL? –

+0

Спасибо за пример. В примере вы указали год (2008/2009). Есть ли способ создать ежедневные разделы без указания даты, чтобы они были повторно использованы. Я хочу хранить данные за 30 дней. – user2032118

+0

@ user2032118: разница в этом году была ошибкой [я исправлю это сейчас], как только вы определите последовательность разделов, как это, oracle продолжает собирать соответствующие разделы, используя тот же шаблон в создании сценария таблицы. Вам просто нужно добавить раздел. – Lokesh

0

вот пример, как это сделать на Oracle 11g, и он работает очень хорошо. Я не пробовал это на Oracle 10g, вы можете попробовать.

Это способ, как создать таблицу с ежедневными разделами:

CREATE TABLE XXX (
    partition_date DATE, 
    ..., 
    ..., 
) 
PARTITION BY RANGE (partition_date) 
INTERVAL (NUMTODSINTERVAL(1, 'day')) 
(
    PARTITION part_01 values LESS THAN (TO_DATE('2000-01-01','YYYY-MM-DD')) 
) 
TABLESPACE MY_TABLESPACE 
NOLOGGING; 

Как вы видите выше, Oracle будет автоматически создавать отдельные разделы для каждого отдельного partition_day после 1 января 2000 года Записи, чьи partition_date старше этой даты, будет храниться в разделе «part_01».

Вы можете monitore разделов таблицы, используя эту инструкцию:

SELECT * FROM user_tab_partitions WHERE table_name = 'XXX'; 

Затем, когда вы хотите удалить некоторые разделы, используйте следующую команду:

ALTER TABLE XXX DROP PARTITION AAAAAA UPDATE GLOBAL INDEXES 

где 'AAAAAA' является имя parition ,

Я надеюсь, что это вам поможет!

Смежные вопросы