oracle - 整数列上的 Oracle 自动分区策略
问题描述
我需要一些关于如何在整数列上执行自动分区的帮助,类似于我们对日期列(如PARTITION BY RANGE (DIM_DT_ID) INTERVAL (NUMTODSINTERVAL(1,'DAY'))
.
我有 9000 万行,性能很差,我们的查询 SLA 是 2 秒,我想执行分区。什么是最好的方法以及如何在整数列上启用自动分区
我们的查询将始终按这些列过滤,例如
select * from <tbname>
where ObjectID =1346785
and patentnumber=23456.
解决方案
“我只是在这里做一个例子,因为为了合法性我不能粘贴原始查询”
很公平,但我们给你的建议只会和你给我们的信息一样好。到目前为止,您发布的任何内容都没有表明您需要分区。
粘贴的查询将在复合索引中表现良好,并且可能会受益于前导列的压缩:
create index your_table_lookup_index
on your_table(ObjectID, patentnumber) compress 1;
如果这是唯一的组合,则使索引唯一。
如何在整数列上启用自动分区
但是,如果您认为您确实有真正的分区用例,那么我们可以将间隔分区与整数和日期一起使用。该语句将为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,您绝对应该查看它的在线转换机制,这是一个单一的命令。了解更多。
请记住,为性能而分区是一个棘手的游戏。虽然它可以改进返回大量与分区键对齐的行的查询,但它对其他查询没有影响,甚至会损害它们的性能。特别是,任何不包含分区键(objectid
在您的情况下)的查询在对表进行分区后可能会执行得更差。
最后一点:如您所知,但为了未来的搜索者的利益,分区是企业版许可证的额外收费。除非我们付费,否则我们不允许使用它。
推荐阅读
- huawei-mobile-services - HMS Nearby Service-BeaconManager app为什么报502或401状态码?
- python - 将非透明图像转换为透明 GIF 图像 PIL
- pandas - Pandas Stacked Bar 和绘图问题
- python - 附加深拷贝
- python - 使用python函数(def)返回所需的行/列
- tensorflow - 为什么 Keras 接受 model.evaluate 的批量大小选项?
- networking - 迷你网和NFV?
- php - codeigniter 4 中的 CORS 问题:对预检请求的响应未通过访问控制检查
- excel - 如何确定一组单元格的模式
- python - 仅使用列表理解中的某些项目?