我应该怎样建立一个用于在较大的表中搜索匹配的临时表?

时间:2010-12-18 02:21:56

标签: sql sqlite

表A有数百万行索引短语(1-5个单词)。我正在寻找大约20-30个短语的比赛,例如('鸟','猫','牛','紫雨'等)。我知道当搜索集很大时,IN运算符通常是一个坏主意 - 因此解决方案是创建临时表(在内存中)并将其加入到我正在寻找的表中。

我可以使用我的搜索短语创建一个TEMP TABLE B,我知道如果我进行连接,SQL引擎将对表A索引起作用。对TEMP TABLE B短语进行索引会有什么不同吗?

2 个答案:

答案 0 :(得分:1)

编辑......我刚刚意识到你在询问sqlite。我会说保持缓存中非常小的连接表的相同原则仍然适用。

当连接表时,如果可能的话,SQL Server会将一个表的相关内容放在缓存中。你的20到30个短语肯定会适合缓存,所以真的没有索引的意义。索引对于查找值很有用,但SQL Server已经在缓存中具有这些值。此外,由于SQL Server一次读取一个页面的数据(一个页面是8K),它将能够在一次读取中读取整个表。

制作临时表时,请确保使用相同的数据类型,以便SQL Server不必转换值以匹配。

答案 1 :(得分:1)

当搜索条件很多时,为什么IN会成为一个坏主意?

根据我在阅读SQLite query planner时的理解,IN(1,2,3,4,5,6,N)列表将生成与临时表的连接相同的查询计划具有相同的行。

临时搜索字词表中的索引不会使查询更快,因为您处理所有字词。通过索引只会增加处理时间。