Я пишу парсер Python для базы данных, созданной sqlite, и изучаю формат файла sqlite.Я внимательно ознакомился с официальным документом https://www.sqlite.org/fileformat.html и некоторыми дополнительными материалами, такими как https://forensicsfromthesausagefactory.blogspot.com/2011/05/analysis-of-record-structure-within.html.
. Упоминается, что у нас есть в основном 4 типа страниц, и я не понимаю, как работает Внутренняя таблица.Страницы B-Tree работают.
Я сделал несколько печатных сообщений, чтобы помочь мне понять проблему.Вот первый случай.У меня есть БД со 100 записями, и я не устанавливаю первичный ключ или индекс:
page type 5, page number 2
[9, 98]
[8, 84]
[7, 70]
[6, 56]
[5, 42]
[4, 28]
[3, 14]
page type 13, page number 3
skip actual data in leaf table b tree pages
page type 13, page number 4
page type 13, page number 5
page type 13, page number 6
page type 13, page number 7
page type 13, page number 8
page type 13, page number 9
page type 13, page number 10
Этот пример отлично работает для меня.страница номер 2 - это внутренняя таблица дерева b, первый элемент указывает на страницу дерева конечной таблицы b, которая содержит фактические данные, а второй элемент указывает на последний rowid каждой страницы дерева листа конечной таблицы b.
ТогдаЯ увеличиваю номер записи в базе данных со 100 до 1000. Вот вывод:
page type 5, page number 2
[5, 104]
[6, 90]
[7, 76]
[8, 62]
[9, 48]
[10, 34]
[11, 20]
[12, 133]
[13, 119]
[14, 105]
[15, 91]
[16, 77]
[17, 64]
[18, 50]
[19, 36]
[20, 22]
[21, 8]
[22, 121]
[23, 107]
[24, 93]
[25, 79]
[26, 65]
[27, 51]
[28, 37]
[29, 23]
[30, 9]
[31, 122]
[32, 108]
[33, 94]
[34, 80]
[35, 66]
[36, 52]
[37, 38]
[38, 24]
[39, 10]
[40, 123]
[41, 109]
[42, 95]
[43, 81]
[44, 67]
[45, 53]
[46, 39]
[47, 25]
[48, 11]
[49, 124]
[50, 110]
[51, 96]
[52, 82]
[53, 68]
[54, 54]
[55, 40]
[56, 26]
[57, 12]
[58, 125]
[59, 111]
[60, 97]
[61, 83]
[62, 69]
[63, 55]
[64, 41]
[65, 27]
[66, 13]
[67, 126]
[68, 112]
[69, 98]
[70, 84]
[71, 70]
[72, 56]
[73, 42]
[74, 28]
[4, 14]
page type 13, page number 3
page type 13, page number 4
page type 13, page number 5
page type 13, page number 6
page type 13, page number 7
page type 13, page number 8
page type 13, page number 9
page type 13, page number 10
page type 13, page number 11
page type 13, page number 12
page type 13, page number 13
page type 13, page number 14
page type 13, page number 15
page type 13, page number 16
page type 13, page number 17
page type 13, page number 18
... Skip more leaf pages
Как вы можете видеть, на этот раз идентификатор строки страницы № 2 (внутренняя таблица дерева b) не всегдаспускаться вниз.Кажется, что цикл в диапазоне:
[57, 12]
[58, 125]
[59, 111]
[60, 97]
[61, 83]
[62, 69]
[63, 55]
[64, 41]
[65, 27]
[66, 13] <- Here, instead of finding the records from 126 to 140, it points to 13. However, after checking the content of page, the content does match the record from 126 to 140. So why is the row id point to 13 here?
[67, 126] <- I could find records from 112 to 126 in page number 67, no problem
[68, 112]
[69, 98]
[70, 84]
[71, 70]
[72, 56]
[73, 42]
[74, 28]
[4, 14] <- I could find the first 14 records in page number 4, no problem
Мне интересно, почему rowid из строки [66, 13] указывает на это странное число.Согласно документу:
Внутренняя ячейка таблицы B-Tree (заголовок 0x05):
4-байтовый номер страницы с прямым порядком байтов, который является левым дочерним указателем.Varint, который является целочисленной клавишей
Вторым элементом должна быть просто целочисленная клавиша, в моем примере это rowid.
В моем следующем примере я дополнительно увеличу запись данныхот 1000 до 500к.Основным отличием является то, что будет многоуровневый уровень внутренних таблиц.Я также обнаружил некоторую проводную связь с внутренними страницами внутренней таблицы b моего родительского уровня:
page type 5, page number 2
[35417, 3938]
... skip some records
[9083, 1076]
[8684, 1094]
[8285, 984]
[7886, 1000]
[7487, 895]
[7088, 913]
[6689, 802]
[6290, 821]
[5891, 712]
[5492, 731]
[5093, 622]
[4694, 642]
[4295, 534]
[3896, 552]
[3497, 442]
[3098, 458]
[2699, 349]
[2300, 366]
[1901, 256]
[1501, 273]
[1029, 162]
[517, 125]
[516, 76]
page type 13, page number 3
page type 13, page number 4
page type 13, page number 5
page type 13, page number 6
... skip more pages
... skip more pages
... skip more pages
Что касается msg для печати на странице № 2, я понимаю, что левый элемент - это номер дочерней страницы внутренних страниц таблицы b.так как у нас много данных и будет многоуровневая внутренняя таблица b дерева страниц.Но опять же, что означает значение rowid?У меня 500 тыс. Записей, поэтому идентификатор строки должен быть в диапазоне от 1 до 500 000.Почему в этом примере это только 4k?