Добро пожаловать в форум, Guest  >>   Войти | Регистрация | Поиск | Правила | В избранное | Подписаться
Все форумы / Oracle Новый топик    Ответить
 как oracle хранит null ?  [new]
liarbur
Member

Откуда: г.Даблин, Серверная Ирландия
Сообщений: 89
Заинтересовался вопросом, как в физическом смысле Oracle хранит нулевую запись (null). Зависит ли это от типа данных. Сколько места занимает нулевая запись?
13 апр 11, 15:02    [10512975]     Ответить | Цитировать Сообщить модератору
 Re: как oracle хранит null ?  [new]
_Nikotin
Member

Откуда: СПб
Сообщений: 2965
alter system dump datafile xxx block yyy;
13 апр 11, 15:17    [10513067]     Ответить | Цитировать Сообщить модератору
 Re: как oracle хранит null ?  [new]
DВА
Member

Откуда:
Сообщений: 5439
никак не хранит, на то он и null
13 апр 11, 15:50    [10513348]     Ответить | Цитировать Сообщить модератору
 Re: как oracle хранит null ?  [new]
stax..
Guest
DВА
никак не хранит, на то он и null

ГЛАВА 5

████████████████████████████████████████████████████████████████

ОБЪЕКТЫ СХЕМЫ



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

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


stax
13 апр 11, 20:32    [10515109]     Ответить | Цитировать Сообщить модератору
 Re: как oracle хранит null ?  [new]
Relic Hunter
Member

Откуда: AB
Сообщений: 7675
stax..,

Откуда дровишки?
Oracle® Database Concepts
10g Release 2 (10.2)
To conserve space, a null in a column only stores the column length (zero). Oracle does not store data for the null column. Also, for trailing null columns, Oracle does not even store the column length
13 апр 11, 20:56    [10515211]     Ответить | Цитировать Сообщить модератору
 Re: как oracle хранит null ?  [new]
-2-
Member

Откуда:
Сообщений: 15330
Relic Hunter
Откуда дровишки?
Не хранит значение и не занимает места не одно и то же.
13 апр 11, 21:03    [10515234]     Ответить | Цитировать Сообщить модератору
 Re: как oracle хранит null ?  [new]
andrey_anonymous
Member

Откуда: Москва
Сообщений: 19924
Relic Hunter
stax..,

Откуда дровишки?
Oracle® Database Concepts
10g Release 2 (10.2)
To conserve space, a null in a column only stores the column length (zero). Oracle does not store data for the null column. Also, for trailing null columns, Oracle does not even store the column length
13 апр 11, 21:07    [10515245]     Ответить | Цитировать Сообщить модератору
 Re: как oracle хранит null ?  [new]
stax..
Guest
Relic Hunter
stax..,

Откуда дровишки?
Oracle® Database Concepts
10g Release 2 (10.2)
To conserve space, a null in a column only stores the column length (zero). Oracle does not store data for the null column. Also, for trailing null columns, Oracle does not even store the column length


ORACLE7 (tm)
Server Concepts Manual
РУКОВОДСТВО ПО КОНЦЕПЦИЯМ СЕРВЕРА
Part Number 6693-70-1292
December 1992

имхо, длину то хранить надо, для не последних NULL значений хранит длину 0 (на диске занимает 1 байт)

.....
stax
13 апр 11, 21:09    [10515250]     Ответить | Цитировать Сообщить модератору
 Re: как oracle хранит null ?  [new]
Relic Hunter
Member

Откуда: AB
Сообщений: 7675
stax..,

Для не последних null столбцов длина хранится в хедере, 1-байт для длин < 255 и 3-байта для длин > 255 байт. Значения null в блоках данных не хранятся.

К сообщению приложен файл. Размер - 12Kb
13 апр 11, 21:18    [10515294]     Ответить | Цитировать Сообщить модератору
 Re: как oracle хранит null ?  [new]
stax..
Guest
Relic Hunter
stax..,

Для не последних null столбцов длина хранится в хедере, 1-байт для длин < 255 и 3-байта для длин > 255 байт. Значения null в блоках данных не хранятся.

імхо, значение не хранится, но длина (0) не последнего NULL поля хранится, в результате на диске поле (с учетом длины) занимает 1байт


ps
мож завтра сделаю дамп блока
.....
stax
13 апр 11, 21:44    [10515374]     Ответить | Цитировать Сообщить модератору
 Re: как oracle хранит null ?  [new]
Alexander Anokhin
Member

Откуда: Хабаровск
Сообщений: 524
Relic Hunter
stax..,

Для не последних null столбцов длина хранится в хедере, 1-байт для длин < 255 и 3-байта для длин > 255 байт. Значения null в блоках данных не хранятся.


