优化/替代交叉申请

时间:2016-05-20 17:59:05

标签: sql sql-server tsql optimization cross-apply

我需要帮助优化以下SQL查询。

表1:62000条记录

Col 1   Col 2     Col 3 
1       X, Y      A, B  
2       L, M, N   P, Q, R 
3       G         H 

表2:2000条记录

Col 1   Col 2
1       One
2       Two

需要输出:

Col1   Col2  Col3  Col4
1      X     A     One
1      Y     B     One
2      L     P     Two
2      M     Q     Two
2      N     R     Two
3      G     H  

当前表现:23-30秒
当前查询:

SELECT    
    e.[ID], e.[Title], a.id, a.val, b.id, b.val, 
FROM [dbo].[Table 1] e 
CROSS apply dbo.KDSplit(Col2, ' , ') a 
CROSS apply dbo.KDSplit(e.Col3, ' , ') b 
LEFT JOIN Table2 k ON k.SeriesCode = e.SeriesCode
    WHERE a.id = b.id AND isDate(b.val) = 1

返回id和value的函数:

SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO
ALTER FUNCTION [dbo].[KDSplit]
(
  @delimited nvarchar(max),
  @delimiter nvarchar(100)
) RETURNS @t TABLE
(
  id int identity(1,1),
  val nvarchar(max)
)
AS
BEGIN
  declare @xml xml
  set @xml = N'<root><r>' + replace(@delimited,@delimiter,'</r><r>') + '</r></root>'
  insert into @t(val)
  select
    r.value('.','varchar(max)') as item
  from @xml.nodes('//root/r') as records(r)
  RETURN
END

1 个答案:

答案 0 :(得分:1)

你的问题不是交叉申请,

但你真的应该考虑切换到另一个 SPLIT 功能..

如果您使用众所周知的 [DelimitedSplit8K] ,您的查询执行时间将从25秒降至不到一秒......

我用随机数据测试了它,Table1中有60000个rec,表2中有2000个recs,每个col2和col3有随机的1-3个字母

我希望这个帮助