【问题标题】:Using IN Condition with large number of items对大量项目使用 IN 条件
【发布时间】:2016-05-19 15:24:56
【问题描述】:

我有来自外部数据库的带有 id 的本地数据。然后我想使用这些 id 从该外部数据库中选择数据,所以我执行以下操作:

SELECT * FROM table WHERE id IN (:listofids)

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

我的问题:

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

【问题讨论】:

    标签: sql amazon-redshift in-clause


    【解决方案1】:

    一个避免临时表的非常简单的解决方案是执行以下操作:

    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 创建子查询显然需要做更多的工作,但这有效地创建了一个临时表,您可以使用它而不必担心具体化它。

    【讨论】:

      【解决方案2】:

      除了我在上面所做的之外,我还有哪些选择?

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

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

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

      最大项目的限制是在DB级别设置的,DB的类型,什么?

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

      我应该做 in () OR in () OR in()。这似乎不太光滑。所有这些选项都可行吗?

      这是添加到上述其他选项中的一种选择 - 您必须尝试一下才能了解性能影响。

      我已经阅读了一些关于可能使用临时表来执行此操作的信息,但没有任何示例。如何将数据加载到临时表中,然后加入我想要从中获取数据的表中?

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

      【讨论】:

      • 感谢您的 cmets。所以当你说最大项目是特定于平台的,你的意思是 MSSQL 永远是 2100 最大,oracle 永远是 9999,等等还是别的什么?
      • 可能 - 或者最大值可能取决于查询的整体大小(以字符为单位),或者完全取决于其他内容。
      猜你喜欢
      • 1970-01-01
      • 2012-12-26
      • 1970-01-01
      • 1970-01-01
      • 2019-12-22
      • 2011-10-05
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多