sql >> データベース >  >> RDS >> Sqlserver

サブクエリのパフォーマンスを最適化する

    最初にサブクエリを一時テーブルに実行してカウントを収集してから、合計カウントを取得してみます。クエリのセットアップ方法では、PCapps の行ごとにこれらのサブクエリを 1 回ずつ実行するため、時間がかかります。

    次のようにしてみてください:

    declare @t table (Computer varchar(10), Sequence int, Site varchar(3), SoftwareName varchar(20), OS varchar(20) )
    
    insert into @t values
     ('C1',1,'BKN','Adobe Acrobat','Win7')
    ,('C2',1,'BKN','Adobe Acrobat','Win7')
    ,('C3',1,'BKN','Adobe Acrobat','Win7')
    ,('C1',1,'BKN','AutoCAD LT ','Win7')
    ,('C3',1,'BKN','AutoCAD LT ','Win7')
    ,('B1',2,'CTW','Adobe Acrobat','Win7')
    ,('B2',2,'CTW','Adobe Acrobat','Win7')
    ,('B3',3,'CTW','Adobe LT','Win7')
    ,('B4',3,'CTW','Adobe Acrobat','Win7')
    ,('A1',2,'CTW','Adobe Acrobat','Win7')
    ,('A2',2,'CTW','Adobe LT','Win7')
    ,('A3',2,'CTW','Adobe Acrobat','Win7')
    ,('X4',3,'CTW','Adobe Acrobat','WinXP')
    ,('X1',2,'CTW','Adobe Acrobat','WinXP')
    ,('X2',2,'CTW','Adobe LT','WinXP')
    ,('X3',2,'CTW','Adobe Acrobat','WinXP')
    ,('A4',2,'CTW','Adobe Acrobat','Win7');
    
    SELECT 
        Site,
        OS,
        SoftwareName, 
        Sequence,
        COUNT(SoftwareName)  as 'Count'
    into #SiteSpecific
    FROM @t
    group by Site, OS, SoftwareName, Sequence;
    
    
    WITH PCapps AS (
    SELECT DISTINCT
        Computer,
        Sequence,
        Site,
        SoftwareName,
        OS
    FROM @t
    )
    SELECT 
        DISTINCT
        PC.SoftwareName,
        PC.Sequence,
        PC.Site,
        PerSeq.[Count] as 'Win7Installs/seq',
        PerSite.[Count] as TotWin7apps,
        total.[Count] as TotalInstalls 
    FROM PCapps pc
    inner join (select SoftwareName, Sequence, OS, sum([Count]) [Count] from #SiteSpecific group by SoftwareName, Sequence, OS) PerSeq 
        on PerSeq.SoftwareName = pc.Softwarename 
        AND PerSeq.Sequence = pc.Sequence
        AND PerSeq.OS = pc.OS
    inner join (select SoftwareName, Site, OS, sum([Count]) [Count] from #SiteSpecific group by SoftwareName, Site, OS) PerSite 
        on PerSite.SoftwareName = pc.Softwarename 
        AND PerSite.Site = pc.Site
        AND PerSite.OS = pc.OS
    inner join (select SoftwareName, sum([Count]) [Count] from #SiteSpecific group by SoftwareName) Total 
        on Total.SoftwareName = pc.Softwarename 
    where Pc.OS='Win7'
    order by SoftwareName, Sequence, Site
    


    1. WHERE句とINNERJOINが機能しないMySQL更新クエリ

    2. postgresqlの関数をどの程度正確に回避しますか?

    3. MySQL:複数のテーブルまたは多くの列を持つ1つのテーブル?

    4. XML タグを使用して行をコンマ区切りの値にする