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连接表的最大数量限制是适用于整个查询,还是单独计算子查询?的主要内容,如果未能解决你的问题,请参考以下文章
SQL一次性查询一个字段不同条件下的统计结果(另一张表的统计数量)