如何加速包含4000个元素的IN子句的SQL查询?

如何加速包含4000个元素的IN子句的SQL查询?,sql,postgresql,Sql,Postgresql,我正在使用python生成一个查询文本,然后将其发送到SQL server。查询是在一个函数中创建的,该函数接受字符串列表,然后将这些字符串插入查询中 查询如下所示: SELECT * FROM DB WHERE last_word in ('red', 'phone', 'robin') 问题是这里我只有3个单词,red、phone和robin,但在另一个用例中,我有4000多个单词,响应大约需要2小时。如何重写此查询以提高其性能?数据库中有多少行?与in子句中的4000个单词匹配的“最后

我正在使用python生成一个查询文本,然后将其发送到
SQL server
。查询是在一个函数中创建的,该函数接受字符串列表,然后将这些字符串插入查询中

查询如下所示:

SELECT * 
FROM DB
WHERE last_word in ('red', 'phone', 'robin')

问题是这里我只有3个单词,
red
phone
robin
,但在另一个用例中,我有4000多个单词,响应大约需要2小时。如何重写此查询以提高其性能?

数据库中有多少行?与in子句中的4000个单词匹配的“最后一个单词”是否更多?如果是这样,最好使用NOT IN、exclude而不是include。另外,尽量不要使用SELECT*,因为这个通配符的性能非常差,最好明确定义要包含在查询中的列


您还可以尝试将要匹配的4000个单词放在(临时)表或CTE中,然后在其上进行联接,因为联接通常比in子句中的大量数据更有效。因此,我仍然建议不要在SELECT语句中使用通配符。

在“DB”中有多少行?与in子句中的4000个单词匹配的“最后一个单词”是否更多?如果是这样,最好使用NOT IN、exclude而不是include。另外,尽量不要使用SELECT*,因为这个通配符的性能非常差,最好明确定义要包含在查询中的列


您还可以尝试将要匹配的4000个单词放在(临时)表或CTE中,然后在其上进行联接,因为联接通常比in子句中的大量数据更有效。因此,我仍然建议不要在SELECT语句中使用通配符。

尝试这样做:

SELECT * 
FROM DB INNER JOIN WORDS_TABLE
ON DB.WORDS = WORDS_TABLE.WORDS;
不要使用
*
任何你想要的东西


在这种情况下,
JOIN
将比中的
更快,因为如果您使用的是表,则必须编写另一个内部查询。

尝试执行以下操作:

SELECT * 
FROM DB INNER JOIN WORDS_TABLE
ON DB.WORDS = WORDS_TABLE.WORDS;
不要使用
*
任何你想要的东西


在这种情况下,
JOIN
将比
中的
更快,因为如果使用表,则必须编写另一个内部查询。

将数据放入临时表或CTE。这将有助于更容易地添加新数据。同样,您必须对源表进行内部联接,以确保捕获所有内容


希望这有帮助。

将数据放入临时表或CTE。这将有助于更容易地添加新数据。同样,您必须对源表进行内部联接,以确保捕获所有内容


希望这有帮助。

优化策略:

  • 最后一个单词上添加索引

    CREATE INDEX ON db(last_word)
    
  • 将过滤词存储在表中,并在存在的位置使用
    (或内部联接)

    此处存在的
    WHERE
    应该比
    JOIN


  • 优化策略:

  • 最后一个单词上添加索引

    CREATE INDEX ON db(last_word)
    
  • 将过滤词存储在表中,并在存在的位置使用
    (或内部联接)

    此处存在的
    WHERE
    应该比
    JOIN



  • 我在DB中有大约100000000行,在“last_word”中有大约20000个不同的单词。我添加了第二个建议。
    select*
    是否是一个好主意完全取决于我们没有的信息,这是问题的次要部分。@Dave一方面,你可以说它与in子句无关,但是,由于问题是如何加快查询速度,我认为将其包括在内会很有用。@dherre65非常确定这不会是这里的选通问题。我在DB中有大约100000000行,在“last_word”中有大约20000个不同的单词我添加了第二个建议。
    select*
    是否是一个好主意完全取决于我们没有的信息,这是问题的第二个方面。@Dave一方面你可以说它与IN子句无关,但既然问题是如何加快查询速度,我认为包含@dherre65会很有用。我很确定这不会是这里的门控问题。这4000个单词是从哪里来的?理想情况下,它们来自数据库,因此您可以将它们放在那里,然后执行
    最后一个单词在哪里(从某个表中选择四千个单词…
    或联接。您是否有
    最后一个单词的索引
    ?这4000个单词来自哪里?理想情况下,它们来自数据库,因此您可以将它们放在那里,然后执行
    最后一个单词在哪里(从某个表中选择四千个单词…
    或连接。您是否有
    最后一个单词的索引
    ?您是否可以演示在单词为“红色”的情况下如何构建单词表,请使用“phone”和“robin”。@user1367204只需创建一列
    words
    的单词表,并将其用作主键。您能告诉我如何在给定单词“red”、“phone”和“robin”的情况下创建单词表。@user1367204只需创建一列
    words
    的单词表,并将其用作主键。