【问题标题】:Optimizing/Alternate to Cross Apply优化/交替交叉应用
【发布时间】: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


【解决方案1】:

你的问题不是交叉申请,

但您确实应该考虑切换到不同的 SPLIT 函数..

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

我用随机数据对其进行了测试,Table1 中有 60000 个记录,Table2 中有 2000 个记录,每个 col2 和 col3 都有随机 1-3 个字母

希望对你有帮助

【讨论】:

    猜你喜欢
    • 2021-05-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-01-08
    • 2015-06-23
    • 2021-05-09
    • 1970-01-01
    相关资源
    最近更新 更多