Рассчитать размер базы данных после конвертации в Unicode - PullRequest
0 голосов
/ 03 ноября 2018

Мы хотим преобразовать нашу базу данных (oracle 11g) из этого набора символов: ISO-8859-8

к этому набору символов: AL32UTF8.

Новый режим должен поддерживать европейские символы и многое другое.

Эти языки могут отображаться во многих таблицах.

Я хочу получить оценку нового размера таблиц \ всей базы данных

по текущим данным.

Есть ли хороший способ сделать это?

Ответы [ 2 ]

0 голосов
/ 05 ноября 2018

Я не понимаю, почему вы так беспокоитесь о размере. Возможно, БД будет на несколько (!) Процентов больше, скорее всего, вы не заметите никакой разницы.

В любом случае, этот PL / SQL должен дать представление о размере:

declare
   iso_size number;
   utf8_size number;

   iso_size_sum number := 0;
   utf8_size_sum number := 0;
begin

   for aCol in (select table_name, column_name from user_tab_cols where data_type = 'VARCHAR') loop

     iso_size.extend;
     utf8_size.extend;
     execute immediate 
     'select sum(LENGTH('||aCol.column_name||')), 
             sum(LENGTHB(convert('||aCol.column_name||', ''AL32UTF8'')))
      from '||aCol.table_name INTO iso_size, utf8_size;
      iso_size_sum := iso_size_sum + iso_size;
      utf8_size_sum := utf8_size_sum + utf8_size ;
   end loop;

   dbms_output.put_line('Current size: '||to_char(iso_size_sum/1024/1024))||' MiByte');
   dbms_output.put_line('Estimated UTF-8 size: '||to_char(utf8_size_sum/1024/1024))||' MiByte');

end;

Два числа должны указывать (!) На сколько вырастет база данных. Обратите внимание, что данные в Oracle организованы в блоках (обычно 8 килобайт), а не в байтах.

По соображениям производительности вы должны выполнять запрос только для одной типовой таблицы, а не для всей схемы.

0 голосов
/ 04 ноября 2018

Я не думаю это сильно изменится. Я предполагаю, что ваши VARCHAR2 столбцы в настоящее время определены как VARCHAR2(30), что по умолчанию означает VARCHAR2(30 BYTE). И это останется неизменным после преобразования. Если бы вы определили их как VARCHAR2(30 CHAR), я не уверен, что произойдет. Когда вы определяете столбец с символьной символикой, я думаю, что Oracle резервирует столько места, сколько ему может понадобиться, что составляет 4 байта на символ для AL32UTF8.

...