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

当插入无序散列作为rowid时,SQLite的行为如何?,sql,sqlite,Sql,Sqlite,根据onrowid,rowid表的数据存储在B树中。我一直在考虑使用我的数据散列作为rowid。因为这意味着我将插入带有rowids的行,这些行的顺序与rowid的默认实现不同,除了表中的数据布局之外,这将如何影响INSERT和SELECT性能 如果我插入一个行,其中包含一个大的rowid,因为它是一个散列,然后插入一个行,其中包含一个小的rowid,那么表的布局会是什么样子呢?这取决于它的布局方式 如果没有为rowid列定义别名,并且出现了真空,则rowid值可能会出错(因为它们可能/将被重新

根据on
rowid
rowid
表的数据存储在B树中。我一直在考虑使用我的数据散列作为
rowid
。因为这意味着我将插入带有
rowid
s的行,这些行的顺序与
rowid
的默认实现不同,除了表中的数据布局之外,这将如何影响
INSERT
SELECT
性能


如果我插入一个行,其中包含一个大的
rowid
,因为它是一个散列,然后插入一个行,其中包含一个小的
rowid
,那么表的布局会是什么样子呢?

这取决于它的布局方式

如果没有为rowid列定义别名,并且出现了真空,则rowid值可能会出错(因为它们可能/将被重新分配)

e、 g:-

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; 
结果:-

然后:-

如果定义了别名,则真空不应成为问题,如上所述,这样做很好

当然,您必须遵守规则,并且只要遵守规则,即值是唯一的整数,并且不大于9223372036854775807或小于-9223372036854775808,那么就可以了。其他值将导致数据类型不匹配错误

我不认为这会对性能有多大影响,甚至可能会有改进,因为树叶中很可能没有空间,减少了成本更高的拆分需求

e、 g.下列各项:-

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):-

真空后(相同):-

留言:-

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

什么杂烩?类似GUID、UUID或SHA哈希的东西?它将是SHA哈希。