Oracle 12c-大小大于5 TB的表

Oracle 12c-大小大于5 TB的表,oracle,bigdata,exadata,Oracle,Bigdata,Exadata,在我们的数据库(Oracle 12c、Exadata)中,我们计划存储销售数据。每天都会输入包含销售数据的文本文件(每天约1000个文件,每个文件包含约20000行)。文本文件被读取并尽快传输到db。根据我们的计算,它将在一年内增长到5 TB 数据格式: [交易日期][类别][销售编号][买家id][其他列] 销售数据分为10个不同类别,具有相同的字段。从逻辑上讲,数据可以存储在一个表中,也可以分为10个表(关于类别) 在oracle中存储此类大数据的最佳做法是什么?应该应用什么样的分区和索引策

在我们的数据库(Oracle 12c、Exadata)中,我们计划存储销售数据。每天都会输入包含销售数据的文本文件(每天约1000个文件,每个文件包含约20000行)。文本文件被读取并尽快传输到db。根据我们的计算,它将在一年内增长到5 TB

数据格式:
[交易日期][类别][销售编号][买家id][其他列]

销售数据分为10个不同类别,具有相同的字段。从逻辑上讲,数据可以存储在一个表中,也可以分为10个表(关于类别)

在oracle中存储此类大数据的最佳做法是什么?应该应用什么样的分区和索引策略


限制条件:数据应在2-3天内提供给市场部进行分析。基于[sales_number]或[category]、[buyer_id]或[buyer_id]列的查询。

如果类别的数量已知并已确定,则可以为每个类别使用子分区。 一种方法可以是:

CREATE TABLE SALES_DATA
(
  TRANSACTION_DATE TIMESTAMP(0) NOT NULL,
  CATEGORY NUMBER NOT NULL,
  SALES_NUMBER NUMBER, 
  BUYER_ID NUMBER,
  [OTHER COLUMNS]
)
PARTITION BY RANGE (TRANSACTION_DATE) INTERVAL (INTERVAL '1' DAY)
SUBPARTITION BY LIST (CATEGORY)
SUBPARTITION TEMPLATE 
    (
        SUBPARTITION CAT_1 VALUES (1), 
        SUBPARTITION CAT_2 VALUES (2),
        SUBPARTITION CAT_3_AND_4 VALUES (3,4), 
        SUBPARTITION CAT_5 VALUES (5),
        ...
        SUBPARTITION CAT_10 VALUES (10),
        SUBPARTITION CAT_OTHERS VALUES (DEFAULT)        
    )
    (
        PARTITION P_INITIAL VALUES LESS THAN (TIMESTAMP '2018-01-01 00:00:00')  
    );

sales\u number和buyer\u id需要本地索引。如果需要,可以将每个(子)分区放入一个单独的表空间。

如果类别数已知并已修复,则可以为每个类别使用子分区。 一种方法可以是:

CREATE TABLE SALES_DATA
(
  TRANSACTION_DATE TIMESTAMP(0) NOT NULL,
  CATEGORY NUMBER NOT NULL,
  SALES_NUMBER NUMBER, 
  BUYER_ID NUMBER,
  [OTHER COLUMNS]
)
PARTITION BY RANGE (TRANSACTION_DATE) INTERVAL (INTERVAL '1' DAY)
SUBPARTITION BY LIST (CATEGORY)
SUBPARTITION TEMPLATE 
    (
        SUBPARTITION CAT_1 VALUES (1), 
        SUBPARTITION CAT_2 VALUES (2),
        SUBPARTITION CAT_3_AND_4 VALUES (3,4), 
        SUBPARTITION CAT_5 VALUES (5),
        ...
        SUBPARTITION CAT_10 VALUES (10),
        SUBPARTITION CAT_OTHERS VALUES (DEFAULT)        
    )
    (
        PARTITION P_INITIAL VALUES LESS THAN (TIMESTAMP '2018-01-01 00:00:00')  
    );


销售编号和买家id需要本地索引。如果需要,您可以将每个(子)分区放入一个单独的表空间。

当您写入“~1000个文件/天”时,您的意思是1000行吗?您是否有基于类别的查询?每天1000个文件,每个文件包含~10000行,大多数情况下,查询都有类别。更新:每天更新1000个文件,每个文件包含约20000行,通常业务日期是分区键。你可以按类别细分,但如果没有详细的分析就很难说。你写“~1000个文件每天”时是指1000行吗?你有基于类别的查询吗?每天1000个文件,每个文件包含~10000行,大多数情况下查询都有类别。更新:每天1000个文件,每个文件包含~20000行,通常,业务日期是分区键。您可能会按类别进行细分,但如果没有详细的分析,很难说。由于许多类别会导致对sales\u number或buyer\u id的查询非常缓慢,因为Oracle必须扫描日期范围内所有分区的索引。如果没有给出日期,则必须处理所有分区。@user261203,是的,但这取决于类别的数量。销售编号的全局索引会更好。在不知道查询或数据基数的情况下,您如何知道您甚至需要分区或索引?@BobC,OP说明了一些查询的编号和类型。@WernfriedDomscheit可能我太笨了。。。在哪里?由于Oracle需要扫描日期范围内所有分区的索引,许多类别会导致对sales_number或buyer_id的查询速度非常慢。如果没有给出日期,则必须处理所有分区。@user261203,是的,但这取决于类别的数量。销售编号的全局索引会更好。在不知道查询或数据基数的情况下,您如何知道您甚至需要分区或索引?@BobC,OP说明了一些查询的编号和类型。@WernfriedDomscheit可能我太笨了。。。哪里