只是想知道是否有人使用任何技巧(或工具)来可视化连接。你知道,你写了一个完美的查询,命中运行,并且在它运行20分钟后,你意识到你可能已经创建了一个笛卡尔联接。
当我添加另一个连接语句时,我有时难以想象会发生什么,并且想知道人们在尝试组合大量连接时是否使用了不同的技术。
答案 0 :(得分:2)
始终牢记最终目标。
确定您需要的列
尝试确定执行此操作所需的最小表数。
使用表格编写FROM部分,该表格将提供最大列数。例如FROM Teams T
在新行上逐个添加每个联接。确保在每一步都需要OUTER,INNER,LEFT,RIGHT JOIN。
通常适合我。请记住,它是结构化查询语言。总是将查询分解为逻辑行,这样更容易。
答案 1 :(得分:1)
每个联接将两个结果集合并为一个。每个都可以来自单个数据库表或临时结果集,它是先前连接或子查询的结果。
始终知道连接的处理顺序,并且对于每个连接,请了解要连接在一起的两个临时结果集的性质。知道该结果集中每行所代表的逻辑实体,以及该结果集中的哪些属性唯一地标识该实体。如果您的连接旨在始终将一行连接到一行,则这些关键属性是您需要使用(在连接条件中)来实现连接的属性。如果您的联接旨在生成某种类型的笛卡尔积,那么理解上述内容以了解连接条件(无论它们是什么)将如何影响新连接结果集的基数是至关重要的。
尝试使用外连接方向保持一致。当我需要一个外连接时,我尝试总是使用Left Joins,因为我“认为”每个连接是“加入”新表(右边)到我已经连接在一起的任何东西(左边)声明......
答案 2 :(得分:0)
运行解释计划。
这些始终是分层树(要做这个,首先我必须那个)。有许多工具可以将这些计划用于图形树,有些用于SQL浏览器(例如,Oracle SQLDeveloper,无论调用SQlServer的GUI客户端)。如果您没有工具,大多数计划文本输出都包含一个“深度”列,您可以使用该列缩进该行。
您要查找的是每行的费用。 (请注意,对于Oracle而言,如果最终结果集具有Oracle,则允许Oracle执行散列连接而不是嵌套循环,和,则成本更高可能意味着更少时间高基数(很多很多行)。)
答案 3 :(得分:0)
我从未找到过比思考并运用自己的思想更好的工具。
如果查询太复杂而你无法做到这一点,你可能想要使用CTE,视图或其他一些精心组织的子查询将其分解成逻辑部分,这样即使你不能,你也可以很容易地理解和可视化每一部分管理整个。
此外,如果您的关注是有效的,那么SQL Server Management Studio 2005或更高版本可让您获得估计的查询执行计划,而无需实际执行查询。如果您使用的是MS SQL Server,这可以让您非常了解问题所在。