子查询中可能的大数据集?

时间:2012-12-10 00:52:38

标签: sql-server subquery

由于其复杂性,我无法向您展示我的确切问题和查询,但我会将问题简化为另一个问题。

这里是:

有5张桌子,包含有关苹果,汽车,书籍,电脑和衣服的信息。上面的每个表都可以有注释,所有注释都存储在一个名为Comments的表中(带有user_id列)。要将这5个表与他们自己的注释相关联,我必须创建5个其他链接表名AppleCommentsCarCommentsBookComments,等等。

我的查询想从这5个类别类型中检索我的所有评论。

我可以想到两种方式,一种比另一种更快。

  1. 我可以使用其链接表加入5个表,然后使用注释where comments.user_id = me加入UNION ALL结果到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...
    
  2. 我可以使用union all从linkin表中选择所有注释id-s,然后使用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
    
  3. 第二个更快,产生更小的执行计划。

    问题是,因为子查询'items'来自ex。 2实际上选择了数据库中的所有注释,然后使用comments表进行内部连接,我担心的是在处理太多行时它会表现不佳。也许记忆太多了?

    现在我无法分辨,因为90%的评论都是我的,但是每个例子判断一点,我会说第一个是检索少量数据(每个总数)。

    如果数据库中有100万条评论,而且只有100条评论...

    感谢。

1 个答案:

答案 0 :(得分:2)

你的直觉是正确的。 UNION ALL几乎会消除未来优化的可能性。在结合之前尽你所能;第一种方法是正确的。

除了它提出的问题,为什么你在五个不同的表中有类似的东西,为什么你甚至有一个似乎是一对一关系的链接表?具有itemtype字段的单个表是不够的?如果您有额外的数据,那么我可以选择外部链接到其他数据表...

当然,这是一个虚构的宇宙,我对你原来的问题一无所知:)