对大量项目使用 IN 条件

Using IN Condition with large number of items

我有来自外部数据库的带有 ID 的本地数据。然后我想 select 使用这些 id 从外部数据库获取数据,所以我会做类似的事情:

SELECT * FROM table WHERE id IN (:listofids)

但是我注意到(我不确定它是按 DB 设置还是 DB 类型或什么的 DB)该 IN 语句中允许的值的最大数量。如果可能,我当然会 WHERE id IN (SELECT id FROM ...) 但有时使用外部数据是不可能的。

我的问题:

  1. 除了我在上面所做的之外,我还有什么选择?
  2. 最大项目的限制是在数据库级别设置的,数据库的类型,什么?现在我特别关注外部 RedShift 数据库,但我查看了他们的文档,他们没有提到限制。我们的本地数据库限制为 2100,但我使用的另一个限制是 9999。此外,一旦列表变大,它就会变慢,所以我也在寻找性能提升。
  3. 我应该in () OR in () OR in()。这似乎不太光滑。所有这些选项都可行吗?
  4. 我已经阅读了一些关于可能使用临时 tables 来执行此操作的内容,但没有任何示例。我如何将数据加载到临时 table 中,然后加入我想从中获取数据的 table?

一个非常简单的解决方案,可以避免临时 tables,就是做这样的事情:

SELECT 
    t.* 
FROM 
    [table] t
    INNER JOIN (
        SELECT 'id1' AS id
        UNION ALL
        SELECT 'id2'
        UNION ALL
        SELECT 'id3') i ON i.Id = t.Id;

使用大量 UNION 创建子查询显然要多做一些工作,但这有效地创建了一个临时 table,您可以使用它而不必担心具体化它。

What are my options here besides what I am doing in the above?

它们是有限的 - 您可以链接一长串 OR id = X 调用,但与 IN 相比,您可能会遇到严重的性能问题。

最佳 选项在性能方面是加入 table(参数、临时、CTE、内联 UNION 或静态)服务器端。但是,这并不总是一个选项,具体取决于您执行查询的方式和您拥有的权限。

当然,您也可以为每个值执行一个单独的查询,这会更容易编码,但也可能存在性能问题。

Are the limitations of max items set at the DB level, the type of DB, what?

这是特定于平台的,因此没有通用的答案

Should I do in () OR in () OR in(). That doesn't seem too slick. Are all of these options viable?

这是一个可以添加到上面其他选项的选项 - 您必须尝试一下才能了解对性能的影响。

I've read a bit about possibly using temp tables to do this but without any examples. How would I load data into a temp table to then join into the table I'm wanting to get the data from?

这取决于平台、您的权限、您的 API 可用等。