返回 glob() 和 like() 的类型以及使用索引的失败,尽管'LIKE optimization'适用



我写这个发现由于自动创建SQL由EntityFramework(见相关问题):

当返回glob()(或like())的结果时,这些函数的类型似乎是bit:

SELECT Name, glob('admin*', Name) as globresult
FROM Users

返回例如(它实际上只是一个示例,我不做这样的用户搜索):

Name            globresult
Administrator   1
Springy         0

但是当在WHERE子句中以这种方式使用它时,查询计划(用EXPLAIN QUERY PLAN [..]提取)从好的(=使用索引)变为坏的:

好:

SELECT FolderID, Name
FROM Folders
WHERE glob('1_2_*', RootPath)
查询计划:

0   0   0   SEARCH TABLE Folders USING INDEX IX_RootPath (RootPath>? AND RootPath<?)

BAD:(唯一不同的是= 1比较)

SELECT FolderID, Name
FROM Folders
WHERE glob('1_2_*', RootPath) = 1
查询计划:

0   0   0   SCAN TABLE Folders

是否符合bug报告的条件,或者是否有设计的原因?

SQLite仅在WHERE子句的表达式中直接使用列时才能识别索引查找中使用的列:

x = 5  AND  y GLOB 'x*'

任何更复杂的表达式(如(x = 5) = 1甚至+x = 5)都会阻止优化器识别受支持的模式(这是有文档记录的)。虽然这些表达式的含义实际上是相同的,但优化器缺乏能够证明的代码。

相关内容

最新更新