Под картинкой
The row header precedes the data and contains information about:

Row pieces

Chaining (for chained row pieces only)

Columns in the row piece

Cluster keys (for clustered data only)

A row fully contained in one block has at least 3 bytes of row header. After the row header information, each row contains column length and data. The column length requires 1 byte for columns that store 250 bytes or less, or 3 bytes for columns that store more than 250 bytes, and precedes the column data. Space required for column data depends on the datatype. If the datatype of a column is variable length, then the space required to hold a value can grow and shrink with updates to the data.

To conserve space, a null in a column only stores the column length (zero). Oracle does not store data for the null column. Also, for trailing null columns, Oracle does not even store the column length.


liarbur
Заинтересовался вопросом, как в физическом смысле Oracle хранит нулевую запись (null). Зависит ли это от типа данных. Сколько места занимает нулевая запись?


SQL>  create table t
  2    (n number,
  3     d date,
  4    v1 varchar2(10),
  5    v2 varchar2(10),
  6    v3 varchar2(10),
  7    v4 varchar2(10),
  8    v5 varchar2(10));
 
Table created

SQL>   insert into t values(null, null, 'A', null, 'B', null, null);
 
1 row inserted

SQL>   select dbms_rowid.rowid_relative_fno(rowid) file#, dbms_rowid.rowid_block_number(rowid) block# from t;
 
     FILE#     BLOCK#
---------- ----------
         1     697528

SQL>   alter system dump datafile 1 block 697528;
 
System altered

Start dump data blocks tsn: 0 file#: 1 minblk 697528 maxblk 697528
buffer tsn: 0 rdba: 0x004aa4b8 (1/697528)
scn: 0x094a.be01dffd seq: 0x04 flg: 0x00 tail: 0xdffd0604
frmt: 0x02 chkval: 0x0000 type: 0x06=trans data
Hex dump of block: st=0, typ_found=1
Dump of memory from 0x00000001068D6200 to 0x00000001068D7200
1068D6200 06820000 004AA4B8 BE01DFFD 094A0400  [.....J.......J..]
1068D6210 00000000 01000000 00163B43 BE01DFFD  [..........;C....]
1068D6220 094A0000 00020300 00000000 00870004  [.J..............]
1068D6230 0037CB9C 80456E24 E3661200 00010000  [.7...En$.f......]
1068D6240 00000000 00000000 00000000 00000000  [................]
1068D6250 00000000 00000000 00000000 00010001  [................]
1068D6260 FFFF0014 0F960F82 0F820000 00010F96  [................]
1068D6270 00000000 00000000 00000000 00000000  [................]
        Repeat 247 times
1068D71F0 00002C01 05FFFF01 41FF0142 DFFD0604  [..,.....A..B....]
Block header dump:  0x004aa4b8
 Object id on Block? Y
 seg/obj: 0x163b43  csc: 0x94a.be01dffd  itc: 2  flg: O  typ: 1 - DATA
     fsl: 0  fnx: 0x0 ver: 0x01
 
 Itl           Xid                  Uba         Flag  Lck        Scn/Fsc
0x01   0x0087.004.0037cb9c  0x80456e24.e366.12  ----    1  fsc 0x0000.00000000
0x02   0x0000.000.00000000  0x00000000.0000.00  ----    0  fsc 0x0000.00000000
 
data_block_dump,data header at 0x1068d625c
===============
tsiz: 0xfa0
hsiz: 0x14
pbl: 0x1068d625c
bdba: 0x004aa4b8
     76543210
flag=--------
ntab=1
nrow=1
frre=-1
fsbo=0x14
fseo=0xf96
avsp=0xf82
tosp=0xf82
0xe:pti[0]	nrow=1	offs=0
0x12:pri[0]	offs=0xf96
block_row_dump:
tab 0, row 0, @0xf96
tl: 10 fb: --H-FL-- lb: 0x1  cc: 5
col  0: *NULL*
col  1: *NULL*
col  2: [ 1]  41
col  3: *NULL*
col  4: [ 1]  42
end_of_block_dump
End dump data blocks tsn: 0 file#: 1 minblk 697528 maxblk 697528
13 апр 11, 22:03    [10515432]     Ответить | Цитировать Сообщить модератору
 Re: как oracle хранит null ?  [new]
andrey_anonymous
Member

Откуда: Москва
Сообщений: 19924
Alexander Anokhin
 
data_block_dump,data header at 0x1068d625c


Гораздо нагляднее дамп блока таблицы ~500 колонок.

Ну и не обязательно дампить блоки.
Можно и так убедиться, что не-последние null-колонки могут занимать довольно много места:
declare
  stmnt varchar2(32000) := 'create table ane_test(c000 varchar2(10)';
