我的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列时没有任何改进。
我应该提一下,索引似乎是正确创建的
非常感谢任何帮助,谢谢
答案 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
比较快得多。