我需要帮助优化以下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
答案 0 :(得分:1)
你的问题不是交叉申请,
但你真的应该考虑切换到另一个 SPLIT 功能..
如果您使用众所周知的 [DelimitedSplit8K] ,您的查询执行时间将从25秒降至不到一秒......
我用随机数据测试了它,Table1中有60000个rec,表2中有2000个recs,每个col2和col3有随机的1-3个字母
我希望这个帮助