Форум программистов, компьютерный форум, киберфорум
SQLite
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Заблокирован

Оптимальный по скорости выборки и объему вариант таблицы - обычная с ROWID или WITHOUT ROWID?

06.08.2022, 22:04. Показов 686. Ответов 0
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Из инфы по SQLite вынес,
что если есть возможность сделать первичный ключ таблицы целочисленным, то это хорошо - его можно определить известным способом и он станет псевдонимом ROWID.
Тогда поиск по этому нашему первичному ключу будет идти быстро, поскольку данные будут по нему кластеризированы. То есть, будут физически храниться на диске упорядоченными по значению нашего ключа, поскольку он псевдоним ROWID, а данные в SQLite хранятся упорядоченными по ROWID (по внутреннему индексу). Если это не таблица WITHOUT ROWID.
При этом, помимо ожидаемого быстрого поиска будет и экономия объема в силу того, что, если таблица с ROWID, то данные хранятся в B+ дереве, а не в B дереве (как в таблице WITHOUT ROWID). Отлично!
Но!
Читаю в одном популярном блоге прямо противоположную рекомендацию, имею ввиду прежде всего пункт №2, но и остальные тоже...:
Из-за особенностей работы таблиц WITHOUT ROWID, разработчики SQLite рекомендуют использовать такие таблицы в тех случаях, когда:
1. Вы используете составные первичные ключи или когда первичный ключ не является целым числом, а имеет другой тип данных.
2. Если вам нужно повысить скорость работы таблицы с первичным ключом INTEGER, создавайте таблицу без внутреннего индекса, этим вы ускорите выборку и уменьшите объем базы данных. Если таблицы имеет индекс ROWID и индекс в виде INTEGER PRIMARY KEY, то SQLIte делает перебор двумя циклами: первый цикл идет по столбцу ROWID, второй цикл идет по столбцу INTEGER PRIMARY KEY, хотя значения этих столбцов совпадают.
3. Если в таблицах хранятся строки с малыми значениями, то таблицы без индекса (WITHOUT ROWID) будут работать несколько быстрее, чем со столбцом ROWID.
То есть, согласно пункту 2 рекомендуют использовать таблицу WITHOUT ROWID.
У меня есть версия, что эти рекомендации нужно понимать так. Если "в таблицах хранятся строки с малыми значениями", то большого преимущества B+ дерева перед просто B деревом нет. И тогда вступают в силу факторы дополнительных издержек, связанных с наличием внутреннего индекса по ROWID и вот этот упомянутый "двойной поиск" (на самом деле не знаю, будет ли реально поиск двойным, для случая, когда целочисленный первичный ключ является псевдонимом? Есть сомнения, может быть в этом блоге автор ошибся?).
Если это так, то каков критерий того, что строка таблицы имеет "малое значение"? Это эквивалентно тому, что в таблице много строк? Или что-то ещё?
Поясню.
Меня интересует случай, когда имеется таблица с очень большим числом строк (порядка нескольких сот миллионов). Первичный ключ планирую сделать целочисленным - его значение будет генериться в коде (для этого перевожу набор целочисленных и текстовых значений в целочисленные - о своему алгоритму).
И тут не понятно, то ли использовать первичный ключ как псевдоним ROWID, то ли делать таблицу без ROWID, чтобы индекс по моему первичному целочисленному ключу был кластеризированным (но в этом случае будет B дерево, а не B+ дерево). Пытаюсь соптимизировать в первую очередь скорость выборки по первичному ключу. Объем - тоже, но во вторую очередь.
P.S. То ли вообще сделать таблицу WITHOUT ROWID и использовать составной первичный ключ из набора столбцов типа INTEGER и TEXT.
Вот тут полезная информация, но местами противоречит процитированному блогу. Только что нашел её, пока писал вопрос))) Не успел просмотреть подробно.
Таки чему верить? Как быть?

Добавлено через 7 минут
Увидел сейчас, что есть такой критерий - если размер строки меньше 1/20 страницы, то строка маленькая по размеру. Для стандартной страницы в 1024 байта это всего 50 байт. Не много. У меня примерно 50 байт и будет) Может чуть меньше)

