我写这个发现由于自动创建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
)都会阻止优化器识别受支持的模式(这是有文档记录的)。虽然这些表达式的含义实际上是相同的,但优化器缺乏能够证明的代码。