我的SQLite数据库有超过500,000行。作为新手,我刚刚开始在VB.net应用程序中使用其他索引,并获得了一些惊人的速度改进:)。
当我索引表的日期列时,这些改进不会被复制。我将在下面包含一些代码片段详细信息,并希望得到有关我可能做错了什么的任何输入。
'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) " _
调用一切正常,并且我得到了正确的功能,但是当我对RDate列的速度进行索引时,它没有任何改善。
我应该提到索引似乎是正确创建的
希望有帮助,谢谢
最佳答案
SQLite不会使用索引进行此查找,因为您不是在查找列值而是函数调用的结果,而且索引中存储的不是值DATE(RDate)
。
从查询中删除DATE
函数;除了阻止优化外,它在您的查询中不执行任何操作:
... WHERE RDate BETWEEN :StartDate AND :EndDate
要检查SQLite是否在查询中实际使用了索引,请使用EXPLAIN QUERY PLAN。
请注意,
dd/MM/yyyy
不是SQLite的supported date formats之一;您必须使用yyyy-MM-dd
进行字符串比较才能正常工作。(对于这样的查询,将日期存储为字符串还是数字都没有关系。)
关于vb.net - SQLite Date索引未显示任何性能改进,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18846044/