HI All,
I have a slow running WITH clause query that hope some query HINTS or something else? may improve.
The Code below puts £Income into £Buckets of Capital & interest.
As the subsets of Bucket & Income data grows the query exponentially increases in runtime.
By reviewing the query below - can someone think of a method to speed the query?
Many thanks
;with bucket as ( SELECT vdrse.RowID ,vdrse.DealID as bucketDealID ,vdrse.repayment_date ,vdrse.RepaymentAmount as bucketAmount ,vdrse.payment_seqID as BucketSeqID ,vdrse.sum_of_payments as BukRunSum ,vdrse.interest_on_repayment ,vdrse.int_perc_split ,vdrse.principle_on_repayment ,vdrse.princ_perc_split ,vdrse.RowInsertDateTime ,vdrse.tDealsRepaymentsScheduleEditTS FROM vwDealsRepaymentsScheduleEdit AS vdrse INNER JOIN vwDealsRepayment AS vdr ON vdrse.DealID = vdr.DealID WHERE (vdr.AccMgdFlag = 1) ),incoming as ( SELECT [RowID] ,[DealID] as incomeDealID ,[repayment_date] ,[RepaymentAmount] as IncomingAmount ,[payment_seqID] as IncomingSeqID ,[sum_of_payments] as ActPayRunSum ,[tDealsRepaymentsActualTS] FROM [FedCapDB].[dbo].[vwDealsRepaymentsActual] ),result as ( select i.[RowID],i.[repayment_date],bucketDealID,IncomingSeqID,BucketSeqID,int_perc_split,princ_perc_split ,case when bucketAmount<IncomingAmount then 0 else bucketAmount-IncomingAmount end bucketAmount ,case when bucketAmount>IncomingAmount then 0 else IncomingAmount-bucketAmount end IncomingAmount ,case when bucketAmount>IncomingAmount then IncomingAmount else bucketAmount end InBucket from bucket b inner join incoming i on i.incomeDealID=b.bucketDealID and i.IncomingSeqID=1 where b.BucketSeqID=1 union all select [RowID],[repayment_date],bucketDealID,IncomingSeqID,BucketSeqID,int_perc_split,princ_perc_split ,case when bucketAmount<IncomingAmount then 0 else bucketAmount-IncomingAmount end bucketAmount ,case when bucketAmount>IncomingAmount then 0 else IncomingAmount-bucketAmount end IncomingAmount ,case when bucketAmount>IncomingAmount then IncomingAmount else bucketAmount end InBucket from ( select i.[RowID],i.[repayment_date],b.bucketDealID,i.IncomingSeqID,b.BucketSeqID,b.int_perc_split,b.princ_perc_split ,case when r.BucketSeqID=b.BucketSeqID then r.bucketAmount else b.bucketAmount end bucketAmount ,case when r.IncomingSeqID=i.IncomingSeqID then r.IncomingAmount else i.IncomingAmount end IncomingAmount from result r inner join bucket b on b.bucketDealID=r.bucketDealID and b.BucketSeqID=r.BucketSeqID+(case when r.bucketAmount=0 then 1 else 0 end) inner join incoming i on i.incomeDealID=r.bucketDealID and i.IncomingSeqID=r.IncomingSeqID+(case when r.IncomingAmount=0 then 1 else 0 end) ) Prev ) SELECT bucketDealID as DealID ,IncomingSeqID as DealRepayID ,BucketSeqID as DealRepayBucketID ,[RowID] as [DealsRepaymentsActual_RowID] ,[repayment_date] as [paid_date] ,InBucket AS AmountBucket ,int_perc_split ,princ_perc_split --,int_perc_split * InBucket as int_amt_bck --,princ_perc_split * InBucket as int_amt_bck ,ROUND((int_perc_split * InBucket),2) AS int_amount_bucket ,ROUND((princ_perc_split * InBucket),2) AS princ_amount_bucket ,ROUND((int_perc_split * InBucket),2) + ROUND((princ_perc_split * InBucket),2) as check_sum --should = AmountBucket FROM result r ORDER BY bucketDealID ,IncomingSeqID ,BucketSeqID