SQLite 是否优化 WHERE 子句中包含多个 AND 条件的查询?

2023-12-09

在 SQL 数据库(我使用 Python+Sqlite)中,如果我们有 100 万行,如何确保查询

SELECT * FROM mytable WHERE myfunction(description) < 500 AND column2 < 1000
                           [-----------------------------]   [--------------]
                               high-CPU cost condition         easy-to-test 
                              requiring 100 µs per test         condition

经过优化,第一个条件(CPU 昂贵)仅经过测试如果易于测试的第二个条件已经为真? (因为这是一个逻辑AND,是不是很懒AND?)

例子:

  • 如果始终测试第一个条件,则需要 100 万 x 100 µs = 100 秒!

  • 如果首先测试第二个条件,那么只会预先过滤 5000 个项目(在我的用例中),然后应用第一个条件会非常快。

Note:

  • column2 不一定是 ID,它可以是其他内容

  • 在我的用例中,myfunction涉及编辑距离计算


强制执行顺序的一种方法是使用case表达。一般来说,SQL 优化器可以重新安排操作,唯一的例外是case.

SELECT *
FROM mytable
WHERE (CASE WHEN column2 >= 1000  OR column2 IS NULL THEN 0
            WHEN myfunction(description) < 500 THEN 1
       END) = 1;

一般来说,case不鼓励使用以下表达式WHERE条款。 。 。一个主要原因是它们阻碍了优化。在这种情况下,这是一件好事。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

SQLite 是否优化 WHERE 子句中包含多个 AND 条件的查询? 的相关文章

随机推荐