【发布时间】:2012-12-10 00:52:38
【问题描述】:
由于其复杂性,我无法向您展示我的确切问题和查询,但我会将问题简化为另一个类似的问题。
这里是:
有 5 个表格,包含有关苹果、汽车、书籍、电脑和衣服的信息。上面的每个表都可以有 cmets,所有 cmets 都存储在一个名为 Comments 的表中(带有 user_id 列)。为了将这 5 个表与它们自己的 cmets 链接,我必须创建 5 个其他链接表名称 AppleComments、CarComments、BookComments,等等。
我的查询想要从这 5 个类别类型中检索我的所有 cmets。
我能想到两种方法,一种比另一种快。
-
我可以将 5 个表与其链接表连接起来,然后使用 cmets
where comments.user_id = me,然后将所有结果联合到 1 个结果集中:SELECT <column_names> FROM AppleComments INNER JOIN Comments ON AppleComments.comment_id = Comments.comment_id WHERE Comments.user_id = me UNION ALL SELECT <column_names> FROM CarComments INNER JOIN Comments ON CarComments.comment_id = Comments.comment_id WHERE Comments.user_id = me etc... -
我可以使用 union all 从链接表中选择所有评论 ID,然后将此子查询与
Comments表进行内部连接以获取有关它们的其他信息。SELECT <column_names> FROM ( Select AppleComments.comment_id FROM AppleComments UNION ALL Select CarComments.comment_id FROM CarComments UNION ALL Select BookComments.comment_id FROM BookComments UNION ALL Select ComputerComments.comment_id FROM ComputerComments UNION ALL Select ClothesComments.comment_id FROM ClothesComments) AS items INNER JOIN Comments ON items.comment_id = Comments.comment_id WHERE Comments.user_id = me
第二个速度更快,生成的执行计划更小。
问题是,因为来自 ex 的子查询“项目”。 2 实际上从数据库中选择所有 cmets 然后与 cmets 表进行内部连接,我担心在处理太多行时它会表现不佳。可能是内存太多了?
现在我无法确定,因为 90% 的 cmets 是我的,但从每个示例的角度来看,我会说第一个是检索较少数据量(总计)的那个。
如果数据库中有 100 万个 cmets 而我的只有 100 个会怎样...
谢谢。
【问题讨论】:
标签: sql-server subquery