【问题标题】:How can I analyse a Sqlite query execution?如何分析 Sqlite 查询执行?
【发布时间】:2010-11-30 01:32:47
【问题描述】:

我有一个 Sqlite 数据库,我想检查索引是否正确。 MS SQL Analyzer 擅长分解查询执行和使用的索引。

Sqlite 有类似的工具吗?

【问题讨论】:

    标签: sql sqlite query-optimization sql-execution-plan


    【解决方案1】:

    正如outis所说:

    EXPLAIN QUERY PLAN SELECT * FROM FOO
    

    如果像我一样,你只是用它来确保你达到你的索引(索引?)

    【讨论】:

    【解决方案2】:

    我知道没有漂亮的图形工具,但您所寻找的所有信息都可以从 EXPLAIN 关键字中获得。

    考虑这个数据库:

    sqlite> create table users (name, email);
    sqlite> create index user_names on users (name);
    

    基于email 的查询不会使用索引:

    sqlite> explain select * from users where email='foo';
    
    addr opcode p1 p2 p3 p4 p5 comment
    0 Trace 0 0 0 00
    1 String8 0 1 0 foo 00
    2 Goto 0 13 0 00
    3 OpenRead 0 2 0 2 00
    4 Rewind 0 11 0 00
    5 Column 0 1 2 00
    6 Ne 1 10 2 collseq(BINARY) 6a
    7 Column 0 0 4 00
    8 Column 0 1 5 00
    9 ResultRow 4 2 0 00
    10 Next 0 5 0 01
    11 Close 0 0 0 00
    12 Halt 0 0 0 00
    13 Transaction 0 0 0 00
    14 VerifyCookie 0 5 0 00
    15 TableLock 0 2 0 users 00
    16 Goto 0 3 0 00

    而基于名称的查询将使用user_names 索引:

    sqlite> explain select * from users where name='foo';
    
    addr opcode p1 p2 p3 p4 p5 comment
    0 Trace 0 0 0 00
    1 String8 0 1 0 foo 00
    2 Goto 0 18 0 00
    3 OpenRead 0 2 0 2 00
    4 OpenRead 1 3 0 keyinfo(1,BINARY) 00
    5 IsNull 1 15 0 00
    6 Affinity 1 1 0 bb 00
    7 SeekGe 1 15 1 1 00
    8 IdxGE 1 15 1 1 01
    9 IdxRowid 1 2 0 00
    10 Seek 0 2 0 00
    11 Column 1 0 3 00
    12 Column 0 1 4 00
    13 ResultRow 3 2 0 00
    14 Next 1 8 0 00
    15 Close 0 0 0 00
    16 Close 1 0 0 00
    17 Halt 0 0 0 00
    18 Transaction 0 0 0 00
    19 VerifyCookie 0 5 0 00
    20 TableLock 0 2 0 users 00
    21 Goto 0 3 0 00

    使用EXPLAIN 确实需要掌握 SQLite 的虚拟机 VDBE:

    http://www.sqlite.org/opcode.html

    但这并不像看起来那么难,并为您提供有关查询的完整故事。

    【讨论】:

    • EXPLAIN QUERY PLAN 将在没有 VM 说明的情况下提供有关索引使用的信息。
    • 如果需要,您还可以通过在命令行中启用 .explain 选项来改进输出格式:“.explain ON|OFF 打开或关闭适合 EXPLAIN 的输出模式。”
    • 以上链接已过时,请在此处查看有关虚拟机的信息:sqlite.org/opcode.html
    【解决方案3】:
    猜你喜欢
    • 1970-01-01
    • 2021-09-23
    • 1970-01-01
    • 2012-11-09
    • 2011-08-28
    • 1970-01-01
    • 1970-01-01
    • 2012-07-14
    • 1970-01-01
    相关资源
    最近更新 更多