Место, занимаемое данными конкретного столбца и влияние на удаление этого столбца - PullRequest
0 голосов
/ 04 июля 2018

Я использую базу данных Oracle 12c в своем проекте, и у меня есть столбец «Имя» типа "VARCHAR2(128 CHAR) NOT NULL ". В моей таблице приблизительно 25328687 строк.

Теперь мне не нужен столбец «Имя», поэтому я хочу удалить его. Когда я вычислил общий размер данных в этом столбце (используя lengthb и vsize) для всех строк, он составил примерно 1,07 ГБ.

Поскольку указан максимальный размер данных в этом столбце, не всем строкам будет выделено 128 байтов для этого столбца (без учета юникода для простоты), а общее пространство, занимаемое этим столбцом, должно составлять 128 * число строки = 3242071936 байт или 3,24 ГБ.

Ответы [ 3 ]

0 голосов
/ 04 июля 2018

Oracle Varchar2 выделяет память динамически (определение говорит о типе данных строки переменной длины) Тип данных Char - это тип данных строки фиксированной длины.

create table x (a char(5), b varchar2(5));
insert into x value ('RAM', 'RAM');
insert into x value ('RAMA', 'RAMA');
insert into x value ('RAMAN', 'RAMAN');

SELECT * FROM X WHERE length(a) = 3; -> this will return 0 record
SELECT * FROM X WHERE length(b) = 3; -> this will return 1 record (RAM)

SELECT length(a) len_a, length(b) len_b from x ; 
o/p will be like below
len_a | len_b
-------------
5     | 3
5     | 4
5     | 5
0 голосов
/ 04 июля 2018

Как говорят другие ответы, хранилище, используемое столбцом VARCHAR2, равно VAR ying. Чтобы получить оценку фактической суммы, вы можете использовать

1) Словарь данных

SELECT column_name, avg_col_len, last_analyzed
  FROM ALL_TAB_COL_STATISTICS
 WHERE owner        = 'MY_SCHEMA'
   AND table_name   = 'MY_TABLE'
   AND column_name  = 'MY_COLUMN';   

Результат avg_col_len - средняя длина столбца. Умножьте его на число строк 25328687, и вы получите приблизительную оценку количества байтов, используемых в этом столбце. (Если last_analyzed НЕДЕЙСТВИТЕЛЕН или очень стар по сравнению с последним изменением больших данных, вам придется обновить статистику оптимизатора сначала DBMS_STATS.GATHER_TABLE_STATS('MY_SCHEMA','MY_TABLE').

2) Посчитайте себя в образце

SELECT sum(s), count(*), avg(s), stddev(s)
  FROM (
        SELECT vsize(my_column) as s 
          FROM my_schema.my_table SAMPLE (0.1)
       );

Это вычисляет размер хранилища для 0,1-процентной выборки вашей таблицы.

3) Чтобы знать наверняка, я бы проверил с подмножеством данных

CREATE TABLE my_test TABLESPACE my_scratch_tablespace NOLOGGING AS 
  SELECT * FROM my_schema.my_table SAMPLE (0.1);

-- get the size of the test table in megabytes
SELECT round(bytes/1024/1024) as mb 
  FROM dba_segments WHERE owner='MY_SCHEMA' AND segment_name='MY_TABLE';

-- now drop the column
ALTER TABLE my_test DROP (my_column);

-- and measure again
SELECT round(bytes/1024/1024) as mb 
  FROM dba_segments WHERE owner='MY_SCHEMA' AND segment_name='MY_TABLE';

-- check how much space will be freed up
ALTER TABLE my_test MOVE;

SELECT round(bytes/1024/1024) as mb 
  FROM dba_segments WHERE owner='MY_SCHEMA' AND segment_name='MY_TABLE';

Вы можете улучшить тест, используя те же уровни PCTFREE и COMPRESSION в своей тестовой таблице.

0 голосов
/ 04 июля 2018

Oracle делает динамическое выделение для varchar2.

Таким образом, строка из 4 символов будет занимать 5 байтов один для длины и 4 байта для 4 символов, если однобайтовый набор символов.

...