我有两张桌子:
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获取数据?
答案 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