我的主管告诉我这个查询会“崩溃服务器”(因为我相信它有数百万个表)。谁能告诉我为什么?也许告诉我我想做的方式?我目前正在阅读手册来解决这个问题。
我被告知这些连接是否会变慢。什么是缓慢的?
"JOIN A AS o ON a.A =aa.A " .
"JOIN B AS i ON ... " .
"JOIN C AS p ON ... " .
"JOIN D as t ON ... "
"JOIN DB.E as a ON ... " .
"JOIN DB.F as d ON ... " .
"JOIN DB.G as g ON ... " .
"JOIN DB.H AS h ON ... " .
答案 0 :(得分:3)
有几点想法:
对于太规范化的数据库存在一个论点......一个人不应该将这么多表连接在一起以获得他们需要的东西。如果频繁使用数据,将列保留在多个表中和/或组合表可能是有意义的。
如果您正在生成报告(无法想到许多其他输出,您需要这么多列),此查询需要多长时间运行一次?考虑使用ETL过程从各种源表中逐步构建数据,并将其加载到单个表中以供大查询使用。
确保您已准备好适当的索引。
另外,假设你正在使用MySQL(问题没有真正指定),你总是可以使用'EXPLAIN'语句告诉你这个查询有多糟糕......
答案 1 :(得分:1)
JOIN A AS o ON a.A =aa.A
这会立即引发一个红色标记,因为连接条件没有提到表A(称为“o”)。这将为您提供所有行的交叉产品,这不是您想要的。您的加入条件(在ON
之后)应始终提及您刚加入的表格(AS 'x'
中的x)。
答案 2 :(得分:0)
您可以解析查询(运行计划而不是查询)以查看返回的估计行数。如果由于连接而返回大量行,那么这样的查询可能会使数据库瘫痪(我不认为JOINS的数量是问题 - 除了超过文档中给出的任何限制时),但是事实上,JOIN术语可以返回大量数据,除非受基于WHERE子句的索引使用限制。另一种方法可以是在SELECT主要部分中使用内联SELECT,并查看优化程序提出的查询计划,特别是如果一个或多个表的行数明显多于您选择的其他表。
即。
SELECT *
, (select col1 from b where b.A = A.A) as x
...
from A
...