【发布时间】:2016-03-18 12:34:24
【问题描述】:
我有一个使用交叉应用的查询。我需要对多个 [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 表的增长,查询将变得越来越慢。因此,这对我来说不是一个可行的解决方案。
有没有更快更好的方法来做到这一点?非常感谢你。请注意 [Quote_Header_Details_vw] 和 [Core.Job] 表之间没有关系,即不能加入它们。
【问题讨论】:
-
@a_horse_with_no_name 知道了,谢谢。
-
@Ashraf Abusada 谢谢。不一样,两张表完全没有关联。
-
您是否调整了这 2 个查询中的每一个?使用 Sql Server Profiler 查看是否可以先执行此操作,如果优化(良好的索引等)然后查看
CROSS APPLY -
您的过滤器“Core.Job.[Description] like '%'+[Reports].[Quote_Header_Details_vw].[Ene_Product]”是不可搜索的,将对每条记录进行全表扫描只返回一行。
标签: sql sql-server tsql ssrs-2012