2017-02-13 1 views
0

I codiert die folgende Abfrage:Wie kann ich zwei Queries horizontal kombinieren?

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 

Leistung war sehr schlecht und es dauerte eine Minute zu überfahren.

ich dann versucht, es zu brechen in zwei Abfragen nach unten und jeder von ihnen nimmt nur zwei Sekunden laufen:

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 

Als die erste Abfrage nicht ausführbar ist, würde Ich mag einen Weg finden, um die Ausgänge des kombinieren die zwei kleineren Abfragen. Hier ist das Ergebnis Ich mag würde mit der Tabelle DDL auszukommen:

Ich habe zwei Tabellen:

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 

Bitte beachte, dass ich so indiziert:

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

Ich würde schätzen Vorschläge, wie ich die kleineren 2 Sekunden Laufzeit Abfragen kombinieren könnte, wie es scheint, was auch immer ich kann ich nicht die erste Abfrage, um schnell zu laufen. Nicht sicher, ob dies ein SQL Server Problem ist, oder was

Antwort

0

Teilen Sie Ihre Ausführungspläne mit Paste The Plan @ brentozar.com

Wie ich hier erwähnt: Performance problems with two left joins. Is there an alternative with unpivot?

Sie sollten auch nicht verwenden müssen count(distinct ...) da PhraseId eindeutig zuzuordnen sind, oder 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 

Sie könnten auch versuchen, eine linke Join für outer apply() zu tauschen, aber ich weiß nicht, ob das helfen wird:

Verwandte Themen