Dantes View in Death Valley, CA
Month: 2013年12月
一例关于如何提升SQLite的性能
今天接到一个Ticket,说SQLite数据库的访问太慢。用VisualVM一查,两个访问函数需要分别消耗~200秒和~300秒。真不太能接受,想想如何解决吧。
问题分析
SQLite数据量大约有40K,其实数据量并不大,主要问题一定还出在SQLite的表结构上。在这个应用中,我们需要根据现有数据和用户的输入,在线计算很多新的列,还要支持排序,过滤等操作。为了避免磁盘IO,定义了很多的View,没有生成新的Table。虽然没有在SQLite的网上查到具体说明,但问题一定就出在这些View的定义上。恰好是因为没有生成Table,View的每次生成计算反而需要更多时间。
问题解决
那如何能生成Table,并避免大量读写操作呢?想到SQLite支持In-memory DB, 所以应该可以把这一切的操作放到内存里。这里的Java示例代码说明如何使用In-memory DB.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 |
// Create a memory database Connection conn = DriverManager.getConnection("jdbc:sqlite:"); // Do some updates stmt.executeUpdate("create table sample(id, name)"); stmt.executeUpdate("insert into sample values(1, \"leo\")"); stmt.executeUpdate("insert into sample values(2, \"yui\")"); // Dump the database contents to a file stmt.executeUpdate("backup to backup.db"); Restore the database from a backup file: // Create a memory database Connection conn = DriverManager.getConnection("jdbc:sqlite:"); // Restore the database from a backup file Statement stat = conn.createStatement(); stat.executeUpdate("restore from backup.db"); |
具体思路:
- 新建In-memory database
- 把目标数据库restore到database中(前提是我们的数据量不大,并且生成后不会有变化)
- 不用View,全部使用Table,用户输入变化时,就重新写Table。
结果
当我看到改进之后的函数访问时间在VisualVM上变成0.0ms时,我知道这个Ticket可以Resolve了。^_^
References
读《程序员的数学》
这是本小书,把很多深奥的数学原理结合到了很多小故事中,读起来很轻快,适合在工作忙碌的间隙阅读。
数学是很多程序员常挂在嘴边的东西,并总觉得没有学好,有东西不会,需要提高。这是好事,是某种“越了解越无知”的表现。这时读读书,总能觉得学到了些东西,或者以前学到的知识被加强了。
到底什么是程序员的数学呢,作者主要有总结如下:
- 简单规则(2进制)
- 逻辑
- 有“余数”来分组
- 数学归纳法
- 排列组合,递归
其实很多基本方法和思想也都能在日常工作中体现,比如从简单做起,尝试小数,抽象扩展。