SQL索引不用于其中ABS(x-y)

SQL索引不用于其中ABS(x-y),sql,indexing,sqlite,explain,Sql,Indexing,Sqlite,Explain,我有一个涉及约0.08333天的查询: SELECT mt1.*, mt2.* FROM mytable mt1, mytable mt2 WHERE ABS(JULIANDAY(mt1.date) - JULIANDAY(mt2.date)) < 0.08333 使用时没有帮助: ... WHERE ABS(JULIANDAY(mt1.date) - JULIANDAY(mt2.date)) < 0.08333 ... WHERE JU

我有一个涉及约0.08333天的查询:

SELECT mt1.*, mt2.* FROM mytable mt1, mytable mt2 
                    WHERE ABS(JULIANDAY(mt1.date) - JULIANDAY(mt2.date)) < 0.08333
使用时没有帮助:

... WHERE ABS(JULIANDAY(mt1.date) - JULIANDAY(mt2.date)) < 0.08333
... WHERE JULIANDAY(mt2.date) - 0.08333 < JULIANDAY(mt1.date) < JULIANDAY(mt2.date) + 0.08333
... WHERE JULIANDAY(mt1.date) < JULIANDAY(mt2.date) + 0.08333
      AND JULIANDAY(mt1.date) > JULIANDAY(mt2.date) - 0.08333
事实解决方案3。执行“解释查询计划选择…”时显示是否使用索引:


我认为,包括和的理由如下:

查询上的WHERE子句被分解为多个术语,每个术语 由AND运算符将其与其他对象分隔开。如果WHERE子句 由OR运算符分隔的约束组成,然后是整个约束 条款被视为是OR条款适用的单一条款 应用优化方法

也许值得一试,看看这是否能改善情况

根据评论:

我认为前面添加的段落可以澄清为什么ABSx-y表达式

增加了以下内容

要通过索引使用,术语必须具有以下形式之一: 列=表达式 列是表达式 列>表达式 列>=表达式 列<表达式 列 表达式>=列 表达式<列
表达式您正在使用表达式索引。 报告说:

SQLite查询规划师将考虑使用表达式的索引,当索引的表达式出现在WHERE子句中或查询的ORDERBY子句中时,就像在CREATEDISTION语句中所写的一样。查询规划者不执行代数。< /P> 因此,如果索引表达式只是一个参数,则不可能使用索引来加速对abs调用的查找。而且,不可能为整个abs调用编制索引,因为它涉及两个表

因此,按照您所做的方式转换表达式是提高其效率的唯一方法


请注意,这是供您编辑的。我认为您可以根据注释删除:我认为之前添加的…段落->这只是在注释/讨论/聊天模式下,与技术讨论/回答表单无关。适当的认证将是。
|x-y| < 0.08333 <=> y - 0.08333 < x < y + 0.08333
                <=> x < y + 0.08333 AND x > y - 0.08333
(0, 0, 0, u'SCAN TABLE mytable AS mt1')
(0, 1, 1, u'SCAN TABLE mytable AS mt2')
(0, 0, 1, u'SCAN TABLE mytable AS mt2')
(0, 1, 0, u'SEARCH TABLE mytable AS mt1 USING INDEX id2 (<expr>>? AND <expr><?)')