2016-03-08 38 views
0

選擇查詢了很長一段時間,我有以下函數來執行

CREATE FUNCTION [dbo].[SuiviRupture](@CodeArticle [nvarchar](13),@CodeSite [nvarchar](5) ,@CodeStructure [nvarchar](13)) 
    RETURNS @calcul TABLE 
    (
     [Code Article]  [nvarchar](13), 
     [Code Structure][nvarchar](13) NULL, 
      [Code Site][nvarchar](5) NULL, 
      CAMOY float, 

      QTEMOY float 

    ) 
    AS 
    BEGIN 

    DECLARE @Temp TABLE 
     (
      [datecol] date, 
      [Code Article]  [nvarchar](13), 
      [Prix de vente TTC] [nvarchar](15) NULL, 

      [Code Site][nvarchar](5) NULL, 
      [Code Structure][nvarchar](13) NULL, 
      Quantité float , 
      rn int 
     ); 


insert into @Temp 
    ([datecol],[Code Article],[Prix de vente TTC],[Code Site],[Code Structure],Quantité,rn) 

    select t1.[datecol],t1.[Code Article],t1.[Prix de vente TTC],t1.[Code Site],t1.[Code Structure],t1.Quantité ,rn 
      from [Vente] t1 
      inner join (select distinct [datecol],[Code Article],[Code Structure],[Code Site], 
      row_number() over(Partition by [Code Article],[Code Structure],[Code Site] order by [datecol]desc) as rn 

      from (select distinct [datecol],[Code Article],[Code Structure],[Code Site] 
       from [Vente] t2 
       where promo = 0 
       and ([Code Article] is not null) and ([Code Structure] is not null) and ([Prix de Revient] is not null)and [Code Article]= @CodeArticle and [Code Site][email protected] and [Code Structure][email protected] 
     )g 
      ) a 
       on a.datecol=t1.datecol 
       and t1.[Code Article] = a.[Code Article] 
       and t1.[Code Structure]=a.[Code Structure] 
       and t1.[Code Site]=a.[Code Site] 
       where promo = 0 --and t1.[Code Article]= ' 020130180' 
       and rn <= 28 

     INSERT @calcul 
    select 
      [Code Article] 
      ,[Code Structure] 
      ,[Code Site] 
     , sum(convert(float,Quantité))/count(distinct [datecol]) as QTEMOY 
     , sum(convert(float,[Prix de vente TTC]))/count(distinct [datecol]) AS CAMOY 
    from @Temp 
    where [Code Article]= @CodeArticle and [Code Site][email protected] and [Code Structure][email protected] 
    group by 
      [Code Article],[Code Structure] 
      ,[Code Site] 
    RETURN; 
    END; 


    GO 

當我執行下面的查詢,花了太長的時間,要執行小時 如何優化呢?

select t1.[Code Article],t1.[Code Site],t1.[Code Structure], u.QTEMOY,u.CAMOY 
     from V_distinctVente t1 With(nolock) 
     Cross apply dbo.[SuiviRupture](t1.[Code Article],t1.[Code Site],t1.[Code Structure]) u 
+0

嘗試查看實際執行計劃並查看是否有任何異味。 –

+0

您已經提出了一個可能涉及'V_distinctVente'視圖的問題,但未提供該視圖的定義。因此,除非您提供定義和索引,否則您的問題是無法回答的 –

回答

0

在不知道實際背景的情況下難以複製。你可以把這個查詢放在sql分析器中,並嘗試在那裏進行修改。

0

實際上你使用的函數從來沒有像存儲過程那樣預編譯。使用存儲過程,你可能會提升性能。存儲過程編譯查詢並將結果保存到sql server的執行計劃中。此鏈接可能會幫助link