SQLite和其他大部分现代SQL数据库在基本设计目标上是不同的,它的目标是简单。SQLite遵循这一目标,即使这样偶尔会导致某些特性实现的低效化。下面列举了SQLite的一些缺陷:
SQL-92特性方面
正如前面提到的,SQLite不支持SQL-92的在很多企业数据库系统中可用的一些特性。
如:
外键约束(可解析的,但非强制)
很多ALTER TABLE特性
一些TRIGGER相关的特性
RIGHT和FULL OUTER JOIN
更新一个VIEW
GRANT和REVOKE
你可以在SQLite的主页上获取最新信息。
http://www.sqlite.org/omitted.html
http://www.sqlite.org/cvstrac/wiki?p=UnsupportedSql
低并发操作
SQLite只支持平面事务;它没有嵌套和营救点能力。嵌套意味着在一个事务中可以有子事务的能力。营救点允许一个事务返回到前面已经到达的状态。它没有能力确保高层次事务的并发。它允许在单个的数据库文件上多个并发的读事务,但是只能有一个排他的写事务。这个局限性意味着如果有事务在读数据库文件的一部分,所有其他的事务将被禁止写该文件的任何一部分。类似的,如果有事务在写数据库文件的一部分,所有其他事务将被禁止读或者写该文件的任何一部分。
应用限制
因为它事务处理的有限并发,SQLite只擅长处理小型的事务。在很多情况下,这不是问题。每个应用迅速的完成它的数据库工作然后继续前进,因此没有一个事务会持有数据库超过多少毫秒。但是在一些应用中,特别是写入密集的,要求更多的并发的事务处理(表或者行级别的而不是数据库级别的)那么你将要为该应用使用其他不同的DBMS。SQLite并不打算成为一个企业DBMS。他最适合于实现,维护和管理的简单性比商业数据库的无尽复杂特性更为重要的情况。
NFS问题
SQLite使用本地文件锁原语来控制事务处理的并发性。如果数据库文件驻留在网络分区上,可能会导致文件锁不能工作。很多的NFS实现被认为在它们的文件锁中是有bug的(在Unix和Windows上)。如果文件锁不能像预计的一样工作,那么就可能会有两个或两个以上的应用程序在同时修改相同数据库的同一部分,导致了数据库的毁坏。因为这个问题的出现是因为位于下层的文件系统的实现的BUG,所以SQLite没有办法阻止它的发生。
另一原因是大多数网络文件系统的连接延时,效果不是很好。在这种环境下,在数据库文件必须要跨网络访问的情况下,实现了客户端-服务器的模型的DBMS会比SQLite更有效。
数据库规模
因为它的开发人员的开发设计选择,SQLite可能不是一个做非常大型的数据库好选择。在理论上,一个数据库文件文件可以有2TB(241)。日志子系统的内存开销和数据库大小是成比例的。对每个写事务,无论事务实际是写是读那个页,SQLite为每个数据库页维护一个内存内信息位。默认的页大小是1024字节。即使如此,对一个有超过几百万页的数据库,内存开销可能成为一个严重的瓶颈。
对象的数目和类型
一个表或者索引被限制为最多有264 – 1个项。当然,你不可能有这么多的条目,因为数据库的241字节大小限制。在SQLite的当前的实现中,一个单独的条目能够持有230字节的数据。(下层的文件格式支持行大小相当于262字节的数据。)在打开一个数据库文件时,SQLite会阅读并且预处理来自主目录表的所有条目并且创建很多内存目录对象。所以,为了最好的性能,最好控制表,索引,视图和触发器的数目。同样虽然没有限制表中列的数目,超过几百列还是似乎太过的。只有表开始的31列是候选为必然被优化的。你能够在一个索引中尽可能加入列,但是有超过30列的索引将不会被用来优化。
宿主变量引用
在一些嵌入DBMS中,SQL语句能够直接引用宿主变量(即来自应用程序空间的那些值)。在SQLite中这是不行的。作为替代SQLite允许使用sqlite3_bind_* API函数来对输入参数而不是输出值绑定对SQL语句宿主变量。这种策略通常比直接的访问策略更好,因为后者需要特殊的预处理来将SQL语句转化为特殊的API调用。
存储过程
很多DBMS有被称为存储过程的能力来创建和存储。存储过程是形成逻辑作业单元和执行特殊任务的一组SQL语句。SQL查询过程能够使用这些过程。SQLite没有这个能力。
另外一些局限
不支持外键
如果你的表格中有类似的语句,sqlite会忽略的:
create table zope_suf.userroles (
name varchar(64) not null references zope_suf.users(name)
...
上面的外键refernces约束是不支持的,如果要支持,需要手工写trigger。
参考:http://www.sqlite.org/cvstrac/wiki?p=ForeignKeyTriggers
Client/Server应用
Sqlite是没有Server的,当然更适合做web应用一些。如果做C/S则需要通过文件共享来访问数据库,这个性能就差了;而且可能有写冲突。
高访问量的网站
Sqlite不可能把数据库对象分别部属在不同的计算机上,也就是说不可能实现数据库的clusting。如果要有这个特性,需要考虑其他C/S架构的数据库。
非常大的数据集
在处理事务中,sqlite会在内存中分配一个脏页面表: 每1M的数据库会耗用256Byte 的内存。如果你的数据库修改达到数G,这个内存耗用会非常大。
如果数据的修改和存储超过数十G(应该不会),你应该考虑其他的数据库。
高并行
SQLite是整个数据库级别的读写锁,大量并行读写,可能存在冲突。因此不适合多个进程并行读写的情况。
哎结果,SQLITE的轻量级数据库的定位决定了,它尽可能的去掉了一些,哪怕很必要的功能,
伤心泪奔~~~
相关推荐
在Android开发中,SQLite是一个重要的组成部分,它是一个轻量级的、开源的、自包含的关系型数据库管理系统,用于存储和管理应用程序的数据。SQLite被广泛应用于移动设备,因为它的体积小、性能好且易于使用。本教程...
在Android应用开发中,SQLite数据库是一个至关重要的组件,它为应用程序提供本地数据存储能力。SQLite是一个轻量级的关系型数据库,具有ACID(原子性、一致性、隔离性和持久性)事务支持,使得开发者可以在Android...
在Android应用开发中,SQLite是一个重要的组成部分,尤其对于需要存储用户数据或实现本地持久化功能的应用来说更是如此。本项目“基于Android SQLite的登录注册小项目”提供了一个实用的示例,展示了如何在Android...
SQLite是一款轻量级的数据库,它是Android系统中默认的数据存储解决方案。在Android应用开发中,SQLite数据库被广泛用于持久化应用程序的数据,如用户设置、游戏进度或者任何其他需要长期保存的信息。下面将详细介绍...
《深入解析Android SqliteManager源码》 在Android开发中,SQLite数据库是广泛使用的轻量级数据库,它允许开发者在应用程序中存储、管理和检索数据。SQLiteManager是一款方便开发者管理SQLite数据库的工具,其源码...
由于内存和性能限制,相比于大型服务器数据库,SQLite更适合于移动设备。 描述中的"android sqlite基本功能实现"意味着这个压缩包可能包含关于如何创建数据库、创建表、插入数据、查询数据、更新数据以及删除数据的...
### Android使用SQLite数据库知识点详解 #### 一、SQLite简介及特点 SQLite是一款广泛使用的嵌入式数据库管理系统,因其轻量级特性和强大的功能而在多个领域得到了广泛应用。它支持标准SQL查询语言,仅需少量内存...
SQLite是Android系统中内置的关系型数据库,用于存储和管理应用程序中的结构化数据。SQLite数据库具有轻量级、可移植、自包含的特点,非常适合在移动设备上使用。在Android开发中,SQLite是处理本地数据的主要方式之...
使用Android提供的权限系统,限制其他应用对数据库的访问。 10. 数据备份与恢复:Android提供了API来实现数据的备份和恢复,你可以利用`BackupAgentHelper`类来实现这一功能。 通过学习并实践以上知识点,你将能够...
在Android应用开发中,SQLite是一个轻量级的数据库系统,常用于存储应用程序中的结构化数据。SQLite数据库的优势在于它不需要单独的服务进程,可以直接嵌入到应用程序中,支持基本的SQL语法,非常适合移动设备上的...
在Android应用开发中,SQLite是一个重要的组成部分,它是一个轻量级的、开源的、嵌入式的SQL数据库引擎,被广泛用于存储和管理应用程序中的数据。本压缩包"android连接SQLite数据库源码.rar"提供了一个实际的示例,...
总的来说,AndroidSQLite是Android应用开发中存储和管理数据的重要工具。通过理解SQLite的内部结构、数据类型特性以及Android提供的API,开发者可以有效地构建和维护数据库驱动的应用程序。在设计数据库模型时,应...
SQLite是Android系统内置的关系型数据库,适合用于存储和检索应用中的数据。 1. **SQLite数据库简介** SQLite是一个轻量级的、开源的嵌入式SQL数据库引擎,它不需要单独的服务器进程,并且支持多种编程语言。在...
SQLite是一种轻量级的数据库系统,它被广泛应用于Android平台的本地数据存储。其主要优势在于不需要一个单独的服务器进程或系统,可以直接嵌入到应用程序中。SQLite数据库的操作通常涉及创建、读取、更新和删除...
此外,Android 10(API级别29)引入了存储访问框架,对访问外部存储进行了更严格的限制。在这些版本的Android上,可能需要使用Intent选择文件夹或者使用媒体存储API来访问SD卡。 通过以上步骤,开发者不仅可以创建...
在Android开发中,SQLite是一个重要的组成部分,它是轻量级的数据库系统,被广泛用于存储应用程序中的结构化数据。SQLite支持常见的数据库操作,如查询、修改、增加和删除数据,这正是"Android SQLite查改增删"这个...
Android SQLite数据库是Android平台上广泛使用的一种轻量级的嵌入式数据库系统。SQLite之所以受到开发者的青睐,是...尽管它有一些限制,但通过合理的设计和优化,SQLite能够在资源有限的环境下提供可靠的数据库支持。
SQLite在数据类型上的处理与其他SQL数据库有所不同,采用"弱类型"系统,允许在创建表时不严格限制列的数据类型。这意味着开发者可以将任何数据类型插入到任何列中,SQLite会尝试自动转换以适应列的定义。如果转换...
Android系统默认使用内部存储来保存SQLite数据库,但出于某些原因,如存储空间限制,开发者可能希望将数据库存储在外部存储(SDCard)。首先,确保在AndroidManifest.xml中添加了读写外部存储的权限: ```xml ...
在Android开发中,SQLite是一个非常重要的组成部分,它是一个轻量级的...为了深入理解,你可以下载提供的"001AndroidSqlite"压缩包,里面可能包含相关的源代码示例,这将有助于你更好地掌握实践中的技巧和最佳实践。