根据范围

时间:2018-04-23 04:58:55

标签: sql-server tsql

我有一个存储过程,我正在尝试将初始拉入设置为表。

基于参数@being_date和@end_date,存储的proc拉取数据并将其聚合为大约20个客户端。

然而,第21位客户有一个独特的情况。

201501之后的数据应从特定地理位置的特定表中提取。区域。 应该从all_employees表中提取201501之前的数据。

由于这个要求,我无法执行整个范围201401到201803的proc。我必须按月运行它。

create procedure sp_agg_emp_data (@begin_month int, @end_month int, @clientid varchar(30)) 
as
begin
declare @cutoff_month int 

IF @clientid = 'NNA' 
BEGIN
 select @cutoff_month = min(monthofs) from all_na_employees

 IF @begin_month < @cutoff_month
 begin
    select *
    into _agg_emp
    from all_employees
 end
 else
 begin
   select *
   into _agg_temp
   from (
     select *
     from all_employees where geo_region <> 'NA'
      union all
     select *
     from all_na_employees where geo_region = 'NA'
     ) x
 end
end
 ELSE
 BEGIN
     select *
    into _agg_emp
    from all_employees
  END
end

执行挂起:  从all_employees中选择@cutoff_month = min(monthofs)

查询计划没有显示任何异常。

有更简单优雅的方法吗?

更新 - 添加详细信息

  1. 是的,第21个客户是不变的。这一步是第一步 - 进程将数据放入表中,然后进行各种聚合 使用动态sql的级别。
  2. 数据量不高 - 大约100K行。一般, 执行需要1.5分钟。但对于这个客户来说,它只是卡住了 在那一步。
  3. 我打开了SSMS中的执行计划并打印了调试语句。跑步不会超出这一步。

1 个答案:

答案 0 :(得分:0)

一个原因是列monthofs上没有索引。也许all_na_employees有很多行,或者它是一个视图或计算monthofs。尝试添加索引以对其进行排序DESC