Как ведет себя SQLite при вставке неупорядоченных хэшей в качестве rowid? - PullRequest
0 голосов
/ 10 января 2019

Согласно документации SQLite на rowid данные для таблиц rowid хранятся в B-дереве. Я рассматривал возможность использования хэша моих данных в качестве rowid. Поскольку это означает, что я буду вставлять строки с rowid s, которые не упорядочены, как реализация по умолчанию rowid, как это повлияет на производительность INSERT и SELECT в дополнение к расположению данных в моей таблице?

Если я вставлю строку с большим rowid, потому что это хеш, а затем строку с меньшим rowid, как будет выглядеть макет таблицы?

1 Ответ

0 голосов
/ 10 января 2019

Это зависит от того, как.

Если вы не определите псевдоним для столбца rowid и будет иметь место VACUUM , тогда значения rowid , скорее всего, будут испорчены (так как они могут / будут переназначены ).

например. : -

DROP TABLE IF EXISTS tablex;
CREATE TABLE IF NOT EXISTS tablex (data TEXT);
INSERT INTO tablex (rowid,data) VALUES(82356476978,'fred'),(55,'mary');
SELECT rowid AS therowid,* FROM tablex;
VACUUM;
SELECT rowid AS therowid,* FROM tablex; 

Результат: -

enter image description here

и затем: -

enter image description here

Если определен псевдоним, VACUUM не должен быть проблемой, и, как указано выше, это нормально.

Конечно, вы должны придерживаться правил, и если правила соблюдаются, то есть значения являются уникальными целыми числами и не больше 9223372036854775807 или меньше -9223372036854775808, тогда все должно быть в порядке. Другие значения могут привести к ошибке несоответствия типов данных.

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

например. следующее: -

DROP TABLE IF EXISTS tabley;
CREATE TABLE IF NOT EXISTS tabley (myrowidalias INTEGER PRIMARY KEY ,data TEXT);
INSERT INTO tabley VALUES(9223372036854775807,'fred'),(-9223372036854775808,'Mary'),(55,'Sue');
SELECT rowid AS therowid,* FROM tabley;
VACUUM;
SELECT rowid AS therowid,* FROM tabley;

-- INSERT INTO tabley VALUES(9223372036854775808,'Sarah'); -- Dataype mismatch
INSERT INTO tabley VALUES(-9223372036854775809,'Bob'); -- Datatype mismatch
SELECT rowid AS therowid,* FROM tabley; -- not run due to above error

Результат (обратите внимание на rowid, полученный через rowid и его псевдоним): -

enter image description here

и после ВАКУУМА (идентично): -

enter image description here

С сообщением: -

-- INSERT INTO tabley VALUES(9223372036854775808,'Sarah');
INSERT INTO tabley VALUES(-9223372036854775809,'Bob')
> datatype mismatch
> Time: 0s
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...