加速交叉应用查询
Speed up Cross Apply query
我有一个查询使用交叉应用。我需要 运行 查询多个 [Quote Id]。这是我的原始查询:
SELECT distinct
[Reports].[Quote_Header_Details_vw].[Quote_Id]
,[Reports].[Quote_Header_Details_vw].[Quote_Created]
,[Reports].[Quote_Header_Details_vw].[Com_Product]
,[Reports].[Quote_Header_Details_vw].[Ene_Product]
,b.[Completed]
,b.[Description]
FROM [Reports].[Quote_Header_Details_vw]
CROSS APPLY (SELECT Top 1
Core.Job.[Completed]
,Core.Job.[Description]
FROM Core.Job
WHERE [Quote_Header_Details_vw].[Quote_Created]>=Core.Job.[Completed]
And Core.Job.[Description] like '%'+[Reports].[Quote_Header_Details_vw].[Ene_Product]
Order by Core.Job.[Completed] DESC) AS b
我了解到在 Cross Apply 语句中执行 Top 1 操作花费了很多时间。对于单个报价 ID,查询目前需要 40 多秒才能达到 运行,并且随着 Core.Job table 的增长,查询将变得越来越慢。因此,这对我来说不是一个可行的解决方案。
有没有更快更好的方法?非常感谢你。请注意,[Quote_Header_Details_vw]和[Core.Job]table之间没有关系,即不能加入。
只需将它们放在变量中,然后在 select
中使用变量
declare @dd1 varchar(20);
declare @dd2 varchar(20);
select top (1) @dd1 = [name], @dd2 = [dispName]
from [table]
order by [name] desc;
select @dd1, @dd2;
OP 需要细节
declare @dd1 varchar(20);
declare @dd2 varchar(20);
SELECT Top (1)
@dd1 = Core.Job.[Completed]
, @dd2 = Core.Job.[Description]
FROM Core.Job
WHERE [Quote_Header_Details_vw].[Quote_Created] >= Core.Job.[Completed]
And Core.Job.[Description] like '%'+[Reports].[Quote_Header_Details_vw].[Ene_Product]
Order by Core.Job.[Completed] DESC;
SELECT distinct
[Reports].[Quote_Header_Details_vw].[Quote_Id]
,[Reports].[Quote_Header_Details_vw].[Quote_Created]
,[Reports].[Quote_Header_Details_vw].[Com_Product]
,[Reports].[Quote_Header_Details_vw].[Ene_Product]
,@dd1 as [Completed]
,@dd2 as [Description]
FROM [Reports].[Quote_Header_Details_vw];
或尝试
select * from
(
SELECT r.[Quote_Id]
,r.[Quote_Created]
,r.[Com_Product]
,r.[Ene_Product]
,b.[Completed]
,b.[Description]
,row_number() over (partition by r.[Quote_Id] order by b.[Completed] desc) as rn
FROM [Reports].[Quote_Header_Details_vw] r
join Core.Job b
on r.[Quote_Created] >= b.Job.[Completed]
And b.[Description] like '%'+r.[Ene_Product]
) tt
where tt.rn = 1
我有一个查询使用交叉应用。我需要 运行 查询多个 [Quote Id]。这是我的原始查询:
SELECT distinct
[Reports].[Quote_Header_Details_vw].[Quote_Id]
,[Reports].[Quote_Header_Details_vw].[Quote_Created]
,[Reports].[Quote_Header_Details_vw].[Com_Product]
,[Reports].[Quote_Header_Details_vw].[Ene_Product]
,b.[Completed]
,b.[Description]
FROM [Reports].[Quote_Header_Details_vw]
CROSS APPLY (SELECT Top 1
Core.Job.[Completed]
,Core.Job.[Description]
FROM Core.Job
WHERE [Quote_Header_Details_vw].[Quote_Created]>=Core.Job.[Completed]
And Core.Job.[Description] like '%'+[Reports].[Quote_Header_Details_vw].[Ene_Product]
Order by Core.Job.[Completed] DESC) AS b
我了解到在 Cross Apply 语句中执行 Top 1 操作花费了很多时间。对于单个报价 ID,查询目前需要 40 多秒才能达到 运行,并且随着 Core.Job table 的增长,查询将变得越来越慢。因此,这对我来说不是一个可行的解决方案。
有没有更快更好的方法?非常感谢你。请注意,[Quote_Header_Details_vw]和[Core.Job]table之间没有关系,即不能加入。
只需将它们放在变量中,然后在 select
中使用变量declare @dd1 varchar(20);
declare @dd2 varchar(20);
select top (1) @dd1 = [name], @dd2 = [dispName]
from [table]
order by [name] desc;
select @dd1, @dd2;
OP 需要细节
declare @dd1 varchar(20);
declare @dd2 varchar(20);
SELECT Top (1)
@dd1 = Core.Job.[Completed]
, @dd2 = Core.Job.[Description]
FROM Core.Job
WHERE [Quote_Header_Details_vw].[Quote_Created] >= Core.Job.[Completed]
And Core.Job.[Description] like '%'+[Reports].[Quote_Header_Details_vw].[Ene_Product]
Order by Core.Job.[Completed] DESC;
SELECT distinct
[Reports].[Quote_Header_Details_vw].[Quote_Id]
,[Reports].[Quote_Header_Details_vw].[Quote_Created]
,[Reports].[Quote_Header_Details_vw].[Com_Product]
,[Reports].[Quote_Header_Details_vw].[Ene_Product]
,@dd1 as [Completed]
,@dd2 as [Description]
FROM [Reports].[Quote_Header_Details_vw];
或尝试
select * from
(
SELECT r.[Quote_Id]
,r.[Quote_Created]
,r.[Com_Product]
,r.[Ene_Product]
,b.[Completed]
,b.[Description]
,row_number() over (partition by r.[Quote_Id] order by b.[Completed] desc) as rn
FROM [Reports].[Quote_Header_Details_vw] r
join Core.Job b
on r.[Quote_Created] >= b.Job.[Completed]
And b.[Description] like '%'+r.[Ene_Product]
) tt
where tt.rn = 1