0

这个视图需要我几个小时才能执行:

USE [SalesDWH]
GO

/****** Object:  View [dbo].[FirstLastEstablished]    Script Date: 10/29/2012 15:12:47 ******/
SET ANSI_NULLS ON
GO

SET QUOTED_IDENTIFIER ON
GO

ALTER view [dbo].[FirstLastEstablished] as


with cte_min as(

select 
      a.client_id
      ,a.specimen_source
      ,a.received_date
from
      millennium_dw_dev..F_ACCESSION_DAILY a
join
            (select distinct
                  f.client_id
                  ,f.received_date
                  ,f.accession_daily_key
            from 
                  millennium_dw_dev..F_ACCESSION_DAILY f
            join 
                  (select CLIENT_ID, MIN(received_date) MinRecDate
                  from millennium_dw_dev..F_ACCESSION_DAILY
                  group by CLIENT_ID) i
            on f.CLIENT_ID=i.CLIENT_ID
            and f.RECEIVED_DATE=i.MinRecDate) b
on    
      a.ACCESSION_DAILY_KEY=b.ACCESSION_DAILY_KEY 

)

,
cte_max as 
(

select 
      a.client_id
      ,a.specimen_source
      ,a.received_date
from
      millennium_dw_dev..F_ACCESSION_DAILY a
join
            (select distinct
                  f.client_id
                  ,f.received_date
                  ,f.accession_daily_key
            from 
                  millennium_dw_dev..F_ACCESSION_DAILY f
            join 
                  (select CLIENT_ID, max(received_date) MaxRecDate
                  from millennium_dw_dev..F_ACCESSION_DAILY
                  group by CLIENT_ID) i
            on f.CLIENT_ID=i.CLIENT_ID
            and f.RECEIVED_DATE=i.MaxRecDate) b
on    
      a.ACCESSION_DAILY_KEY=b.ACCESSION_DAILY_KEY 

)
,


cte_est as

(

select distinct client_id, MLIS_DATE_ESTABLISHED
from millennium_dw_dev..D_CLIENT
where REC_ACTIVE_FLG=1
and MLIS_DATE_ESTABLISHED is not null
)

,

mainQuery as(
select distinct
      f.client_id
      ,cmin.specimen_source first_specimen_source
      ,cmin.received_date first_received
      ,cmax.specimen_source last_specimen_source
      ,cmax.received_date last_received
      ,cest.MLIS_DATE_ESTABLISHED MLIS_DATE_ESTABLISHED
from millennium_dw_dev..F_ACCESSION_DAILY f
left join cte_max cmax
on cmax.CLIENT_ID=f.CLIENT_ID
left join cte_min cmin
on cmin.CLIENT_ID=f.CLIENT_ID
left join cte_est cest
on cest.CLIENT_ID=f.CLIENT_ID
)
,
DateDifferences
as

