无需多个联接即可快速查询

时间:2019-05-23 17:26:38

标签: sql sql-server

所以基本上,我要从多个视图中选择多个列(确切地说是18列和8个视图)。总运行时间约为36分钟。我尝试清理所有内容以使其更具可读性,但现在花费的时间更长。持续50分钟。

以下是发生的情况的一个示例:

    SELECT (18 columns)
           -- different cases happening here
    FROM view1 m
    left join  view2 dep  on dep.MemberId = m.MemberId      
    inner join view3 c on c.clientid = m.clientid   
    inner join view4 cl on m.locationid = cl.locationid 
    inner join view5 cc on m.classid = cc.classid 
    inner join view6 cp on m.ClientId = cp.ClientId
    inner join view7 mp on m.MemberId = mp.MemberId
    inner join view8 ma on ma.Memberid = m.MemberId

我只是想获取我的专栏,但它们来自几个不同的地方。有什么办法可以使速度更快?是否需要创建临时表?如果是这样,我应该如何实现它以提高查询速度?

谢谢。

2 个答案:

答案 0 :(得分:0)

执行多个步骤会更容易

根据您的查询,您可以

Exception has occurred.
_TypeError (type 'List<dynamic>' is not a subtype of type 'List<Map<String, dynamic>>')

我知道这里还有一些额外的步骤,但是您可以编写脚本脚本,并且可能会提高性能。

请让我知道这对您有效。

答案 1 :(得分:0)

每个联接都将为查询添加时间/资源,并且当您针对视图联接时,会将每个视图中的每个联接都添加到查询中。而且,只需要一个不良性能视图就可以放慢其他所有功能。我能想到的三个选择:

  1. 摆脱视图并直接加入其中的表。仅选择所需的联接,并且仅选择所需的列。确保联接中的每一列都有一个索引(例如,对于“ FROM tbl1 JOIN tbl2 ON tbl1.SomeID1 = tbl2.SomeOtherID”,请确保在tbl1.SomeID1上有一个索引,并且在tbl2.SomeOtherID上有一个索引。 li>
  2. 如果您可以处理“旧”数据,则可以在晚上运行查询并填写展平表,然后在第二天运行查询。寻找有关创建数据仓库的提示。
  3. 采用上面#1的技巧,并尝试优化每个视图。