SQLite研究——性能优化

SQLite研究——性能优化
 
作者:JD Space  来源:www.sqlite.com.cn  时间:2006-11-24  【 字体: 】 〖 双击滚屏 〗
 
<script type="text/JavaScript"> var yahoo_pid="un_52773_769_19"; var yahoo_bordercolor="FFFFFF"; var yahoo_titlecolor="0080c0"; var yahoo_descolor="000000"; var yahoo_linkcolor="006600"; var yahoo_titlebgcolor="FFFFFF"; var yahoo_desbgcolor="FFFFFF"; var yahoo_width=550; var yahoo_height=80; var yahoo_isbanner=1; var yahoo_displink=1; var yahoo_adsnum=3; var yahoo_simple=0; var yahoo_iniframe=1; </script> <script src="http://cm.p4p.cn.yahoo.com/inf.js" type="text/javascript"></script> border="0" marginwidth="0" marginheight="0" src="http://cm.p4p.cn.yahoo.com/cm?u=http%3A%2F%2Fwww.sqlite.com.cn%2FMySqlite%2F4%2F289.Html&i=un_52773_769_19&w=550&h=80&bd=FFFFFF&tc=0080c0&dc=000000&lc=006600&l=1&ib=1&ad=3&tb=FFFFFF&db=FFFFFF&si=0&k=sqlite+like&dt=SQLite%E7%A0%94%E7%A9%B6%E2%80%94%E2%80%94%E6%80%A7%E8%83%BD%E4%BC%98%E5%8C%96%20--SQLite%20%E4%B8%AD%E6%96%87%E7%A4%BE%E5%8C%BA--%20http%3A%2F%2Fwww.sqlite.com.cn%2F&r=http%3A%2F%2Fwww.google.cn%2Fsearch%3Fhl%3Dzh-CN%26newwindow%3D1%26q%3Dsqlite%2Blike%26btnG%3DGoogle%2B%25E6%2590%259C%25E7%25B4%25A2%26meta%3Dlr%253Dlang_zh-CN%257Clang_zh-TW&mk=sqlite%2Csqlite3%2CSQLite%2CSQLite%2Cdatabase%2CSQLite%2C%E5%BC%80%E5%8F%91%2CSQLite%2C%E6%95%B0%E6%8D%AE%E5%BA%93%2CSQLite%2C%E6%95%B0%E6%8D%AE%E5%BA%93%E5%BC%95%E6%93%8E%2CSQLite%2C%E4%B8%AD%E6%96%87%2CSQLite%2C%E4%B8%AD%E6%96%87%E7%A4%BE%E5%8C%BA%2CSQLite%2C%E4%B8%AD%E6%96%87%E8%AE%BA%E5%9D%9B%2CSQLite%2C%E7%BC%96%E7%A8%8B%2CSQLite%2C%E8%AF%AD%E6%B3%95%2CSQLite%2C%E4%B8%8B%E8%BD%BD%2CSQLite%2C%E8%B5%84%E6%96%99%2CSQLite%2C%E5%B5%8C%E5%85%A5%E5%BC%8F%E6%95" frameborder="0" width="550" scrolling="no" height="80">
 

SQLite研究——性能优化

 

很多人直接就使用了,并未注意到SQLite也有配置参数,可以对性能进行调整。有时候,产生的结果会有很大影响。

主要通过pragma指令来实现。

比如: 空间释放、磁盘同步、Cache大小等。

不要打开。前文提高了,Vacuum的效率非常低!

PRAGMA auto_vacuum;
PRAGMA auto_vacuum =
0 | 1;

查询或设置数据库的auto-vacuum标记。

正常情况下,当提交一个从数据库中删除数据的事务时,数据库文件不改变大小。未使用的文件页被标记并在以后的添加操作中 再次使用。这种情况下使用VACUUM命令释放删除得到的空间。

当开启auto-vacuum,当提交一个从数据库中删除数据的事务时,数据库文件自动收缩, (VACUUM命令在auto-vacuum开启的数据库中不起作用)。数据库会在内部存储一些信息以便支持这一功能,这使得 数据库文件比不开启该选项时稍微大一些。