Добавлено через 3 минуты
Вообще, такое ощущение, что для лучшего соответствия стандартам SQL и следовательно для уменьшения возможной головной боли нужно использовать WITHOUT ROWID и STRICT (последнее уж точно). Ну, это с учетом того, что WITHOUT ROWID несколько ограничивает возможности - например, в них нельзя использовать некоторый функционал для типа BLOB.
0
cpp_developer
Эксперт
20123 / 5690 / 1417
Регистрация: 09.04.2010
Сообщений: 22,546
Блог
06.08.2022, 22:04
Ответы с готовыми решениями:

ROWID
Уважаемые корифеи, скжите пож-та в каких случаях и как используется в SQL запросах ROWID.Спаибо.

ResultSet.refreshRow() без RowId?
Всем привет! Проблема в следующем. У меня запрос к БД состоит из вызова типа такого: SELECT * FROM items_list() т.е. вызывается...

В чем разница между UROWID и ROWID?
Привет . В чем разница между UROWID и ROWID ? UROWID имеет практическое применение ?

0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
raxper
Эксперт
30234 / 6612 / 1498
Регистрация: 28.12.2010
Сообщений: 21,154
Блог
06.08.2022, 22:04
Помогаю со студенческими работами здесь

Ошибка rowid при объединений таблиц
Здравствуйте Уважаемые форумачене! Имеется такие таблица T_PERSON с такими данными: Name Null Type ...

Первичный ключ типа INTEGER и ROWID - критерии совместимости
Увидел в одной статье, что если используется первичный ключ типа INTEGER, то лучше включить опцию для данной таблицы "без ROWID",...

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

Оптимальный вариант структуры БД
Здравствуйте! Прошу совета по организации структуры базы данных. К примеру, мне требуется хранить в БД комментарии к разным постам... Так...

Оптимальный вариант переустановки
Решил переустановить систему и обнаружил что случайно снёс раздел восстановления. Официальный сайт ничем не может помочь и предлагает...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
1
Ответ Создать тему
Новые блоги и статьи
Модель заражения группы наркоманов
alhaos 17.04.2026
Условия задачи сформулированы тут Суть: - Группа наркоманов из 10 человек. - Только один инфицирован ВИЧ. - Колются одной иглой. - Колются раз в день. - Колются последовательно через. . .
Мысли в слух. Про "навсегда".
kumehtar 16.04.2026
Подумалось тут, что наверное очень глупо использовать во всяких своих установках понятие "навсегда". Это очень сильное понятие, и я только начинаю понимать край его смысла, не смотря на то что давно. . .
My Business CRM
MaGz GoLd 16.04.2026
Всем привет, недавно возникла потребность создать CRM, для личных нужд. Собственно программа предоставляет из себя базу данных клиентов, в которой можно фиксировать звонки, стадии сделки, а также. . .
Знаешь почему 90% людей редко бывают счастливыми?
kumehtar 14.04.2026
Потому что они ждут. Ждут выходных, ждут отпуска, ждут удачного момента. . . а удачный момент так и не приходит.
Фиксация колонок в отчете СКД
Maks 14.04.2026
Фиксация колонок в СКД отчета типа Таблица. Задача: зафиксировать три левых колонки в отчете. Процедура ПриКомпоновкеРезультата(ДокументРезультат, ДанныеРасшифровки, СтандартнаяОбработка) / / . . .
Настройки VS Code
Loafer 13.04.2026
{ "cmake. configureOnOpen": false, "diffEditor. ignoreTrimWhitespace": true, "editor. guides. bracketPairs": "active", "extensions. ignoreRecommendations": true, . . .
Оптимизация кода на разграничение прав доступа к элементам формы
Maks 13.04.2026
Алгоритм из решения ниже реализован на нетиповом документе, разработанного в конфигурации КА2. Задачи, как таковой, поставлено не было, проделанное ниже исключительно моя инициатива. Было так:. . .
Контроль заполнения и очистка дат в зависимости от значения перечислений
Maks 12.04.2026
Алгоритм из решения ниже реализован на примере нетипового документа "ПланированиеПерсонала", разработанного в конфигурации КА2. Задача: реализовать контроль корректности заполнения дат назначения. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru