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ユーザー名の両方がソートされ、2 つの大きなテーブルを結合するマージ結合が可能になります。

また、c fr company や user_group の ug など、結合構文と意味のあるエイリアスをテーブルに使用してください。データベースにとっては問題ではありませんが、人間がコードを読み取ろうとするのに役立ちます。また、allcaps はいつもあなたが叫んでいるように見えますが、それは私だけかもしれません :-)

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 に答える