我需要一些关于如何在整数列上执行自动分区的帮助,类似于我们在日期列上执行的操作,如PARTITION BY RANGE (DIM_DT_ID) INTERVAL (NUMTODSINTERVAL(1,'DAY'))
。
我有9000万行,性能很差,我们的查询SLA是2秒,我想执行分区。什么是最好的方法以及如何在Integer列上启用自动分区
我们的查询将始终按照
这些列进行过滤select * from <tbname>
where ObjectID =1346785
and patentnumber=23456.
答案 0 :(得分:4)
&#34;我只是在这里做一个例子,因为为了合法性而无法粘贴原始查询&#34;
公平,但我们给你的建议只会与你给我们的信息一样好。到目前为止,您发布的任何内容都表明您需要分区。
粘贴的查询在复合索引中表现良好,可能会受到前导列压缩的好处:
create index your_table_lookup_index
on your_table(ObjectID, patentnumber) compress 1;
如果这是一个独特的组合,那么使索引唯一。
如何在Integer列上启用自动分区
但是,如果您认为确实有分区的真实用例,那么我们可以使用带有整数和日期的间隔分区。此语句将创建一个在objectid
上分区的表,每十个值包含一个分区。
create table your_table (
objectid number,
patentnumber number,
created_date date
)
partition by range (objectid)
interval (10)
(
partition p_00010 values less than (10)
);
在您发布的数据上,大约有400个分区,每个分区大约225000行。这是一个不错的选择吗?谁能说出来?您知道自己的数据和用例,我们不会:每个objectid
分区(即interval (1)
)可能更好。
您已经有一个表,因此需要将其拆分为分区。这样做的标准是
values less than (MAXVALUE)
这是一个相当耗时的过程。您已标记了问题[oracle12c]
;如果你正在使用Oracle 12c R2,你一定要看看它的在线转换机制,这是一个单一的命令。 Find out more
请记住,对性能进行分区是一项棘手的游戏。虽然它可以改进返回与分区键对齐的大量行的查询,但它对其他查询没有任何影响,甚至会影响其性能。特别是,任何不包含分区键(在您的情况下为objectid
)的查询在分区表后可能会执行得更糟。
最后一点:正如您所知,但为了未来的搜索者的利益,分区是企业版许可证的额外费用。除非我们已经付款,否则我们不允许使用它。