1

我被告知用没有连接的嵌套查询重写以下查询以获得更好的性能。这是真的吗?如果是这样,如何重写它?

SELECT distinct A.Company_Name,C.Outlet_Name,
       C.Outlet_FCE_ID,D.Usergroup_Name
FROM   company A, PURCHASE_INVOICE B, 
       Outlet C, User_Group D,CT_USER E
WHERE A.Company_ID = B.Company_ID AND B.Outlet_ID  = C.Outlet_ID 
  AND B.Company_ID = C.Company_ID AND B.Username   = E.Username 
  AND E.Usergroup_ID=D.Usergroup_ID

这是表结构。

在此处输入图像描述

4

2 回答 2

1

优化器应该可以做到这一点,但您可能希望将原始查询的性能与此进行比较:

select distinct 
    c.company_name, 
    o.outlet_name, 
    o.outlet_fce_id, 
    ug.usergroup_name
from company c 
    inner join (select distinct company_id, outlet_id, username from purchase_invoice) i on c.company_id=i.company_id
    inner join outlet o 
        on  i.outlet_id  = o.outlet_id
        and i.company_id = o.company_id
    inner join ot_user u     on b.username     = e.username
    inner join user_group ug on u.usergroup_id = d.usergroup_id

purschases 表上的不同可以消除一些工作,但我怀疑是否会有那么多骗子。

更有帮助的是purchase_invoice (username, outlet_id, company_id). 这可以加快速度,因为它将是表上的覆盖索引。连接只需要查看索引并且可以跳过读取实际表。如果桌子很宽,这会有所帮助。

还要注意索引中列的顺序。我猜它ct_user也有很多行,并且它在Username. 这样索引和ct_user将按用户名排序,允许合并连接以连接两个大表。

还请为您的表使用连接语法和有意义的别名,例如 c fr company 和 ug 用于 user_group。这对数据库无关紧要,但它无疑可以帮助人们尝试阅读您的代码。此外,所有大写字母看起来就像你一直在尖叫,但也许这只是我 :-)

GJ

于 2012-04-11T14:32:17.503 回答
0

让我回答我自己的问题。我不喜欢这样,但我们走吧......

    SELECT  distinct
        ( SELECT    Company_Name
          FROM      dbo.COMPANY
          WHERE     Company_ID = p.Company_ID
        ) AS 'CompanyName' ,
        ( SELECT    Outlet_Name
          FROM      dbo.OUTLET
          WHERE     Company_ID = p.Company_ID
                    AND Outlet_ID = p.Outlet_ID
        ) AS 'OutletName' ,
        ( SELECT    Outlet_FCE_ID
          FROM      dbo.OUTLET
          WHERE     Company_ID = p.Company_ID
                    AND Outlet_ID = p.Outlet_ID
        ) 'OutletFCEID' ,
        ( SELECT    Usergroup_Name
          FROM      dbo.USER_GROUP
          WHERE     Usergroup_ID IN ( SELECT    Usergroup_ID
                                      FROM      CT_USER
                                      WHERE     Username = p.UserName )
        ) 'UsergroupName'
FROM    dbo.PURCHASE_INVOICE p
于 2012-04-13T18:08:36.640 回答