SQLite `NOT IN` 参数是不是有大小限制?
Posted
技术标签:
【中文标题】SQLite `NOT IN` 参数是不是有大小限制?【英文标题】:Does SQLite `NOT IN` parameter have any size limit?SQLite `NOT IN` 参数是否有大小限制? 【发布时间】:2019-03-31 22:50:09 【问题描述】:我有一个 SQLite 数据库,我在其中执行类似
的查询 Select * from table where col_name NOT IN ('val1','val2')
基本上,我从服务器获取大量值,我需要选择给定列表中不存在的值。
目前它工作正常,没有问题。但是随着服务器数据库的频繁更新,来自服务器的值的数量变得巨大。
所以,我可能会得到数千个字符串值,我需要将它们传递给NOT IN
我的问题是,它会在未来引起任何性能问题吗? NOT IN
参数是否有大小限制? (比如最多可以检查 10000 个值)?
它会在某个时候导致任何崩溃吗?
【问题讨论】:
在 mysql 中,有一个数据包大小限制。这些 NOT IN 值来自哪里?如果他们来自另一张桌子;您可能会想到基于 Join/Subquery 的方法;这样没有限制会影响您的情况 IN() 中的列表越大越慢。大多数 SQL 优化器将IN
列表转换为 OR
并且倾向于以这种方式工作。如果值按顺序排列,你会更好关闭使用column > value and column < value
或column between value and value
【参考方案1】:
这是an official reference 关于 sqlite 的各种限制。我认为SQL 语句的最大长度 可能与您的情况有关。默认值为1000000,可调整。
除此之外,我认为NOT IN
子句的参数数量不存在任何限制。
【讨论】:
很确定它是由语句的最大长度决定的。在某些时候性能会很糟糕,因为解析一个巨大的语句需要大量的处理时间。 最近遇到这样的错误。致命异常:android.database.sqlite.SQLiteException 太多 SQL 变量(代码 1 SQLITE_ERROR[1]):,编译时:SELECT * FROM EmployeeDetail WHERE accountNo NOT IN (?,?,?,?,?,?,?, ?,?,?,?,?,?,?,?,?,?,?,?,?,?,【参考方案2】:如果要测试多个值,最好将它们放在一个表中,该表在包含它们的列上有一个索引。然后像
SELECT *
FROM table
WHERE col_name NOT IN (SELECT value_col FROM value_table);
或
SELECT *
FROM table AS t
WHERE NOT EXISTS (SELECT 1 FROM value_table WHERE value_col = t.col_name);
无论value_table
中有多少记录,都会相当有效,因为该索引将用于查找条目。
另外,当然,它使重复使用准备好的语句变得更加容易,因为您不必创建一个新的并重新绑定每个值(您正在使用准备好的语句使用这些值的占位符,对,而不是尝试将它们的内容内联到字符串中?)每次您将值添加到需要检查的值时。您只需将其插入 value_table
即可。
【讨论】:
以上是关于SQLite `NOT IN` 参数是不是有大小限制?的主要内容,如果未能解决你的问题,请参考以下文章
玩转SQLite系列SQLite数据库应用案例实现历史搜索记录
SQLite 更新后:无法在 DLL 'SQLite.Interop.dll' 中找到名为 'sqlite3_changes_interop' 的入口点