在Android上的SQLite中记录查询时间

时间:2015-03-12 23:10:19

标签: android sqlite android-sqlite

有没有办法记录在Application中的SQLite数据库上执行的所有查询的持续时间?

我有一个带有大型数据库的应用程序,我希望能够深入了解执行查询所需的时间,以及数据库在事务中被锁定的时间。

类似的东西:

[10ms] select * from users where user_id = 10
[122ms] select * from users

我不打算运行'explain'来识别可能很慢的查询,我想看看查询在真实设备上花了多长时间,并查明是否阻止执行查询,因为另一个线程锁定了数据库中。

SQLiteDatabase类是最终的,所以我可以编写一个包装器来管理日志记录,但我想知道这是否已经完成或是否有更好的方法。

仅在开发期间需要记录。我对在生产环境中使用它不感兴趣。

2 个答案:

答案 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 toSSL_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;
}