c# – 在SQLite LIKE中转义通配符(%,_)而不牺牲索引使用?

c# – 在SQLite LIKE中转义通配符(%,_)而不牺牲索引使用?,第1张

概述我有几个SQLite查询的问题.实际上,我开始认为SQLite不是为具有10行的表设计的,实际上,SQLite是一场噩梦. 以下查询 SELECT * FROM [Table] WHERE [Name] LIKE 'Text%' 工作正常EXPLAIN显示使用索引,约70ms后返回结果. 现在我需要从.NET SQLite驱动程序运行此查询,所以我正在更改查询 SELECT * FROM [Tab 我有几个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 PLANSELECT * FROM [RegistryValues]WHERE     [Valuename] liKE 'windir%' ESCAPE '\'

SCAN table RegistryValues(〜3441573 rows)

而没有ESCAPE的

EXPLAIN query PLANSELECT * 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中搜索包含通配符的字符串.通过通配符我的意思是_%^!

这是不可能的,因为我不能逃脱他们.
其实我可以,但是在这种情况下我不能使用索引,所以查询不会很有效.

我对吗?

解决方法 当%在最后时,索引只能与liKE子句一起使用,以便sqlite可以将其重写为两个简单的比较(如EXPLAIN输出所示).

因此,要获得相同的效果,请自己编写比较.
这要求您构造一些字符串,保证与任何匹配的值比较“较大”(注意非ASCII字符).
代替:

... WHERE name liKE 'Text%'

使用:

... WHERE name BETWEEN 'Text' AND 'Textzzzzzzzzzzzzz'

或作为参数:

... WHERE name BETWEEN @Pattern AND @Pattern || 'zzzzzzzzzz'

(这个构造永远不需要转义:)

总结

以上是内存溢出为你收集整理的c# – 在SQLite LIKE中转义通配符(%,_)而不牺牲索引使用?全部内容,希望文章能够帮你解决c# – 在SQLite LIKE中转义通配符(%,_)而不牺牲索引使用?所遇到的程序开发问题。

如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。

欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/langs/1259410.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-06-07
下一篇 2022-06-07

发表评论

登录后才能评论

评论列表(0条)

保存