我有一个SQLite数据库,在其中执行
这样的查询 Select * from table where col_name NOT IN ('val1','val2')
基本上,我从服务器获取了大量的值列表,我需要选择给定列表中不存在的值。
目前可以正常使用,没有问题。但是,随着服务器数据库的频繁更新,来自服务器的值数量变得巨大。
因此,我可能会获得成千上万个需要传递给NOT IN
我的问题是,将来会不会引起性能问题? NOT IN
参数有大小限制吗? (例如您可以检查的最大10000个值)?
在某个时候会导致崩溃吗?
答案 0 :(得分:2)
这是an official reference关于sqlite中的各种限制。我认为 SQL语句的最大长度可能与您的情况有关。默认值为1000000,并且可以调整。
除此之外,我认为NOT IN
子句的参数数量没有任何限制。
答案 1 :(得分:1)
要测试的值不只几个,最好将它们放在一个表中,该表在容纳它们的列上有一个索引。然后像
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
中即可。