【问题标题】:In mysql or postgres, is there a limit to the size of an IN (1,2,n) statement?在 mysql 或 postgres 中,IN (1,2,n) 语句的大小是否有限制?
【发布时间】:2010-03-11 15:41:38
【问题描述】:

我有很多这样的 SQL 语句:

SELECT foo FROM things WHERE user_id IN (1,2,3..n)

对于可以安全放入这样的 IN 子句的元素数量是否有已知限制?

【问题讨论】:

    标签: sql mysql database postgresql limit


    【解决方案1】:

    PostgreSQL 中的 1000 限制不是硬限制,而是优化限制,即;在 1000 之后 PostgreSQL 不能很好地处理它。当然,我不得不问你到底在用 1000 个条目的 IN 子句做什么。

    【讨论】:

      【解决方案2】:

      没有技术限制,但有某种“合理”的限制..

      IN 子句中的元素过多意味着查询的设计可能很糟糕(恕我直言)

      【讨论】:

      • 您几乎总是可以将 IN 替换为某个 JOIN 语句,除非您有来自外部(非 SQL)源的列表。
      • 如果列表是外部的,您可以随时将其插入到临时表中,然后进行连接,这可能在创建一些索引之后可能会成为一个不错的计划
      • @araqnid:视图可以与外部源一起使用吗?
      • 不是直接的,没有一些魔法,但您可以创建一个临时表,执行 COPY 以从您的应用程序中填充它,索引/分析临时表并进行连接。啰嗦,只有在必须发送大量值时才有用。当然,如果您确实需要某种外部源,并且您可以编写一个函数来获取这些值,那也可以 - 直接在查询中使用 fn 或将其假脱机到临时表中。
      • @Strae 在 PostgreSQL 9.1 中可以使用外部数据作为表。见wiki.postgresql.org/wiki/Foreign_data_wrappers
      【解决方案3】:

      对于 MySQL,来自manual

      IN 列表中值的数量仅受max_allowed_packet 值的限制。

      【讨论】:

        【解决方案4】:

        我在使用 sqlalchemy 为 postgres 创建的动态查询中使用了它,参数超过 25k。此外,它们通过位置参数 (*args) 传递给 python 函数....但我没有注意到我的情况放缓。 YMMV

        【讨论】:

          【解决方案5】:

          不,但在使用 IN 语句时要小心。如果您在 IN 语句中使用子查询,则性能可能会受到负面影响,因为 SQL Server 必须生成整个结果集并在内部构建一个可能很大的 IF 语句。

          例如,如果子查询返回大量行,Select * From MyTable where MyColumn IN (Select myColumn from AnotherTable) 之类的内容可能会有点慢。通常使用 EXISTS 会更有效。

          【讨论】:

            【解决方案6】:

            我很确定 Postgres 的限制为 1000....但找不到任何 docco 来支持它。

            【讨论】:

            • 那可能是甲骨文。
            猜你喜欢
            • 2012-02-07
            • 1970-01-01
            • 2019-03-31
            • 2020-05-11
            • 2018-08-30
            • 1970-01-01
            • 2018-08-03
            • 2016-06-06
            • 2012-01-17
            相关资源
            最近更新 更多