begin
  for i in 1..999 loop
    stmnt := stmnt || ', c'||to_char(i,'FM000')||' varchar2(10)';
  end loop;
  stmnt := stmnt || ')';
  execute immediate stmnt;
end;
/
 
PL/SQL procedure successfully completed
insert into ane_test (c000) select 'X' from dual connect by level < 1000;
 
999 rows inserted
insert into ane_test (c999) select 'X' from dual connect by level < 1000;
 
999 rows inserted
commit;
 
Commit complete
select C000, C999, count(*) n_of_rows, count(distinct dbms_rowid.rowid_block_number(rowid)) n_of_blocks from ane_test
group by  C000, C999;
 
C000       C999        N_OF_ROWS N_OF_BLOCKS
---------- ---------- ---------- -----------
           X                 999         149
X                            999           2
 
SQL> 
13 апр 11, 22:50    [10515619]     Ответить | Цитировать Сообщить модератору
 Re: как oracle хранит null ?  [new]
DВА
Member

Откуда:
Сообщений: 5439
непоследнее поле null имеет единственный байт 0xFF в структуре, предназначенной для определения длины содержимого поля. В дампах это не увидите, потому что оракл уже интерпретировал это значение как null
14 апр 11, 01:36    [10516095]     Ответить | Цитировать Сообщить модератору
 Re: как oracle хранит null ?  [new]
Relic Hunter
Member

Откуда: AB
Сообщений: 7675
DВА
В дампах это не увидите, потому что оракл уже интерпретировал это значение как null

Why? В сыром, неформатированном дампе видно.
insert into t values(null, null, 'A', null, 'B', null, null);

dump:
05FFFF01 41FF0142

05 - number of columns
FF - null
FF - null
01 - field len
41 - 'A'
FF - null
01 - field len
42 - 'B'
14 апр 11, 01:52    [10516108]     Ответить | Цитировать Сообщить модератору
 Re: как oracle хранит null ?  [new]
liarbur
Member

Откуда: г.Даблин, Серверная Ирландия
Сообщений: 89
Большое спасибо всем за исчерпывающие ответы
14 апр 11, 10:33    [10516770]     Ответить | Цитировать Сообщить модератору
 Re: как oracle хранит null ?  [new]
DВА
Member

Откуда:
Сообщений: 5439
Relic Hunter,

да, сори
забыла что в текущих версиях дамп блока еще и бинарник показывает
14 апр 11, 15:03    [10518853]     Ответить | Цитировать Сообщить модератору
 Re: как oracle хранит null ?  [new]
Стронций Теллурович
Guest
liarbur
Большое спасибо всем за исчерпывающие ответы
Самое смешное, что исчерпывающего ответа так никто и не дал
14 апр 11, 17:06    [10519777]     Ответить | Цитировать Сообщить модератору
 Re: как oracle хранит null ?  [new]
Sergei.Agalakov
Member

Откуда:
Сообщений: 575
Стронций Теллурович, ну дайте же нам наконец исчерпывающий ответ, которого так никто и не дал!
Автору он, правда, уже не нужен, ему и неисчерпывающих хватило, но остальные с удовольствием оценят ваш ответ.
14 апр 11, 18:26    [10520330]     Ответить | Цитировать Сообщить модератору
 Re: как oracle хранит null ?  [new]
stax..
Guest
Sergei.Agalakov
Стронций Теллурович, ну дайте же нам наконец исчерпывающий ответ, которого так никто и не дал!
Автору он, правда, уже не нужен, ему и неисчерпывающих хватило, но остальные с удовольствием оценят ваш ответ.

я так понял, Стронций Теллурович интересуется сколько места займет запись cо всеми полями is null

.....
stax
14 апр 11, 20:26    [10520647]     Ответить | Цитировать Сообщить модератору
Между сообщениями интервал более 1 года.
 Re: как oracle хранит null ?  [new]
avang
Member

Откуда:
Сообщений: 5
Null в конце строки не занимают места совсем. Null до не null столбца занимают 1 байт. Информация из документации по Oracle. Ссылка на версию 9с, но и в 19с тоже самое.

Nulls Indicate Absence of Value
23 ноя 21, 19:58    [22399919]     Ответить | Цитировать Сообщить модератору
 Re: как oracle хранит null ?  [new]
SQL*Plus
Member

Откуда: Россия, Москва
Сообщений: 8544
avang
Null в конце строки не занимают места совсем. Null до не null столбца занимают 1 байт. Информация из документации по Oracle. Ссылка на версию 9с, но и в 19с тоже самое.

Nulls Indicate Absence of Value


А 10+ лет тому назад люди об этом что-то другое тут написали? :-)
24 ноя 21, 18:18    [22400345]     Ответить | Цитировать Сообщить модератору
Все форумы / Oracle Ответить