两个左连接的性能问题。有没有替代与unpivot?

时间:2017-02-13 13:48:17

标签: sql-server

我有两张桌子:

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)
);

这是我在数据上运行的报告,下面是我想要的输出:

SELECT   u.LastName
        ,COALESCE(COUNT(DISTINCT pc.PhraseId),0) AS CreatedByQty
        ,COALESCE(COUNT(DISTINCT pm.PhraseId),0) AS ModifiedByQty
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


LastName   CreatedByQty  ModifiedQty

ad1        100           50
ad2        10             5
ad3        200           99

然而表现很糟糕。即使Phrase中的行数仅为5,000,现在还需要1分钟才能运行。请注意,Phrase中有更多列,但由于未引用这些列,因此我将其遗漏。

有没有人对我可以获取此数据的替代方法有任何建议。我希望使用unpivot,但不知道如何在这种情况下使用它。

有没有人对PhraseId,CreatedBy和ModifiedBy的索引有帮助。是否会使用此索引而不是使用Phrase获取数据?

1 个答案:

答案 0 :(得分:0)

如果您还没有这些索引,我会添加它们:

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

您也不应该使用count(distinct ...),因为PhraseId是唯一的,或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