SQLite与SQL Server的区别

70

请问应该使用SQLite还是SQL Server?我之前一直将XML文件作为数据存储方式来执行添加、删除和更新操作。有人建议我使用SQLite以获取更快的操作速度,但我不熟悉SQLite,只了解SQL Server。


6
这种比较有点不实际。你是在将db-in-a-single-file(例如SQLite,MS Access)的解决方案与“真正的”关系型数据库(例如Oracle、SQLServer、PostgreSQL、MySQL)进行比较吗?还是只是在比较带有“SQL”名称的东西?;-) 这里有很多你忽略的标准(开源与商业-例如,SQLServer是商业的,而SQLite是开源的;有类型列与无类型列(SQLite列本质上是无类型的);可扩展与小规模等等。 - Brian Clapper
2
@Breakhead,如果这是你个人使用或者数据库写入不会被多个用户同时进行,并且数据安全性不是问题的话,SQLite 可能会很好地处理巨大量的数据。你可以将 SQLite 视为 MS-Access “JET” 数据引擎的替代品;它不是像 SQLServer 或 Oracle 那样的真正的客户端-服务器数据库引擎。 - Tim
你可能考虑持久化有状态的对象。我一直在使用这种技术,它非常有效。当我尝试用SQLite替换持久化的有状态对象时,我发现SQLite要慢得多 - 以至于我不得不完全放弃它,回到了持久化的有状态对象。 - John
2个回答

117

SQLite是一个很棒的嵌入式数据库,您可以将其与应用程序一起部署。如果您正在编写分布式应用程序,那么SQLite具有不需要任何单独的安装程序或维护的巨大优势——它只是一个单独的dll文件,随着您的应用程序的其他部分一起部署。

SQLite还在进程中运行,并减少了数据库带来的许多开销——所有数据都被缓存并在进程中查询。

SQLite与您的.NET应用程序集成比SQL Server更好。您可以使用任何.NET语言编写自定义函数,在SQLite引擎内运行,但仍在应用程序的调用进程和空间内,因此可以调用您的应用程序以集成其他数据或执行操作,同时执行查询。这种非常不寻常的能力使某些操作变得更加容易。

SQLite通常比SQL Server快得多。

但是,SQLite一次只支持一个写入器(即每个事务的执行)。当需要锁定整个数据库时,SQLite会锁定整个数据库,并且只有一个写入器可以持有写入锁。由于其速度,这对于小到中等大小的应用程序实际上并不是问题,但如果您有更高的写入量(每秒数百个),那么它可能会成为瓶颈。有许多可能的解决方案,例如将数据库数据分离为不同的数据库,并将写入缓存到队列中并异步写入它们。但是,如果您的应用程序可能会遇到这些使用要求并且尚未针对SQLite编写,则最好使用其他东西,如具有更细粒度锁定的SQL Server。

更新:SQLite 3.7.0添加了一种名为“写前日志记录”的新日志模式,支持读取时并发写入。在我们内部的多进程争用测试中,相同的有争议的读/写序列的计时从110秒降至8秒。


3
我只想质疑“SQLite在与你的.NET应用集成方面比SQL Server更好”的观点。[加粗强调] 两者都可以与.NET应用程序集成,但方式不同。您可以在SQL Server中定义CLR类,并在客户端和服务器之间发送这些类的实例。在SQLite中,您可以使用.NET语言创建自定义UDF,然后将其导入到SQLite中。另外,“低至中等大小应用程序”这样的短语真的毫无意义。您所说的“大小”是什么意思? - Tim
2
@Tim,我特别指出低到中等的负载需要高达每秒数百次的写入。超过这个数量,争用就会变得太棘手了。 - Samuel Neff
2
你好,Samuel。SQLite是否支持SQL的所有功能?还是因为其轻量级架构限制了函数的使用? - Bipin Vayalu
8
@BipinVayalu,不,SQLite不支持SQL Server的所有功能。SQLite是一种更基本的实现。尽管如此,它支持我所需的一切。 :-) - Samuel Neff
@JacobH 我已经有13年没接触.NET了,所以我没有数据(注意:OP在谈论从XML文件移动,因此数据很小,而且可能是单用户系统、桌面或嵌入式)。在这些情况下,SQLite 在许多方面都比较好,包括对于绝大多数查询更快(但请记住,我的经验来自于 13 年前)。没有 'right join',所以使用 'left join'?在子查询上进行连接也可以,甚至是相关联的连接。 - Samuel Neff
显示剩余6条评论

4
两者完全属于不同的类别。一个是为企业级数据管理而建立,另一个是为移动设备(嵌入式或无服务器环境)而建立。尽管SQLite部署可以容纳数百GB的数据,但它并不是为此而建立的。
更新:为了反映更新后的问题,请阅读关于SQLite的这篇博客文章。我希望这会有所帮助,并让您从.NET程序中以编程方式访问SQLite。

9
博客文章的链接已失效。 - Samuel

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接