2017-08-15 80 views
0

我一直在使用哈希partitons一个相当庞大的表:oracle多个散列分区平行吗?

create table test 
(
     custid    VARCHAR2 (16) NOT NULL 
     ,channel    NUMBER(10) 
     ,agent_id    CHAR(8) 
     ,TIMESTAMP   DATE 
) cache 
PARTITION BY HASH(agent_id) 
(
partition e1 tablespace TD_RTDM, 
partition e12 tablespace TD_RTDM, 
partition e13 tablespace TD_RTDM, 
partition e14 tablespace TD_RTDM, 
partition e15 tablespace TD_RTDM, 
partition e16 tablespace TD_RTDM, 
partition e17 tablespace TD_RTDM, 
partition e18 tablespace TD_RTDM 
); 

此作品不错,当我在AGENT_ID过滤。 现在我有一个新的水平,我需要过滤,其中不包括agent_id。所以我想我需要N个新的并行散列分区是这样的:

create table test 
    (
      custid    VARCHAR2 (16) NOT NULL 
      ,channel    NUMBER(10) 
      ,agent_id   CHAR(8) 
      ,TIMESTAMP   DATE 
    ) cache 
PARTITION BY HASH(agent_id) 
(
partition e1 tablespace TD_RTDM, 
partition e12 tablespace TD_RTDM, 
partition e13 tablespace TD_RTDM, 
partition e14 tablespace TD_RTDM, 
partition e15 tablespace TD_RTDM, 
partition e16 tablespace TD_RTDM, 
partition e17 tablespace TD_RTDM, 
partition e18 tablespace TD_RTDM 
) 
PARTITION BY HASH(channel) 
(
partition e1 tablespace TD_RTDM, 
partition e12 tablespace TD_RTDM, 
partition e13 tablespace TD_RTDM 
); 

但这不起作用,因为它显然不允许有多个分区的语句。我GOOGLE了一下,发现了很多使用子分区的例子,但我认为这不是我所需要的。

你有什么想法,如何调整表以获得两个查询性能?谢谢e。

+1

在'channel'上创建一个索引? –

+0

@戈登林诺肯定。我有充足的余地。 – Ele

+0

本地或全局索引? –

回答

0

分区不一定是性能活动。

分区报价数据管理的优点,允许我们通过分区交换来加载数据子集或通过删除分区来删除它们。

分区也为我们提供高可用性选项,前提是我们将分区分布在多个表空间中。

现在,分区可以通过分区修剪或删除来提高某些查询的性能,但仅限于与分区键一致的查询。其他查询,与我们的分区策略相违背的查询将执行中立或有时甚至比对未分区表更差的查询。这是因为分区是表的数据的物理组织。行按分区键顺序分组。很明显,数据不能同时以两种不同的顺序排序,这就是为什么你不能有并行分区键。

有没有简单的解决方案。 CHANNEL的全局索引可能会有所帮助,因为它们忽略了分区键,但它们带来了自己的负担;有些地方禁止使用全局索引。子分区可以回答,但前提是密钥内的密钥有意义。用新的分区方案重建表格在理论上是可行的,但在现实生活中几乎从未做过。试着在框外思考:也许一个单独的表(可能是索引组织)可以帮助吗?也许从这个不同的关键可能受益的查询很少运行,他们不值得调整。

总之,您需要了解您的数据及其用例。

+0

耶谢谢。从用例的角度来看,我需要通道a)与agent_it并行,并且b)作为子查询。对于b)我认为一个指数绰绰有余。但是a)让我很担心,因为表已经被agent_id分区了。所以只查询频道将需要搜索所有分区...... :( – Ele