Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/sqlite/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Caching SQLite3慢速查询解析_Caching_Sqlite - Fatal编程技术网

Caching SQLite3慢速查询解析

Caching SQLite3慢速查询解析,caching,sqlite,Caching,Sqlite,我有一个很长的问题,像这样: SELECT field1, field2, ... FROM tambe WHERE (rowid NOT IN (some 60000 rowids)); 查询可能会执行多次,因此我将其结果保存在临时表中 CREATE TEMPORARY TABLE IF NOT EXISTS cache AS SELECT field1, field2, ... FROM tambe WHERE (rowid NOT IN (some 60000 rowids)); 这样

我有一个很长的问题,像这样:

SELECT field1, field2, ... FROM tambe WHERE (rowid NOT IN (some 60000 rowids));
查询可能会执行多次,因此我将其结果保存在临时表中

CREATE TEMPORARY TABLE IF NOT EXISTS cache AS SELECT field1, field2, ... FROM tambe WHERE (rowid NOT IN (some 60000 rowids));
这样,我不必每次都选择实际数据,但仍然比实际数据慢了很多。我怀疑是解析查询所需的时间拖慢了它

有没有办法将长查询封装在一种IF-CASE语句中,以便SQLite解析器完全忽略它

IF cache NOT EXISTS (...) END IF;

谢谢。

按rowid选择似乎没有使用索引。在大约60000个id中使用像id NOT这样的表达式几乎肯定不会使用索引


我认为您最好的选择可能是对索引的候选密钥进行选择。如果只做这些,您可能会获得可接受的性能

按rowid选择似乎不使用索引。在大约60000个id中使用像id NOT这样的表达式几乎肯定不会使用索引


我认为您最好的选择可能是对索引的候选密钥进行选择。如果只做这些,您可能会获得可接受的性能

这是因为:SQLite中每个表的数据存储为B树结构,包含每个表行的条目,使用rowid值作为键。这意味着按rowid检索或排序记录很快。搜索具有特定rowid的记录或具有指定范围内rowid的所有记录的速度大约是通过指定任何其他主键或索引值进行类似搜索的两倍。经过一些基准测试后,我最终决定使用rowid创建一个临时内存单列表。WHERE子句随后变为id NOT INSELECT id FROM temp_table@Petr:我的评论基于解释选择…,我承认这是不可靠的。如果SQLite使用索引来查找rowid,那么它似乎不会在EXPLAIN的输出中反映出来。然而,输出对我来说很难阅读。尽管如此,大约60000个rowid中没有的表达式rowid几乎肯定不能使用索引。这是因为:SQLite中每个表的数据存储为B树结构,包含每个表行的条目,使用rowid值作为键。这意味着按rowid检索或排序记录很快。搜索具有特定rowid的记录或具有指定范围内rowid的所有记录的速度大约是通过指定任何其他主键或索引值进行类似搜索的两倍。经过一些基准测试后,我最终决定使用rowid创建一个临时内存单列表。WHERE子句随后变为id NOT INSELECT id FROM temp_table@Petr:我的评论基于解释选择…,我承认这是不可靠的。如果SQLite使用索引来查找rowid,那么它似乎不会在EXPLAIN的输出中反映出来。然而,输出对我来说很难阅读。尽管如此,60000个rowid中没有的rowid表达式几乎肯定不能使用索引。