Sql server 如何水平组合两个查询?
我对以下查询进行了编码:Sql server 如何水平组合两个查询?,sql-server,Sql Server,我对以下查询进行了编码: 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
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
由于第一个查询无法运行,我想找到一些方法来组合两个较小查询的输出。
以下是我希望与DDL表相处的结果:
我有两张桌子:
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秒运行时查询的建议,因为我认为
我无法快速运行第一个查询。不确定这是SQL Server问题还是什么问题使用 正如我在这里提到的: 您也不需要使用
count(distinct…
,因为PhraseId
是唯一的,或者coalesce()
:
雷克斯测试仪:
您也可以尝试将左连接替换为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
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