有没有办法记录在Application中的SQLite数据库上执行的所有查询的持续时间?
我有一个带有大型数据库的应用程序,我希望能够深入了解执行查询所需的时间,以及数据库在事务中被锁定的时间。
类似的东西:
[10ms] select * from users where user_id = 10
[122ms] select * from users
我不打算运行'explain'来识别可能很慢的查询,我想看看查询在真实设备上花了多长时间,并查明是否阻止执行查询,因为另一个线程锁定了数据库中。
SQLiteDatabase类是最终的,所以我可以编写一个包装器来管理日志记录,但我想知道这是否已经完成或是否有更好的方法。
仅在开发期间需要记录。我对在生产环境中使用它不感兴趣。
答案 0 :(得分:0)
Sqlite for Android有内置的支持。
来自here:
ENGINE_init@OPENSSL_1.0.0'
usr/lib/libpq.so.5: undefined reference to
因此,要启用执行时间跟踪运行:
SSL_connect@OPENSSL_1.0.0'
usr/lib/libpq.so.5: undefined reference to
您必须重新启动应用程序才能重新加载新设置**。之后,您将开始在logcat中看到这些日志记录:
02-14 12:27:00.457 11936-12137 / osom.info.dbtest I / Database: elapsedTime4Sql | /data/data/osom.info.dbtest/databases/test.db | 1.000 ms | UPDATE TestTable SET键=? WHERE _id = 1
**有时这还不够,请运行SSL_CTX_ctrl@OPENSSL_1.0.0' usr/lib/libpq.so.5:
undefined reference to
和SSL_use_PrivateKey@OPENSSL_1.0.0'
usr/lib/libvtkIO.so.5.8.0: undefined reference to
。
要停止打印这些日志,请重新启动设备(重新启动之间不会保留此属性)或将属性设置为更高的日志级别,即:
ENGINE_finish@OPENSSL_1.0.0' usr/lib/libvtkIO.so.5.8.0:
undefined reference to
答案 1 :(得分:-1)
u可以在SQLiteOpenHelper类中使用此函数:
public static Cursor query(String sql) {
SQLiteDatabase db = DBHelper.getInstance().getReadableDatabase();
long start = System.currentTimeMillis();
Cursor cursor = db.rawQuery(sql, null);
long end = System.currentTimeMillis();
long elapsed = start - end;
Log.v("SLOW_QUERIES", "Time elapsed: " + elapsed+ " SQL: " + sql);
return cursor;
}