Понимание соглашения об именовании систем в Oracle

Как указано в документации, имена начинаются с SYS_ и ORA_ используются системой Oracle:

Oracle использует сгенерированные системой имена, начинающиеся с SYS_, для неявно сгенерированных объектов схемы и подобъектов, а также имена, начинающиеся с ORA_, для некоторых объектов, предоставляемых Oracle. Oracle не рекомендует использовать эти префиксы в именах, которые вы явно предоставляете объектам и подобъектам схемы, чтобы избежать возможных конфликтов при разрешении имен.

В настоящее время я работаю с таблицей с интервальными разделами с именами разделов:

SYS_P2672
SYS_P1787
SYS_P654

Существует ли соглашение, в соответствии с которым генерируется целое число в имени раздела SYS_2627? В частности, я хотел бы предсказать будущие имена разделов, предполагая, что мои разделы генерируются ежемесячно или еженедельно.


person Konrad    schedule 02.10.2017    source источник
comment
Хотя я не могу быть на 100% уверен в этом (насколько мне известно, алгоритм, который система использует для генерации имен разделов, не задокументирован), я думаю, что полезно отметить, что существует последовательность с именем SYS.PARTITION_NAMES, значение NEXT которой всегда больше, чем значение NEXT. номер, используемый в любом разделе, имя которого было сгенерировано системой, например SYS_Pnnnnn. Если я прав и эта последовательность используется системой для создания уникальных имен разделов, невозможно предсказать значение, которое будет использоваться.   -  person Bob Jarvis - Reinstate Monica    schedule 02.10.2017
comment
@BobJarvis Большое спасибо за ваш вклад. Пока это лучший ответ. Что касается предсказания имени следующего раздела, хотя бы частичного, то можно предположить, что он будет иметь наибольший номер. Таким образом, самый новый раздел — это раздел с наибольшим номером. Думаю, это лучше, чем ничего.   -  person Konrad    schedule 02.10.2017
comment
Будьте осторожны, предполагая что-либо на основе этих имен разделов. Экспорт/импорт из другой БД скопирует имена существующих разделов, даже если они «нарушат» последовательность. если есть вероятность того, что данные начнут вставляться для «января 2018 года» до «декабря 2017 года», «номера» раздела могут снова выйти из строя.   -  person Gary Myers    schedule 03.10.2017


Ответы (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')
person Jon Heller    schedule 02.10.2017