当插入无序哈希作为rowid时,SQLite的行为如何?

时间:2019-01-10 17:13:32

标签: sql sqlite

根据rowid上的SQLite documentationrowid表的数据存储在B树中。我一直在考虑将数据的哈希值用作rowid。由于这意味着我将插入rowid的行,这些行的排序不像rowid的默认实现那样,除了会影响INSERTSELECT的性能外,表格中数据的布局?

如果我插入一行较大的rowid(因为它是一个哈希),然后插入一行较小的rowid,那么该表的布局会是什么样?

1 个答案:

答案 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; 

结果:-

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

和VACUUM之后(相同):-

enter image description here

有消息:-

-- INSERT INTO tabley VALUES(9223372036854775808,'Sarah');
INSERT INTO tabley VALUES(-9223372036854775809,'Bob')
> datatype mismatch
> Time: 0s