SQL连接表的最大数量限制是适用于整个查询,还是单独计算子查询?

Posted

技术标签:

【中文标题】SQL连接表的最大数量限制是适用于整个查询,还是单独计算子查询?【英文标题】:Does the limit on the maximum number of SQL join tables apply to the whole query, or are subqueries counted separately? 【发布时间】:2012-08-14 14:03:04 【问题描述】:

我已经阅读了 mysql 5 中的 61 table join limit,但我不确定它如何应用于以下内容:

SELECT * FROM (

    SELECT * FROM tableA JOIN // Lots of other joins here...

    UNION

    SELECT * FROM tableB JOIN // Lots of other joins here...

    UNION

    SELECT * FROM tableC JOIN // Lots of other joins here...

    // etc...
)

我会在所有子查询中达到总共 61 个表的限制,还是每个 UNIONed 子查询为 61 个?

这是否因数据库而异,例如PostgreSQL、MSSQL、Oracle?

【问题讨论】:

是的,我自己并不热衷于此,但问题迫使我不得不这样做(收集许多不同类型的未标记学生提交并按课程分组)。我以前保持 UNION 子查询轻并进行任何过滤,例如'是用户实际教的课程中的学生'在外部,但性能很差,我需要将这些东西作为直接 JOIN 获取,这意味着它们需要为每个 UNION 子查询复制。似乎 MySQL 没有很好地优化子查询:( 是的,不同数据库的限制不同。但是,在任何数据库中,如果您遇到限制,那么您确实需要重新考虑您的设计。我不确定 mysql 但在 SQl 服务器中,联合中的那些加入将计入总数 @HLGEM 谢谢。我想重新设计架构,但无法控制,因为我正在为大型开源项目制作插件。 这是个好问题。找出答案的唯一方法就是测试它! 如果您构建了一个临时表并为每个查询进行了插入,该怎么办?可能会更快。 【参考方案1】:

每个子查询似乎有 61 个。这是一个演示这个的小提琴。

http://sqlfiddle.com/#!2/2b219/5

我有一个只有一行的简单表格:

id    | value
1     | testvalue

第一个查询只是表。

第二个查询将表与自身连接 61 次。它工作正常。

第三个查询有一个包含 61 个连接的子查询,它本身又与表连接了一次。它工作正常。

第四个查询连接表 62 次。它失败了。

【讨论】:

【参考方案2】:

是的,它适用于整个查询。我遇到了这个。在 SQL 2005 中,限制是 256。我们刚刚升级到 2008,我不确定是否有限制。在此处查看官方限制:http://msdn.microsoft.com/en-us/library/ms143432.aspx 但是,最好的做法是将查询分成两部分或更改其编写方式。

【讨论】:

作为您的链接点,2008 年和更新版本的(每个 SELECT 语句的表数)仅受“可用资源”的限制。

以上是关于SQL连接表的最大数量限制是适用于整个查询,还是单独计算子查询?的主要内容,如果未能解决你的问题,请参考以下文章

PostgreSQL 对连接中的表数有限制吗?

SQL一次性查询一个字段不同条件下的统计结果(另一张表的统计数量)

SQL连接查询

一台服务器最大能支持多少条TCP连接?

Mybatis-plus3.3及之前版本 支撑当前分页查询是否允许突破单页最大500条数据的限制

Mybatis-plus3.3及之前版本 支撑当前分页查询是否允许突破单页最大500条数据的限制