优化嵌套的左连接查询

时间:2016-01-22 19:50:30

标签: sql-server join

我正在研究一个SQL查询,其中包含几个连接,如下所示。

   SELECT DISTINCT GL2.Number1, GL.DEPARTMENT,GL.CLASS,GL.SUBCLASS,GL.LINE, PR.*
    FROM DETAIL A

    LEFT JOIN CATEGORIES CAT ON   A.WEB_ID=CAT.CATEGORY_ID  
    LEFT JOIN GROUP_LINES GL ON 
                                            A.BRAND=GL.MANUFACTURER 
                                            OR  A.A1=GL.Number1 
                                            OR  CAT.A2 =  GL.DEPARTMENT
                                            OR  CAT.A3=  GL.CLASS
                                            OR  CAT.A4= GL.SUBCLASS
                                            OR  CAT.A5= GL.LINE


    LEFT JOIN  RULE_GROUPS RG ON GL.GROUP_ID=RG.GROUP_ID
    LEFT JOIN  RULE_GROUPS RG2 ON RG.RULE_ID=RG2.RULE_ID                                            
    LEFT JOIN  GROUP_LINES GL2 ON RG2.GROUP_ID=GL2.GROUP_ID
    LEFT JOIN  PRICING_RULES PR ON RG.RULE_ID=PR.RULE_ID
    LEFT JOIN  PRICING_ATTRIBUTES PA ON PR.RULE_ID=PA.RULE_ID

WHERE A.INVEN_ID='123456'

由于某些原因,我不认为上述查询是以最佳方式编写的。有没有办法可以更好地重写上述查询?

1 个答案:

答案 0 :(得分:2)

我最初打算将此作为评论,但它太长了。

PR.*可能会返回比您在结果集中实际需要的字段数更多的字段。根据表的大小,明确列出您需要的字段可能只是理论上的改进。

无论如何,如果这正是你想要的那样,我不会试图弄乱查询本身。即使你设法得到的东西能够以不同的方式返回完全相同的结果,但如果你看一下执行计划,它最终会完全相同,我也不会感到惊讶。

我建议您转而使用已知的良好查询,然后将其提供给Tuning Advisor,这将通过创建索引和统计信息等来确定如何使查询更快地运行。这是一个很棒的工具,有时结果几乎是神奇的。