sqlite在Windows中的性能调试
作者:康小芳 来源:www.sqlite.com.cn
在Windows中的性能调试
为了使sqlite在大型数据库和小型用户系统里飞快地运行,我花费了大量时间,我遇到了许多可以加快它们程序运行的方法。
作为侧面注释,这些大型数据库有300万行之多,但sqlite仍可以很好的处理这么大量的数据。
我也把"包含在内,被动去做",如果你读的足够多(或者欺骗,只是跳到最后一个对象)。它是不能处理数据的,这是我的错误,所以我有义务来向大家澄清这一点。
这主要发生在Windows和Delphi环境下,但在其它情景下也许是个优点,请查阅sqlite 3.1.0:
直接使用sqlite
我建议你直接尝试使用sqlite,直接在数据库里执行程序要比使用一些假地址或查询函数好一些。(因为sqlite没有这些函数, 有能力的程序员通常需要生成复杂的和代价昂贵的cpu/HDD编码来模仿BDE的功能性)。
我建议你一定到改变你编码的方法,因为从我的经历来看,从DLL导出的函数使用起来很简单,可以满足你的需要,虽然它也许和某些人使用Delphi DBE的方法有些许的不同。
我自己发现sqliteWrappers 对我们有很大帮助,它使我们可以很快地把sql送到数据库,并马上得到我们所需要的结果。当然,这决定于你要做什么,和你对你所导出的DLL函数有多大信心。
如果你想往数据库里附加,插入,或者更新数据,下面的sql语句:
DB.Execsql('INSERT OR REPLACE INTO tableName (Field1,Field2,Field 3) ' +
'VALUES (Value1,Value2,Value3)');
可以像下面一样代替全部的旧数据:
IF Locate(Field1,Value1) THEN
UpdateTableFunction() // ...Lots of code here
ELSE
InsertIntoTableFunction(); // ...even more code HERE
保持代码是精确的并加快速度。记住在更新sql时换Begin Transactions和End Transactions。为了达到很高的效能,在一个事物处理程序中,我们运行上千个sql INSERTS。
这不是说使用componants不好,使用它们可以大大加快你开发程序的时间。即使你正在使用componants,你也一定要看看通过 sql测试sqlite(-> Execsql)。一个好的和谐的sql语句能详细而精确的满足你的需要,可以比一般的解决办法更快。
2:Indexes 和数据库结构是非常重要的。
当然,一个普通的数据库遵循法则一,但这是一个sql数据库,添加你所需要的索引是非常有必要的,即使是添加一个DON'T你不需要的索引也是很重要的。首先用你的判断力来计划一下数据库,使每个事都有一个功能,如果你不需要,则不必要它。
一个操作键有两个索引(例如复合和编入索引)可以减慢数据插入的速度, 当检索时它不会给你带来什么好处,因为sqlite将忽略这些。它将以最小的程度增加你的数据库的规模,即使速度对你来说不是什么大问题。
有一些其它的Wiki页面,比如PerformanceTuning它具体的讲述了这个问题。
3:页面规模也很重要
Windows NTFS系统默认的群的规格似乎是4096字节。把sqlite数据库的页面规格也设置成4096字节将加快数据库在系统中的速度,当然簇也要相同。
(注意,我认为Linux的群的规格是1024,这是新的sqlite数据库所默认的。)
判断你的群的规格的最简单的办法是用碎片整理程序整理驱动器,然后分析。这里有相关的讲解。
为了设置sqlite的页面规格,你需要创造一个新的EMPTY数据库,然后做
PRAGMA page_size=4096;
现在创建表格immediately(如果你想关闭sqlite指令行程序,重新打开数据库, 页面规格就被重新设置成1024)。在创建第一个表格前一定要设置页面的规格。
一旦表格建成,就不能改变页面规格了。
键入:
PRAGMA page_size;
将告诉你当时正在设置什么。
4:成群的索引
sqlite不支持成群的索引(简单来说,就是索引使数据库中的数据存入时索引的顺序是什么样,数据就怎样放置)
这意味着,如果你的索引是整数顺序,记录就会把数据库中的数据按整数顺序安排,1然后2然后3。
你不能生成一个成群的索引,但是你可以按顺序选择你的数据,这样任何历史数据都是整齐的安排好的。当然,当数据库成熟的时候,你丢失的数据,它都可以帮助你。
有人邮寄了下面的例子,这是个好例子,如果你有个WIBBLE表格,你想分析它的主要区段,如果有顺序那就好办啦。使用命令行工具,你可以通过下面指导创建一个家的群:
create table wibble2 as select * from wibble;
delete from wibble;
insert into wibble select * from wibble2 order by key;
drop table wibble2;
5:作为读这篇文章的收获,这里有个不智能的事情需要提醒你。
要非常非常谨慎你的数据库的名字,特别是extension
例如,如果你把你所有的数据库命名为extension .sdb( sqlite Database,好名字吧?我认为是,无论我怎么选都行)但你会发现SDB extension已然和APPFIX PACKAGES相关联了。
现在是个非常精彩的部分,APPFIX是Windows XP认可的可执行的程序,它将(强调我所说的ADD THE DATABASE TO THE SYSTEM RESTORE FUNCTIONALITY
这意味着,每次你往数据库里输入任何数据,Windows XP系统都认为一个可执行程序已经被改变,它将把你整个800 meg的数据库恢复到目录。
我认为DB或DAT是可取的。
整个系统所列的恢复的监控的文件名的扩展名可在下面网页找到: ¤http://msdn.microsoft.com/library/default.asp?url=/library/en-us/sr/sr/monitored_file_extensions.asp
祝你成功
Chris Schirlinger
chrisZEROSPAM@ZEROSPAMtimezulu.com.au (remove ZEROSPAM to email)