Воздействие определения столбца VARCHAR2 с большей длиной
Каковы эффекты определения столбца с VARCHAR2(1000)
вместо VARCHAR2(10)
в Oracle, когда значения не превышают 10 байт?
Столбец занимает только место, необходимое для хранения значений, или это может отрицательно повлиять на размер/производительность табличных пространств/индексов?
Ответы
Ответ 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 байтами, потому что некоторые символы являются мульти- байтов).