2017-02-13 16 views
0

私は、次のクエリをコード化:2つのクエリをどのように水平に組み合わせることができますか?

SELECT u.LastName Col1 
, convert(varchar, COALESCE(COUNT(DISTINCT pm.PhraseId), 0)) AS Col2 
, convert(varchar, COALESCE(COUNT(DISTINCT pc.PhraseId), 0)) AS Col3 
FROM dbo.AspNetUsers u 
LEFT JOIN dbo.Phrase pm ON u.Id = pm.ModifiedBy 
LEFT JOIN dbo.Phrase pc ON u.Id = pc.CreatedBy 
GROUP BY u.LastName 

パフォーマンスが非常に悪かったし、それを実行する分を引き継ぎました。私はの出力を結合するためにいくつかの方法を見つけるしたいと思います

SELECT u.LastName Col1 
, convert(varchar, COALESCE(COUNT(DISTINCT pm.PhraseId), 0)) AS Col2 
FROM dbo.AspNetUsers u 
LEFT JOIN dbo.Phrase pm ON u.Id = pm.ModifiedBy 
GROUP BY u.LastName 

SELECT u.LastName Col1 
, convert(varchar, COALESCE(COUNT(DISTINCT pc.PhraseId), 0)) AS Col2 
FROM dbo.AspNetUsers 
LEFT JOIN dbo.Phrase pm ON u.Id = pc.CreatedBy 
GROUP BY u.LastName 

最初のクエリが実行可能ではないので:私はその後、2つのクエリに分解し、これらのそれぞれが実行するためにわずか2秒かかる試みた

2つの小さいクエリ。私はこのようなインデックスを作成している

CREATE TABLE [dbo].[Phrase] (
    [PhraseId]  UNIQUEIDENTIFIER DEFAULT (newid()) NOT NULL, 
    [English]  NVARCHAR (250) NOT NULL, 
    [CreatedBy] INT    DEFAULT ((1)) NOT NULL, 
    [ModifiedBy] INT    DEFAULT ((1)) NOT NULL, 
    PRIMARY KEY CLUSTERED ([PhraseId] ASC) 
); 

CREATE TABLE [dbo].[AspNetUsers] (
    [Id]     INT   IDENTITY (1, 1) NOT NULL, 
    [FirstName]   NVARCHAR (MAX) NULL, 
    [LastName]    NVARCHAR (MAX) NULL, 
    CONSTRAINT [PK_dbo.AspNetUsers] PRIMARY KEY CLUSTERED ([Id] ASC) 
); 

Col1  Col2  Col3 

ad1  100   50 
ad2  10    5 
ad3  200   99 

注:

create nonclustered index ix_Phrase_CreatedBy on dbo.Phrase (CreatedBy) 
create nonclustered index ix_Phrase_ModifiedBy on dbo.Phrase (ModifiedBy) 

私は感謝し、私は2つのテーブルを持っている

: は、ここで私は、テーブルのDDLと一緒に取得したい結果ですどのように私はより小さい2秒のランタイムクエリを組み合わせることができるかについての提案を私は 私は速く実行する最初のクエリを取得することはできません。これは、SQL Serverの問題ですか、私はここに述べたように何

答えて

0

Paste The Plan @ brentozar.com

を使用して実行計画を共有するかどうかわからない:Performance problems with two left joins. Is there an alternative with unpivot?

あなたはまた、PhraseId以来count(distinct ...)を使用する必要はありません一意である、またはcoalesce()

rextester:http://rextester.com/CMP5250

select 
    u.LastName 
    , CreatedByQty =count(pc.CreatedBy) 
    , ModifiedByQty=count(pm.ModifiedBy) 
from dbo.AspNetUsers u 
    left join dbo.Phrase pc 
    on u.Id = pc.CreatedBy 
    left join dbo.Phrase pm 
    on u.Id = pm.ModifiedBy 
group by u.LastName 

outer apply()の左結合を入れ替えることもできますが、それが役立つかどうかわかりません:

select 
    u.LastName 
    , CreatedByQty =count(pc.CreatedBy) 
    , ModifiedByQty=pm.ModifiedByQty 
from dbo.AspNetUsers u 
    left join dbo.Phrase pc 
    on u.Id = pc.CreatedBy 
outer apply (
    select ModifiedByQty=count(1) 
    from dbo.Phrase pm 
    where u.Id = pm.ModifiedBy 
    ) pm 
group by u.LastName 
関連する問題