根据rowid
上的SQLite documentation,rowid
表的数据存储在B树中。我一直在考虑将数据的哈希值用作rowid
。由于这意味着我将插入rowid
的行,这些行的排序不像rowid
的默认实现那样,除了会影响INSERT
和SELECT
的性能外,表格中数据的布局?
如果我插入一行较大的rowid
(因为它是一个哈希),然后插入一行较小的rowid
,那么该表的布局会是什么样?
答案 0 :(得分:1)
这取决于如何。
如果您未为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;
结果:-
然后::-
如果定义了别名,则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):-
和VACUUM之后(相同):-
有消息:-
-- INSERT INTO tabley VALUES(9223372036854775808,'Sarah');
INSERT INTO tabley VALUES(-9223372036854775809,'Bob')
> datatype mismatch
> Time: 0s