Rev*_*ous 8 sql oracle partitioning database-partitioning
IE如果我们有一个400万行的表.
这得到了一个STATUS可以承担下列值字段:TO_WORK,BLOCKED或WORKED_CORRECTLY.
你会在一个只会改变一次的字段上进行分区(大部分时间从to_work变为working_correctly)吗?你会创建多少个分区?
APC*_*APC 16
分区中的绝对行数不是最有用的度量标准.你真正想要的是一个随着表的增长而稳定的列,它提供了分区的潜在好处.它们是:可用性,表空间管理和性能.
例如,您的示例列有三个值.这意味着您可以拥有三个分区,这意味着您可以拥有三个表空间.因此,如果表空间损坏,您将丢失三分之一的数据.分区是否使您的桌子更有用?并不是的.
添加或删除分区可以更轻松地管理大量数据.但是你有可能放弃状态为的所有行WORKED_CORRECTLY吗?不大可能.分区是否使您的表更易于管理?并不是的.
分区的性能优势来自查询修剪,优化器可以立即对表的块进行折扣.现在每个分区有130万行.所以即使你查询STATUS='WORKED_CORRECTLY'你仍然有大量的记录来winnow.并且机会是,任何不涉及STATUS的查询都将比未分区的表执行得更糟.分区是否使您的表更具性能?可能不是.
到目前为止,我一直假设你的分区是均匀分布的.但是你的最后一个问题表明情况并非如此.大多数行 - 如果不是全部 - 行将最终出现在WORKED_CORRECTLY.因此,与其他分区相比,分区将变得巨大,分区带来的好处变得更加遥远.
最后,您提出的方案不具有弹性.由于当前卷每个分区将有130万行.当您的表总共增长到四千万行时,每个分区将容纳1330万行.这是不好的.
那么,什么才能成为分区键的良好候选者呢?一个产生大量分区的分区,一个分区的大小大致相等,一个分区的值不太可能改变,一个分区在底层对象的生命周期中有一些含义,最后一个分区在针对表运行的大量查询中很有用.
这就是DATE_CREATED之类的东西在数据仓库中对事实表进行分区的流行选择.它在一系列粒度上生成合理数量的分区(日,月或年是常用选项).我们在给定的时间跨度内创建的记录数大致相同.数据加载和数据存档通常基于年龄(即创建日期)来完成.BI查询几乎总是包含TIME维度.
表中的行数通常不是用于确定是否以及如何对表进行分区的重要指标.
你想解决什么问题?您是否尝试提高查询性能?数据加载的性能?清除数据的性能?
假设您正在尝试提高查询性能?您的所有查询都在STATUS列上有谓词吗?他们正在进行行的单行查找吗?或者您希望您的查询扫描整个分区?
| 归档时间: |
|
| 查看次数: |
2754 次 |
| 最近记录: |