【问题标题】:Understanding system naming convention in Oracle了解 Oracle 中的系统命名约定
【发布时间】:2017-10-02 16:08:27
【问题描述】:

如documentation 中所述,Oracle 系统使用以SYS_ 和ORA_ 开头的名称:

Oracle 使用以SYS_ 开头的系统生成名称来表示 隐式生成的模式对象和子对象,以及名称 对于某些 Oracle 提供的对象,以 ORA_ 开头。甲骨文 不鼓励您在明确的名称中使用这些前缀 提供给您的架构对象和子对象以避免可能 名称解析冲突。

我目前正在使用具有分区名称的间隔分区表:

SYS_P2672
SYS_P1787
SYS_P654

分区名称 SYS_2627 中的整数是否有生成的约定?特别是,我想预测未来的分区名称,假设我的分区是按月或周间隔生成的。

【问题讨论】:

  • 虽然我不能 100% 确定这一点(据我所知,系统用于生成分区名称的算法没有记录在案)我认为注意有一个名为 @ 的序列是有启发性的987654329@,其 NEXT 值始终大于系统生成名称的任何分区上使用的数字,例如SYS_Pnnnnn。如果我是正确的并且系统使用此序列来生成唯一的分区名称,则无法预测将使用的值。
  • @BobJarvis 非常感谢您的贡献。这是迄今为止最好的答案。关于预测下一个分区名称,至少部分地,可以假设它将具有最大数量。所以最新的分区是数量最多的分区。我想有总比没有好。
  • 谨慎假设任何基于这些分区名称的东西。从另一个数据库导出/导入将复制现有分区的名称,即使它们“破坏”了序列。如果有可能在“2017 年 12 月”之前开始插入“2018 年 1 月”的数据,则“数字”分区可能会再次失序。

标签: database oracle database-partitioning


【解决方案1】:

使用分区扩展名和数据字典,而不是依赖系统名。

分区扩展名语法允许 SQL 语句根据分区内的值而不是实际的分区名称来引用分区。

语法:

(也有类似的 SUBPARTITION 版本。)

示例:

--Create and populate sample schema.
--drop table test1;

create table test1(a date)
partition by range(a)
interval (numToDSInterval(1, 'DAY'))
(
    partition p1 values less than (date '2000-01-01')
);

insert into test1
select date '2000-01-01' + level
from dual
connect by level <= 100;

--Select the partition using a value.
select * from test1 partition for (date '2000-01-05');

如果这不起作用,可以通过数据字典检索分区信息。这变得很棘手,特别是因为 HIGH_VALUE 作为文本存储在 LONG 列中。但在 PL/SQL 中使用时,它确实允许完全控制和自动化。

--Must create as a table to convert LONG to CLOB in SQL.
--(This would be easier in PL/SQL, you can just "TO_CHAR" it.)
create table temp_convert_long_to_lob as
select table_name, partition_name, to_lob(high_value) high_value
from user_tab_partitions
where table_name = 'TEST1';

--Show some data about the partitions.
select table_name, partition_name, to_char(high_value) high_value
from temp_convert_long_to_lob
order by partition_name;

TABLE_NAME   PARTITION_NAME   HIGH_VALUE
----------   --------------   ----------
TEST1        P1               TO_DATE(' 2000-01-01 00:00:00', 'SYYYY-MM-DD HH24:MI:SS', 'NLS_CALENDAR=GREGORIAN')
TEST1        SYS_P3094        TO_DATE(' 2000-01-03 00:00:00', 'SYYYY-MM-DD HH24:MI:SS', 'NLS_CALENDAR=GREGORIAN')
TEST1        SYS_P3095        TO_DATE(' 2000-01-04 00:00:00', 'SYYYY-MM-DD HH24:MI:SS', 'NLS_CALENDAR=GREGORIAN')
TEST1        SYS_P3096        TO_DATE(' 2000-01-05 00:00:00', 'SYYYY-MM-DD HH24:MI:SS', 'NLS_CALENDAR=GREGORIAN')

【讨论】:

    猜你喜欢
    • 2014-12-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-01-01
    • 1970-01-01
    • 2013-06-16
    • 2013-10-16
    相关资源
    最近更新 更多