Есть ли какое-либо существенное влияние, если мы не добавим предложение tablespace при создании таблицы или индексов в oracle? - PullRequest
1 голос
/ 04 июля 2019

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

Это то, чем я занимаюсь очень долго.

CREATE TABLE XT_PMB_NOTIFY_UNSUB( 
TXNID NUMBER(15), 
APP_SEQNO NUMBER(15), 
PRIMARY_KEYVAL VARCHAR2(4000) NOT NULL, 
OP_CODE VARCHAR2(15), 
TXN_STATUS VARCHAR2(1), 
CREATE_DT DATE, 
PRIMARY KEY (TXNID) ); 

Рекомендация от DBA.

CREATE TABLE XT_PMB_NOTIFY_UNSUB( 
TXNID NUMBER(15), 
APP_SEQNO NUMBER(15), 
PRIMARY_KEYVAL VARCHAR2(4000) NOT NULL, 
OP_CODE VARCHAR2(15), 
TXN_STATUS VARCHAR2(1), 
CREATE_DT DATE, 
PRIMARY KEY (TXNID) )
TABLESPACE DATA_ENC_TS;

Ответы [ 2 ]

5 голосов
/ 04 июля 2019

Ответ зависит от того, как ваша компания определила свои правила табличного пространства.

Пользователи Oracle (или схемы) могут иметь одно «табличное пространство по умолчанию», которое можно увидеть, запросив базу данных:

select username, default_tablespace from dba_users;

или если у вас нет разрешения на это, и вы хотите знать, что это такое только для текущего пользователя:

select username, default_tablespace from user_users;

Или, возможно, этот, чтобы увидеть всех пользователей, которые видны вашему текущему подключенному пользователю:

select username, default_tablespace from user_users;

Согласно документации Oracle (https://docs.oracle.com/cd/B19306_01/server.102/b14200/statements_8003.htm) это означает:

Укажите табличное пространство по умолчанию для объектов, которые создает пользователь. Если Вы пропускаете это предложение, тогда объекты пользователя сохраняются в табличное пространство по умолчанию для базы данных. Если табличное пространство по умолчанию не было указанный для базы данных, то объекты пользователя хранятся в Табличное пространство SYSTEM.

Так что для ваших намерений и целей, когда вы создаете таблицу без явного использования табличного пространства в конце, она в целом перейдет к табличному пространству пользователя по умолчанию. Если ваши администраторы не склонны определять табличное пространство по умолчанию, это начинает оказывать более серьезное влияние, поскольку таблица будет храниться в глобальном табличном пространстве по умолчанию или (не дай бог) перейдет в табличное пространство SYSTEM. Последний вариант будет крайне вреден для работоспособности базы данных.

Некоторые компании имеют привычку назначать разные табличные пространства для таблиц и, например, для индексов. В этом случае пользователи могут иметь только одно табличное пространство по умолчанию, и если вы пропустите предложение табличного пространства в операторе создания индекса (или создания таблицы), объекты перейдут в неправильное табличное пространство.

Теперь о последствиях наличия таблицы или индекса в неверном табличном пространстве. Табличное пространство - это набор из одного или нескольких файлов физической операционной системы (Oracle называет их файлами данных). Всякий раз, когда вы создаете таблицу или индекс в табличном пространстве, оракул выделяет пространство в этом файле данных, который Oracle называет сегментами. Сегменты - это логические единицы внутри файла данных. Имейте в виду, что Oracle далее разбивает сегменты на более мелкие логические единицы, называемые экстентами и блоками, но это немного выходит за рамки данной темы. Если вам интересно, здесь можно прочитать больше: https://docs.oracle.com/cd/B19306_01/server.102/b14220/logical.htm

Вернемся к сегментам. Сегменты существуют внутри файлов данных, которые принадлежат табличным пространствам. Когда вы помещаете свой объект в табличное пространство и хотите переместить его в другое табличное пространство, Oracle необходимо физически записывать файлы в ОС. И это может быть просто, если таблица пуста, или может потребовать значительных усилий, если речь идет о массивной таблице, охватывающей несколько файлов данных или содержащей гигабайты или терабайты данных. Это может означать, что для исправления требуется сбой приложения.

Oracle предоставляет определенные методы, позволяющие избежать сбоев приложений в этих сценариях, например, онлайн Переопределение (пакет DBMS_REDEFINITION). Но я надеюсь, что мы сможем согласиться с тем, что их использование можно лучше использовать для миграции приложений и тому подобного.

Использование настроек табличного пространства по умолчанию во многих случаях приемлемо, во всяком случае, но, если вы позволите мне, возможно, практическое правило для многих вещей - Oracle, если вы можете написать код, чтобы сделать что-то явно, вместо того, чтобы полагаться на значения по умолчанию, сделайте себе и своему администратору базы данных услугу. В общем, гибкость в том, чтобы полагаться на него, даже превосходит даже пару раз, когда вы столкнетесь с неожиданностью, а затем будете ответственны за его очистку позже.

3 голосов
/ 04 июля 2019

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

 select *
    from database_properties
    where property_name like 'DEFAULT%TABLESPACE';

PROPERTY_NAME                  PROPERTY_VALUE       DESCRIPTION
------------------------------ -------------------- ----------------------------------------
DEFAULT_TEMP_TABLESPACE        TEMP                 Name of default temporary tablespace
DEFAULT_PERMANENT_TABLESPACE   USERS                Name of default permanent tablespace
...