我有几个sqlite查询的问题.实际上,我开始认为sqlite不是为具有10行的表设计的,实际上,sqlite是一场噩梦.
以下查询
SELECT * FROM [Table] WHERE [Name] LIKE 'Text%'
工作正常EXPLAIN显示使用索引,约70ms后返回结果.
现在我需要从.NET sqlite驱动程序运行此查询,所以我正在更改查询
SELECT * FROM [Table] WHERE [Name] LIKE @Pattern || '%'
索引不被使用.当我在任何sqlite工具中运行以下查询时,索引也不会被使用
SELECT * FROM [Table] WHERE [Name] LIKE 'Text' || '%'
所以我猜sqlite没有任何一种预处理逻辑实现.
好.我们尝试解决它,我仍然是绑定变量,并执行以下操作
SELECT * FROM [Table] WHERE [Name] LIKE @Pattern
但现在我将%通配符符号附加到我的模式字符串的末尾,就像这样
command.Parameters.Add(new sqliteParameter("@Pattern",pattern + '%'));
它工作非常慢我不能说为什么,因为当我从sqlite工具运行这个查询它可以正常工作,但是当我从.NET代码绑定这个变量它工作很慢.
好.我还在试图解决这个问题.我正在摆脱模式参数绑定并动态构建此条件.
pattern = pattern.Replace("'","''"); pattern = pattern.Replace("%","\\%"); where = string.Format("LIKE '{0}%' ESCAPE '\\'",pattern);
索引不再被使用.没有使用ESCAPE.我看到,当我跑
EXPLAIN QUERY PLAN SELECT * FROM [Table] WHERE [Name] LIKE 'Text%' ESCAPE '\'
一旦我删除ESCAPE,它将再次开始使用索引,查询在60-70ms内完成.
UPDATE
以下是结果.
EXPLAIN QUERY PLAN SELECT * FROM [RegistryValues] WHERE [ValueName] LIKE 'windir%' ESCAPE '\'
SCAN TABLE RegistryValues(〜3441573 rows)
而没有ESCAPE的
EXPLAIN QUERY PLAN SELECT * FROM [RegistryValues] WHERE [ValueName] LIKE 'windir%'
SEARCH TABLE RegistryValues USING INDEX IdxRegistryValuesValueNameKeyIdKeyHiveFileId(ValueName>?AND ValueName<?)(〜31250行) UPDATE 刚找到这个 http://www.sqlite.org/optoverview.html
4.0 LIKE优化
ESCAPE子句不能出现在LIKE运算符上
那么那么该怎么办呢?
我明白了吗?我不能使用LIKE操作符在sqlite中搜索包含通配符的字符串.通过通配符我的意思是_%^!
这是不可能的,因为我不能逃脱他们.
其实我可以,但是在这种情况下我不能使用索引,所以查询不会很有效.
我对吗?