【问题标题】:Rewriting Outer apply to join for performanceRewriting Outer 申请加入以获得性能
【发布时间】:2018-07-02 09:26:11
【问题描述】:

由于我对 Outer Apply 不太熟悉,因此我对重写上一个问题中的那个来加入感到有点迷茫。它运行良好,但不适用于大量数据。对此的任何帮助表示赞赏。

Previous question

【问题讨论】:

  • 哪个版本的sql server(请适当标记您的问题)?自 v2012 we have LEAD() and LAG()
  • 我们使用的是 2008R2
  • APPLY按行 计算数据,而JOIN 将尝试根据给定标准连接两个集合。在您的情况下 - 因为您想获得 previous 条目,所以 row-wise 方法看起来非常好......
  • 是的,它是功能性的,但是查询的执行时间太长了,我需要尽可能缩短执行时间。
  • 上一个问题的方法需要EntryTime 和PhoneNumber 的索引。您的数据库中是否有所需的索引?是否涉及其他流程?

标签: sql-server-2008 tsql outer-apply


【解决方案1】:

您可以使用以下方法:

  • 使用CTE 创建一个集合并使用ROW_NUMBER 为您的呼叫编号。
  • ROW_NUMBER 允许使用 PARTITION BYORDER BY 部分指定 OVER() 子句

这将返回您的电话列表,其中每个电话号码按EntryTime 的顺序作为连续索引。

然后您可以使用 self-join 来查找相应的 previous 行。

declare @table table (
    PhoneNumber nvarchar(20),
    EntryTime datetime
)

insert into @table values ('(321) 546-7842', dateadd(hour,-30,getdate()));
insert into @table values ('(321) 546-7842', dateadd(hour,-3,getdate()));
insert into @table values ('(251) 546-9442', dateadd(hour,-2,getdate()));

WITH cte AS
(
    SELECT ROW_NUMBER() OVER(PARTITION BY PhoneNumber ORDER BY EntryTime) AS CallIndex
          ,t.*
    FROM @table t 
)
SELECT * 
FROM cte t1
LEFT JOIN cte t2 ON t1.PhoneNumber=t2.PhoneNumber AND t1.CallIndex=t2.CallIndex-1
ORDER BY t1.PhoneNumber, t1.EntryTime;

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-04-15
    • 2021-11-02
    • 2021-05-03
    • 2020-06-05
    • 1970-01-01
    • 2015-05-23
    相关资源
    最近更新 更多