sqlite rowid怎么使用

sqlite rowid怎么使用,第1张

默认情况下,SQLite会自动存在一个RowID列,从1开始,每添加一条记录+1

设置了主键,而且主键的类型为integer时,查询RowID等于主键

主键设置为integer时,对rowid和主键的查询情况

create table aaa(id integer PRIMARY KEY,aaa ntext)

只有在设置为Integer时才会替代rowid,设置为int或其它都不行,下图为主键设置成int类型

create table aaa(id int PRIMARY KEY,aaa ntext)

写入效率对比:

插入500W记录,不设置主键,利用rowid,写入时间1分13秒

插入500W记录,设置Integer主键,写入时间1分19秒

检索效率对比:

对设置了integer主键的表,查询主键100W次,耗时1分20秒

对设置了integer主键的表,查询rowid 100W次,耗时1.22秒

对不设置主键的表,查询rowid 100W次,耗时1.23秒

(这2秒左右的差距,判断有两种可能,第一是程序运行时误差,第二种可能是因为主键是ID,比rowid长度小,所以拼接sql语句时,要占时间优势)

检索优化:

每次检索对command赋值,耗时约1分20秒

[csharp]

SQLiteCommand cmd = new SQLiteCommand(conn)

for (int i = 0i <1000000i++)

{www.2cto.com

cmd.CommandText = "select * from aaa where id=" + (1000000 + i)

cmd.ExecuteNonQuery()

}

每次检索对参数赋值,耗时约58秒

[csharp]

SQLiteCommand cmd = new SQLiteCommand(conn)

cmd.CommandText = "select * from aaa where id=@id"

cmd.Parameters.Add("id", DbType.Int32)

for (int i = 0i <1000000i++)

{www.2cto.com

cmd.Parameters[0].Value = (1000000 + i)

cmd.ExecuteNonQuery()

}

SQLite文件大小:

大小基本保持一致(但我发现不设置主键,添加一个ID字段为int时,文件大小也是一样的,猜测可能是SQLite预留的B Tree的空间)

结论:

不管是使用rowid还是自定义主键,查询效率基本相同,写入效率使用独立主键要损失大约8%的效率,不过好处是可以自己管理主键的内容

ROWID是一种数据类型,它使用基于64为编码的18个字符来唯一标识一条记录物理位置的一个ID,类似于Java中一个对象的哈希码,都是为了唯一标识对应对象的物理位置,需要注意的是ROWID虽然可以在表中进行查询,但是其值并未存储在表中,所以不支持增删改 *** 作,下面看个例子:

[html] view plain copy

SELECT ROWNUM,ROWID,empno,ename,job FROM emp WHERE ROWNUM <= 5

结果如下:

可以看到ROWID确实由18个字符组成,组成结构如下:

数据对象编号    文件编号    块编号    行编号  

OOOOOO    FFF    BBBBBB    RRR  

至于ROWID的作用,由于ROWID用来唯一标识表中数据的唯一性,所以可以利用这个特性去除重复,举个例子,首先运行下述两行代码:

[html] view plain copy

CREATE TABLE dept_bak AS SELECT * FROM dept

INSERT INTO dept_bak SELECT * FROM dept

得到一个如下的数据库表

很明显,数据有重复的,但是ROWID肯定不会重复的,那么就可以利用这个特性去重,简单示例代码如下:

[html] view plain copy

DELETE FROM dept_bak WHERE ROWID NOT IN( SELECT MIN(ROWID) FROM dept_bak GROUP BY DEPTNO)

ROWID是数据的详细地址,通过rowid,oracle可以快速的定位某行具体的数据的位置。

ROWID可以分为物理rowid和逻辑rowid两种。普通的堆表中的rowid是物理rowid,索引组织表(IOT)的rowid是逻辑rowid。oracle提供了一种urowid的数据类型,同时支持物理和逻辑rowid。

物理rowid又分为扩展rowid(extended rowid)和限制rowid(restricted rowid)两种格式。限制rowid主要是oracle7以前的rowid格式,现在已经不再使用,保留该类型只是为了兼容性。

1.创建一临时表

create table test_rowid (id number, row_id rowid)

2.插入一行记录

insert into test_rowid values(1,null)

3.修改刚插入的记录

update test_rowid set row_id = rowid where id = 1

4.查看rowid

select rowid,row_id from test_rowid


欢迎分享,转载请注明来源:内存溢出

原文地址: https://outofmemory.cn/bake/11607498.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2023-05-17
下一篇 2023-05-17

发表评论

登录后才能评论

评论列表(0条)

保存