Подтвердить что ты не робот

Воздействие определения столбца VARCHAR2 с большей длиной

Каковы эффекты определения столбца с VARCHAR2(1000) вместо VARCHAR2(10) в Oracle, когда значения не превышают 10 байт?

Столбец занимает только место, необходимое для хранения значений, или это может отрицательно повлиять на размер/производительность табличных пространств/индексов?

4b9b3361

Ответ 1

Ответ зависит от того, говоришь ли вы о столбце в таблице базы данных или о переменной в программе PL/SQL.

Столбец базы данных

Объем используемого хранилища пропорционален размеру сохраненных данных.

переменная PL/SQL

Если переменная объявлена ​​с размером от 1 до 3999 (11g +)/1999 (10g или ранее), память будет выделена для максимальной длины (то есть для VARCHAR2 (100) потребуется не менее 100 байт памяти).

Если переменная объявлена ​​с размером 4000 (11g +)/2000 (10g или ранее) или выше, память будет распределена в соответствии с размером хранимых данных. (интересным вопросом будет вопрос, будет ли изменено значение переменной, как изменяется размер памяти - перераспределяет ли другой буфер с новым размером?)

Ссылка на 10g: Типы данных PL/SQL

Небольшие переменные VARCHAR2 оптимизированы для производительности, а более крупные оптимизированы для эффективного использования памяти. Точка отсечки - 2000 байт. Для VARCHAR2, который составляет 2000 байт или более, PL/SQL динамически выделяет достаточно памяти для хранения фактического значения. Для переменной VARCHAR2, длина которой меньше 2000 байт, PL/SQL предопределяет полную объявленную длину переменной. Например, если вы назначаете одно и то же 500-байтовое значение переменной VARCHAR2 (2000 BYTE) и переменной VARCHAR2 (1999 BYTE), первая берет 500 байтов, а последняя занимает 1999 байт.

Ответ 2

В базе данных нет разницы. VARCHAR2 сохраняются с переменной длиной, объявленная длина является только ограничением.

Однако некоторые клиентские приложения зарезервируют 1000 байт за столбец вместо 10, если они видят, что столбец определяется как VARCHAR2(1000)

Ответ 3

Определите размер столбца как максимальную длину, с которой вы готовы справиться. Для промежуточной таблицы, где я загружаю файл в базу данных, я могу использовать VARCHAR2 (4000). Затем, как только все данные будут в базе данных, я могу выполнить все необходимые проверки (типы данных, длины данных, минимальные/максимальные значения, допустимые символы...) и иметь допустимые значения, переданные в столбец с соответствующим определением/ограничения.

Я могу использовать журнал регистрации ошибок DML, чтобы данные, которые не соответствовали определению/ограничениям, перекачивались в таблицу отклонения без каких-либо сложное строчное кодирование.

Если у вас есть VARCHAR2 (1000), то в какой-то момент вы получите данные, которые будут длиннее, чем вы ожидаете (например, вы можете получить строку из 10 символов, но с 14 байтами, потому что некоторые символы являются мульти- байтов).