|
|
|
Pointer page
|
|||
|---|---|---|---|
|
#18+
Здравствуйте. Решил поизучать структуры таблиц птицы. Если я правильно понял, то Header_page.hdr_pages содержит ссылку на первую страницу rdb$pages. А эта таблица соответственно содержит список всех страниц базы и rdb$relation_id. Возник вопрос. А как собственно понять какой таблице принадлежит этот самый rdb$relation_id? Его можно получить на уровне sql из rdb$relations. А вот как на уровне страниц файла базы? Спасибо ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 13.11.2013, 18:58:01 |
|
||
|
Pointer page
|
|||
|---|---|---|---|
|
#18+
на уровне страниц файла базы нет такого понятия, как имена таблиц. Есть только ID. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 13.11.2013, 19:14:34 |
|
||
|
Pointer page
|
|||
|---|---|---|---|
|
#18+
dimitr, Догадывался) Как тогда на уровне страниц соотнести ID и названия страниц? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 13.11.2013, 19:28:37 |
|
||
|
Pointer page
|
|||
|---|---|---|---|
|
#18+
SwvКак тогда на уровне страниц соотнести ID и названия страниц? У страниц нет названий. Posted via ActualForum NNTP Server 1.5 ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 13.11.2013, 19:42:16 |
|
||
|
Pointer page
|
|||
|---|---|---|---|
|
#18+
Dimitry Sibiryakov, Ну пардон названия таблиц, соответствующих relation_id ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 13.11.2013, 20:20:08 |
|
||
|
Pointer page
|
|||
|---|---|---|---|
|
#18+
Swv, читай вот тут http://www.ibphoenix.com/resources/documents/design например с Firebird for the Database Expert: Episode 2 - Page Types там все написано. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 13.11.2013, 20:22:43 |
|
||
|
Pointer page
|
|||
|---|---|---|---|
|
#18+
SwvНу пардон названия таблиц, соответствующих relation_id Никак. На уровне страниц названия таблиц глубоко пофиг. Posted via ActualForum NNTP Server 1.5 ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 13.11.2013, 20:24:14 |
|
||
|
Pointer page
|
|||
|---|---|---|---|
|
#18+
А в чём проблема вытащить эти названия из rdb$relations по ID ? Тем более в коде сервера уже есть весь нужный код, наверное. Posted via ActualForum NNTP Server 1.5 ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 13.11.2013, 21:16:03 |
|
||
|
Pointer page
|
|||
|---|---|---|---|
|
#18+
Спрошу еще. добрался я до данных самой записи. Получил декомпрессированные данные. Далее нашел в инете такое описание Once the compression of the data in a column has been expanded, the data consists of three parts - a field header, the actual data and, if necessary, some padding bytes. Возник вопрос - как в этих данных найти значения полей? Посмотрел через Эксперт. Заметил, что для не системных таблиц в начале этого массива идут 4 байта, а потом уже данные полей. Что за 4 байта? У не системных таблиц перед началом данных полей 8 байт. Что за байты? В поле VARCHAR перед данными стоят 2 байта.Что это за байты? В поле VARCHAR которое NULL стоят 10 байт 0х00. Где можно про это почитать? Или может кто может пояснить? Спасибо ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 18.11.2013, 14:12:11 |
|
||
|
Pointer page
|
|||
|---|---|---|---|
|
#18+
Swv, я тебе уже вроде давал ссылку, где читать. кроме того, первоисточником тут является ods.hpp (или ods.h), где все структуры описаны. запись состоит из заголовка, и данных столбцов. столбцы нумеруются. Форматы записи лежат в rdb$formats. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 18.11.2013, 14:20:11 |
|
||
|
Pointer page
|
|||
|---|---|---|---|
|
#18+
SwvЗаметил, что для не системных таблиц в начале этого массива идут 4 байта, а потом уже данные полей. Что за 4 байта? Массив битовых NULL-флагов. Posted via ActualForum NNTP Server 1.5 ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 18.11.2013, 14:29:35 |
|
||
|
Pointer page
|
|||
|---|---|---|---|
|
#18+
SwvЗаметил, что для не системных таблиц в начале этого массива идут 4 байта, а потом уже данные полей. Что за 4 байта? У не системных таблиц перед началом данных полей 8 байт. Что за байты? определись, о чем именно спрашиваешь. Число байт NULL-маски зависит от числа столбцов таблицы. SwvВ поле VARCHAR перед данными стоят 2 байта.Что это за байты? длина строки SwvВ поле VARCHAR которое NULL стоят 10 байт 0х00. два байта - длина строки, остальное выравнивание до следующего поля (bigint или double precision, судя по всему) Тебе надо научиться понимать формат записи (rdb$formats), тогда декодирование записи в отдельные поля становится тривиальным. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 18.11.2013, 14:41:43 |
|
||
|
Pointer page
|
|||
|---|---|---|---|
|
#18+
еще вот это имеет смысл прочитать, как минимум про NULL-битмапы там разжевано ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 18.11.2013, 14:43:54 |
|
||
|
Pointer page
|
|||
|---|---|---|---|
|
#18+
dimitrЧисло байт NULL-маски зависит от числа столбцов таблицы. Оффтопик, конечно, но что там с моим предложением не включать в маску биты под ведомые NOT NULL поля? Оно проигнорировано или просто руки не доходят?.. Posted via ActualForum NNTP Server 1.5 ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 18.11.2013, 14:50:59 |
|
||
|
Pointer page
|
|||
|---|---|---|---|
|
#18+
Dimitry Sibiryakov, позабыто, наверное. Впрочем, оно мне все равно не нравится. Ибо, во-первых, потребует включать признак nullability столбцов в формат таблицы. А во-вторых, я не вижу чтобы оно дало какой-либо эффект при менее чем 32 ведомых NOT NULL полях (ибо вся экономия сожрется padding-ом до выравнивания первого поля). ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 18.11.2013, 14:57:54 |
|
||
|
Pointer page
|
|||
|---|---|---|---|
|
#18+
dimitrво-первых, потребует включать признак nullability столбцов в формат таблицы. А во-вторых, я не вижу чтобы оно дало какой-либо эффект при менее чем 32 ведомых NOT NULL полях (ибо вся экономия сожрется padding-ом до выравнивания первого поля). Во-первых, в формат можно включить уже посчитанную длину маски. Дальше при проверке если поле NULL или нет, будет достаточно ещё одного сравнения его номера с 8*<размер маски из формата>. Во-вторых, если в таблице два поля и оба NOT NULL - маска будет нулевого размера и в записи будет сэкономлено 4 байта, поскольку паддинг пойдёт лесом. В-третьих, это позволит иметь обратно-совместимые внешние файлы с поддержкой NULL-ов, но это уже отдельный тикет. Posted via ActualForum NNTP Server 1.5 ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 18.11.2013, 15:17:10 |
|
||
|
Pointer page
|
|||
|---|---|---|---|
|
#18+
Dimitry SibiryakovВо-первых, в формат можно включить уже посчитанную длину маски. Дальше при проверке если поле NULL или нет, будет достаточно ещё одного сравнения его номера с 8*<размер маски из формата>. Во-вторых, если в таблице два поля и оба NOT NULL - маска будет нулевого размера и в записи будет сэкономлено 4 байта, поскольку паддинг пойдёт лесом. В-третьих, это позволит иметь обратно-совместимые внешние файлы с поддержкой NULL-ов, но это уже отдельный тикет. 1) можно и так. Хотя инкрементировать номер формата (весьма ограниченный ресурс) на каждый чих NULL <-> NOT NULL мне не кажется очень удачной мыслью, даже если это в основном и коснется "таблиц из двух полей". 2) после компрессии экономия будет уже 2 байта 3) IMHO, это единственный повод вообще рассматривать эту идею ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 18.11.2013, 15:29:03 |
|
||
|
Pointer page
|
|||
|---|---|---|---|
|
#18+
dimitr(весьма ограниченный ресурс) Кто-то, кажется, уже предлагал при свипе помечать использованные форматы и удалять неиспользуемые. Posted via ActualForum NNTP Server 1.5 ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 18.11.2013, 15:31:34 |
|
||
|
Pointer page
|
|||
|---|---|---|---|
|
#18+
Dimitry Sibiryakov, вот когда этот кто-то (или кто-либо другой) это сделает, тогда и вернемся к этом разговору ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 18.11.2013, 15:33:33 |
|
||
|
Pointer page
|
|||
|---|---|---|---|
|
#18+
dimitrЧисло байт NULL-маски зависит от числа столбцов таблицы. Тебе надо научиться понимать формат записи (rdb$formats), тогда декодирование записи в отдельные поля становится тривиальным. По NULL маске вопрос. Вот смотрю я страницу данных RDB$RELATIONS В таблице 17 полей. Исходя из того, что написано в описании - 4 байта на каждые 32 поля. И далее кратно 4 байт. На странице данных по таблице RDB$RELATIONS данных полей начинаются с 9 байта. т.е. на маску ушло 8. Почему? И вопросик по поводу формата записи. Где почитать? Спасибо ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 19.11.2013, 16:38:36 |
|
||
|
Pointer page
|
|||
|---|---|---|---|
|
#18+
SwvВот смотрю я страницу данных RDB$RELATIONS В таблице 17 полей. Исходя из того, что написано в описании - 4 байта на каждые 32 поля. И далее кратно 4 байт. На странице данных по таблице RDB$RELATIONS данных полей начинаются с 9 байта. т.е. на маску ушло 8. на маску ушло 4 байта, еще 4 ушло на паддинг для выравнивания (ибо первое поле таблицы - 8-байтный blob id) SwvИ вопросик по поводу формата записи. Где почитать? только в исходниках, наверное. В ods.h есть структура Ods::Descriptor. В dsc_offset лежит смещение поля в буфере записи, в dsc_length - длина поля, в dsc_dtype - тип данных и т.п. По rhd_format записи читаешь формат из rdb$formats, там блоб = массиву структур Ods::Descriptor, по одной на поле таблицы. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 19.11.2013, 16:49:07 |
|
||
|
Pointer page
|
|||
|---|---|---|---|
|
#18+
dimitrтолько в исходниках, наверное. В ods.h есть структура Ods::Descriptor. В dsc_offset лежит смещение поля в буфере записи, в dsc_length - длина поля, в dsc_dtype - тип данных и т.п. По rhd_format записи читаешь формат из rdb$formats, там блоб = массиву структур Ods::Descriptor, по одной на поле таблицы. в RDB$Formats есть записи только на НЕ системные relations. Как быть с системными? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 19.11.2013, 16:59:26 |
|
||
|
Pointer page
|
|||
|---|---|---|---|
|
#18+
Swv, у них структура фиксированная. это вопрос курицы и яйца. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 19.11.2013, 17:00:40 |
|
||
|
Pointer page
|
|||
|---|---|---|---|
|
#18+
dimitrна маску ушло 4 байта, еще 4 ушло на паддинг для выравнивания (ибо первое поле таблицы - 8-байтный blob id) Т.е. если первое поле таблицы BLOB, то будет выравнивание до 8 байт? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 19.11.2013, 17:00:48 |
|
||
|
Pointer page
|
|||
|---|---|---|---|
|
#18+
Swvв RDB$Formats есть записи только на НЕ системные relations. Как быть с системными? прошивать их структуру в своей программе. См. /jrd/relations.h, /jrd/ini.epp. SwvТ.е. если первое поле таблицы BLOB, то будет выравнивание до 8 байт? да, насколько я помню ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 19.11.2013, 17:13:36 |
|
||
|
|

start [/forum/topic.php?fid=40&msg=38468608&tid=1564125]: |
0ms |
get settings: |
9ms |
get forum list: |
20ms |
check forum access: |
3ms |
check topic access: |
3ms |
track hit: |
29ms |
get topic data: |
13ms |
get forum data: |
3ms |
get page messages: |
85ms |
get tp. blocked users: |
2ms |
| others: | 193ms |
| total: | 360ms |

| 0 / 0 |
