【发布时间】:2016-06-17 00:50:33
【问题描述】:
我在优化以下 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
【问题讨论】:
-
修复数据结构。也就是说,使用联结表而不是字符串来存储奇数列表。
标签: sql sql-server tsql optimization cross-apply