SQLite Date索引显示没有性能改进

时间:2013-09-17 09:26:07

标签: vb.net sqlite

我的SQLite数据库有超过500,000行。作为新的我刚刚开始在我的VB.net应用程序中使用其他索引,并且速度有了惊人的提升:)。

当我索引表格的Date列时,不会复制这些改进。我将在下面列出一些代码片段详细信息,并希望了解我可能做错的任何输入。

    'When creating the date column in DB (amongst others) 
oMainQueryR.CommandText += "RDate DATE, "

'creating index
oMainQueryR.CommandText = "Create INDEX main.iRDate ON DatabaseRows(RDate)"   
      oMainQueryR.ExecuteNonQuery()

'Storing the Data
.Parameters.Add(":Rdate", DbType.Date)
cmdSQLite.Parameters(":Rdate").Value = CDate(TextSplit(1)).ToString("dd/MM/yyyy")



'SQL Call to retrieve data
 oMainQueryR.CommandText = "SELECT * FROM DatabaseRows " _
                            & "WHERE DATE([RDate]) BETWEEN DATE(:StartDate) AND DATE(:EndDate) " _

Calls和一切正常工作,我得到了正确的功能,当我快速索引RDate列时没有任何改进。

我应该提一下,索引似乎是正确创建的

非常感谢任何帮助,谢谢

2 个答案:

答案 0 :(得分:3)

SQLite不使用索引进行此查找,因为您没有查找列值而是查找函数调用的结果,并且它不是存储在索引中的值DATE(RDate)

从查询中删除DATE函数;除了阻止优化之外,它在查询中不执行任何操作:

... WHERE RDate BETWEEN :StartDate AND :EndDate

要检查SQLite是否在查询中实际使用了您的索引,请使用EXPLAIN QUERY PLAN

请注意dd/MM/yyyy不是SQLite的supported date formats之一;您必须使用yyyy-MM-dd进行字符串比较才能正常工作。

(对于这样的查询,无论是将日期存储为字符串还是数字都无关紧要。)

答案 1 :(得分:2)

考虑将日期数据存储在INTEGER中(SQLite本身不支持日期数据类型)。

这会将查询转换为

SELECT * FROM DatabaseRows WHERE RDate BETWEEN (:StartDate) AND (:EndDate);

将避免大量DATE函数调用。

确实,您的DATE函数调用完全禁用INDEX改进。

此外,INTEGER比较比TEXT比较快得多。