只有在数据库中未建任何表时才能改变auto-vacuum标记。试图在已有表的情况下修改不会导致报错。

 

建议改为8000

  • PRAGMA cache_size;
    PRAGMA cache_size =
    Number-of-pages;

    查询或修改SQLite一次存储在内存中的数据库文件页数。每页使用约1.5K内存,缺省的缓存大小是2000. 若需要使用改变大量多行的UPDATE或DELETE命令,并且不介意SQLite使用更多的内存的话,可以增大缓存以提高性能。

    当使用cache_size pragma改变缓存大小时,改变仅对当前对话有效,当数据库关闭重新打开时缓存大小恢复到缺省大小。 要想永久改变缓存大小,使用default_cache_size pragma.

     

    打开。不然搜索中文字串会出错。

    PRAGMA case_sensitive_like;
    PRAGMA case_sensitive_like =
    0 | 1;

    LIKE运算符的缺省行为是忽略latin1字符的大小写。因此在缺省情况下'a' LIKE 'A'的值为真。可以通过打开 case_sensitive_like pragma来改变这一缺省行为。当启用case_sensitive_like,'a' LIKE 'A'为假而 'a' LIKE 'a'依然为真。

     

    打开。便于调试

    PRAGMA count_changes;
    PRAGMA count_changes =
    0 | 1;

    查询或更改count-changes标记。正常情况下INSERT, UPDATE和DELETE语句不返回数据。 当开启count-changes,以上语句返回一行含一个整数值的数据——该语句插入,修改或删除的行数。 返回的行数不包括由触发器产生的插入,修改或删除等改变的行数。

    PRAGMA page_size;
    PRAGMA page_size =
    bytes;

    查询或设置page-size值。只有在未创建数据库时才能设置page-size。页面大小必须是2的整数倍且大于等于512小于等于8192。 上限可以通过在编译时修改宏定义SQLITE_MAX_PAGE_SIZE的值来改变。上限的上限是32768.

     

    如果有定期备份的机制,而且少量数据丢失可接受,用OFF

    PRAGMA synchronous;
    PRAGMA synchronous = FULL;
    (2)
    PRAGMA synchronous = NORMAL;
    (1)
    PRAGMA synchronous = OFF;
    (0)

    查询或更改"synchronous"标记的设定。第一种形式(查询)返回整数值。 当synchronous设置为FULL (2), SQLite数据库引擎在紧急时刻会暂停以确定数据已经写入磁盘。 这使系统崩溃或电源出问题时能确保数据库在重起后不会损坏。FULL synchronous很安全但很慢。 当synchronous设置为NORMAL, SQLite数据库引擎在大部分紧急时刻会暂停,但不像FULL模式下那么频繁。 NORMAL模式下有很小的几率(但不是不存在)发生电源故障导致数据库损坏的情况。但实际上,在这种情况 下很可能你的硬盘已经不能使用,或者发生了其他的不可恢复的硬件错误。 设置为synchronous OFF (0)时,SQLite在传递数据给系统以后直接继续而不暂停。若运行SQLite的应用程序崩溃, 数据不会损伤,但在系统崩溃或写入数据时意外断电的情况下数据库可能会损坏。另一方面,在synchronous OFF时 一些操作可能会快50倍甚至更多。

    在SQLite 2中,缺省值为NORMAL.而在3中修改为FULL.

    使用2,内存模式。

    PRAGMA temp_store;
    PRAGMA temp_store = DEFAULT;
    (0)
    PRAGMA temp_store = FILE;
    (1)
    PRAGMA temp_store = MEMORY;
    (2)

    查询或更改"temp_store"参数的设置。当temp_store设置为DEFAULT (0),使用编译时的C预处理宏 TEMP_STORE来定义储存临时表和临时索引的位置。当设置为MEMORY (2)临时表和索引存放于内存中。 当设置为FILE (1)则存放于文件中。temp_store_directorypragma 可用于指定存放该文件的目录。当改变temp_store设置,所有已存在的临时表,索引,触发器及视图将被立即删除。

     

    经测试,在类BBS应用上,通过以上调整,效率可以提高2倍以上。

 
  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值