(
SELECT
client_id,
   (DATEDIFF(dd, MLIS_DATE_ESTABLISHED,first_received) + 1)
  -(DATEDIFF(wk, MLIS_DATE_ESTABLISHED,first_received) * 2)
  -(CASE WHEN DATENAME(dw, first_received) = 'Sunday' THEN 1 ELSE 0 END)
  -(CASE WHEN DATENAME(dw, MLIS_DATE_ESTABLISHED) = 'Saturday' THEN 1 ELSE 0 END)
 -(case when cast('01/01/2008 ' as date) between MLIS_DATE_ESTABLISHED and first_received then 1 else 0 end)
-(case when cast('05/26/2008 ' as date) between MLIS_DATE_ESTABLISHED and first_received then 1 else 0 end)
-(case when cast('07/04/2008 ' as date) between MLIS_DATE_ESTABLISHED and first_received then 1 else 0 end)
-(case when cast('09/01/2008 ' as date) between MLIS_DATE_ESTABLISHED and first_received then 1 else 0 end)
-(case when cast('11/27/2008 ' as date) between MLIS_DATE_ESTABLISHED and first_received then 1 else 0 end)
-(case when cast('12/25/2008 ' as date) between MLIS_DATE_ESTABLISHED and first_received then 1 else 0 end)
-(case when cast('01/01/2009 ' as date) between MLIS_DATE_ESTABLISHED and first_received then 1 else 0 end)
-(case when cast('05/25/2009 ' as date) between MLIS_DATE_ESTABLISHED and first_received then 1 else 0 end)
-(case when cast('07/03/2009 ' as date) between MLIS_DATE_ESTABLISHED and first_received then 1 else 0 end)
-(case when cast('09/07/2009 ' as date) between MLIS_DATE_ESTABLISHED and first_received then 1 else 0 end)
-(case when cast('11/26/2009 ' as date) between MLIS_DATE_ESTABLISHED and first_received then 1 else 0 end)
-(case when cast('12/25/2009 ' as date) between MLIS_DATE_ESTABLISHED and first_received then 1 else 0 end)
-(case when cast('01/01/2010 ' as date) between MLIS_DATE_ESTABLISHED and first_received then 1 else 0 end)
-(case when cast('05/31/2010 ' as date) between MLIS_DATE_ESTABLISHED and first_received then 1 else 0 end)
-(case when cast('07/05/2010 ' as date) between MLIS_DATE_ESTABLISHED and first_received then 1 else 0 end)
-(case when cast('09/06/2010 ' as date) between MLIS_DATE_ESTABLISHED and first_received then 1 else 0 end)
-(case when cast('11/25/2010 ' as date) between MLIS_DATE_ESTABLISHED and first_received then 1 else 0 end)
-(case when cast('12/24/2010 ' as date) between MLIS_DATE_ESTABLISHED and first_received then 1 else 0 end)
-(case when cast('01/03/2011 ' as date) between MLIS_DATE_ESTABLISHED and first_received then 1 else 0 end)
-(case when cast('05/30/2011 ' as date) between MLIS_DATE_ESTABLISHED and first_received then 1 else 0 end)
-(case when cast('07/04/2011 ' as date) between MLIS_DATE_ESTABLISHED and first_received then 1 else 0 end)
-(case when cast('09/05/2011 ' as date) between MLIS_DATE_ESTABLISHED and first_received then 1 else 0 end)
-(case when cast('11/24/2011 ' as date) between MLIS_DATE_ESTABLISHED and first_received then 1 else 0 end)
-(case when cast('12/26/2011 ' as date) between MLIS_DATE_ESTABLISHED and first_received then 1 else 0 end)
-(case when cast('01/02/2012 ' as date) between MLIS_DATE_ESTABLISHED and first_received then 1 else 0 end)
-(case when cast('05/28/2012 ' as date) between MLIS_DATE_ESTABLISHED and first_received then 1 else 0 end)
-(case when cast('07/04/2012 ' as date) between MLIS_DATE_ESTABLISHED and first_received then 1 else 0 end)
-(case when cast('09/03/2012 ' as date) between MLIS_DATE_ESTABLISHED and first_received then 1 else 0 end)
-(case when cast('11/22/2012 ' as date) between MLIS_DATE_ESTABLISHED and first_received then 1 else 0 end)
-(case when cast('12/25/2012 ' as date) between MLIS_DATE_ESTABLISHED and first_received then 1 else 0 end)


   DifferenceExcludingWeekends
  from
  mainQuery
)
,
Territory 
as
(
select distinct c.client_id,c.MLIS_TERRITORY,s.REGION_NAME
from millennium_dw_dev..D_CLIENT c
left join millennium_dw_dev..D_SALES_HIERARCHY s
on s.TERRITORY_NAME=c.MLIS_TERRITORY
where c.REC_ACTIVE_FLG=1
and s.REC_ACTIVE_FLG=1

)

select mainQuery.*,d.DifferenceExcludingWeekends,Territory.MLIS_TERRITORY,Territory.REGION_NAME
from mainQuery
left join DateDifferences d
on mainQuery.CLIENT_ID=d.CLIENT_ID
left join Territory
on mainQuery.CLIENT_ID=Territory.CLIENT_ID

GO

我对此进行了 sql server 数据库调整,并创建了所有推荐的索引。再次执行视图 15 分钟后,我停止了它。

关于我的查询,您是否可以向我指出一些明显的事情,以进一步优化它并缩短执行时间?

4

1 回答 1

1

我认为您没有使用 CTE 的“通用”方面。尝试首先将 table: millennium_dw_dev..F_ACCESSION_DAILY 放在 CTE 中(如果可能,仅使用必要的字段和记录)。您的代码从该表中选择了 8 次(并且该表是本地的吗?)。

您的其他几个 CTE 被引用一次,但我可以看到一个如何构建在另一个之上。是的,它们可以帮助将复杂的查询分解为更易于管理的部分,但它可能对性能没有帮助。

性能在这里可能不是问题,但是将这些硬编码的日期放入某种假期/休假表中也会有所帮助。拥有一个日期表可能是比所有这些计算更好的途径。

根据数据的大小,将其放入存储过程将允许使用索引临时表。

于 2012-10-30T19:23:37.163 回答