2016-05-26 16 views
1

顧客が新規であるか既存であるかを評価するより効率的な方法が必要です。新規顧客のための 基準:SQL:階層型(関連する)顧客と新規または既存の顧客タイプを評価

  • お客様、または関連顧客は、私がこれを行うための機能を書き、それが動作を開始日と終了日

間の順序を置いていませんそれは非常に遅いです。私たちは、子供、親、究極の親を持つ階層的な顧客を持っています。私の機能は、特定の顧客の最終的な親を取得し、すべての子を選択し、その子に属するオーダーが開始日と終了日の間にordersテーブルに存在するかどうかを評価することによって機能します。

この関数は、新規顧客に対しては1(真)、既存の顧客に対しては0(偽)を返します。

これを行うより効率的な方法はありますか? 〜3kのレコードで呼び出されたとき、私の関数の実行には約20分かかりました。

機能:

set ansi_nulls on 
go 
set quoted_identifier on 
go 

create function dbo.is_new_customer (
@ultimate_parent_number nvarchar(255), 
@existing_customer_begin_date date, 
@existing_customer_end_date date 
) 
returns int 
as 
begin 
declare @return int 

set @return = (
    case 
     when not exists (
      select 
      t1.customer_number 
      from orders_table as t1 
      inner join (
       select 
       customer_number 
       from customers_table 
       where ultimate_parent_number = @ultimate_parent_number 
      ) as t2 
      on t2.customer_number = t1.customer_number 
      where t1.order_date between @existing_customer_begin_date 
      and @existing_customer_end_date 
     ) 
     then 1 
     else 0 
    end 
) 
return @return 

end 
go 
+0

インラインスカラー関数を呼び出すのではなく、呼び出しクエリの再帰的なCTEに結合する方が効率的です。 –

答えて

0

が、おそらくインデックスhere is how

set ansi_nulls on 
go 
set quoted_identifier on 
go 

create function dbo.is_new_customer (
@ultimate_parent_number nvarchar(255), 
@existing_customer_begin_date date, 
@existing_customer_end_date date 
) 
returns int 
as 
begin 
declare @return int 

set @return = (
    case 
     when not exists (
      select 
      t1.customer_number 
      from 
      (select 
       customer_number 
       from customers_table 
       where ultimate_parent_number = @ultimate_parent_number) as t2 

      cross apply (select * from orders_table as t1 where t2.customer_number = t1.customer_number) as t1 
      where t1.order_date between @existing_customer_begin_date 
      and @existing_customer_end_date 
     ) 
     then 1 
     else 0 
    end 
) 
return @return 

end 
go 
のための勧告を見つけることができます、実際の実行計画を持って管理スタジオを教え、インデックスのチェックも、 cross applyを使用して、このようにそれを試してみてください

これはまた、そのクエリをスピードアップする方法を理解するのに役立ちます。 When should I use Cross Apply over Inner Join?

関連する問題