sqlite_stat1表的说明

时间:2010-03-16 16:33:57

标签: sql sqlite indexing performance

我正在尝试诊断特定查询对SQLite的速度慢的原因。关于how the query optimizer works似乎有大量信息,但关于如何实际诊断问题的信息很少。

特别是,当我分析数据库时,我得到了预期的sqlite_stat1表,但我不知道stat列告诉我什么。示例行是:

MyTable,ix_id,25112 1 1 1 1

“25112 1 1 1 1”究竟是什么意思?

作为一个更广泛的问题,有没有人有关于诊断SQLite查询性能的最佳工具和技术的任何好资源?

由于

4 个答案:

答案 0 :(得分:5)

来自analyze.c的

/* Store the results.  
**
** The result is a single row of the sqlite_stmt1 table.  The first
** two columns are the names of the table and index.  The third column
** is a string composed of a list of integer statistics about the
** index.  The first integer in the list is the total number of entires
** in the index.  There is one additional integer in the list for each
** column of the table.  This additional integer is a guess of how many
** rows of the table the index will select.  If D is the count of distinct
** values and K is the total number of rows, then the integer is computed
** as:
**
**        I = (K+D-1)/D
**
** If K==0 then no entry is made into the sqlite_stat1 table.  
** If K>0 then it is always the case the D>0 so division by zero
** is never possible.

答案 1 :(得分:1)

另外,I =(K + D-1)/ D表示:假设K是总行数,D是每列的不同值, 所以,如果您使用CREATE TABLE TEST (C1 INT, C2 TEXT, C3 INT, C4 INT);创建了表格 并创建像CREATE INDEX IDX on TEST(C1, C2)

这样的索引

然后你可以手动INSERT或让sqlite自动更新sqlite_stat1表: “TEST” - >表名,“IDX” - > INDEX NAME,“10000 1 1000”,HERE,10000是TABLE TEST中的总行数,1表示对于列C1,所有值似乎都是不同的,这听起来像C1就像ID或者其他什么,1000表示如你所知,C2具有较少的不同值,值越高,索引引用特定列的值越不明显。

您可以运行ANALYZE或手动更新表格。 (最好先做第一个)。

那么价值用于什么? sqlite将使用这些统计信息,找到他们想要使用的最佳索引,您可以考虑CREATE INDEX IDX2 ON TEST(C2)" AND the value in stat1 table is "10000 1CREATE INDEX IDX1 ON TEST(C1)" with value "10000 100"; 假设我们之前没有发布我们之前定义的索引IDX SELECT * FORM TEST WHERE C1=? AND C2=?,sqlite会选择IDX2,而不是IDX1,为什么?这很简单,因为IDX2可以最小化查询结果,但IDX1不能。

清除?

答案 2 :(得分:1)

请记住,索引可以由表的多个列组成。因此,在" 25112 1 1 1 1"的情况下,这将被描述为由4列表组成的复合索引。数字表示如下:

  • 25112是对索引
  • 中总行数的估计
  • 第二个整数(第一个" 1")是对索引第一列中具有相同值的行数的估计。
  • 第三个整数(第二个" 1")是对索引的前两个列具有相同值的行数的估计。这不是"清晰度"第2栏。
  • 第四个整数(第三个" 1")是对索引上前三个列具有相同值的行数的估计值。
  • 最后一个整数的逻辑相同..

最后一个整数应该始终为1。考虑一个包含两行和两列的表,其中复合索引由column1 + column2组成。表格的数据是:

  1. 苹果,红
  2. 苹果,绿
  3. 统计数据看起来像" 2 2 1"。意思是,索引中有2行。如果仅使用索引的column1(Apple和Apple),则会返回两行。使用column1 + column2返回的1个唯一行(Apple + Red在Apple + Green中是唯一的)

答案 3 :(得分:0)

简单地运行解释QUERY PLAN +你的SQL语句,你会发现语句中引用的表是否使用你想要的索引,如果没有,尝试重写sql,如果是,找出你想要的正确索引使用。更多信息请参阅www.sqlite.org