jeudi 10 septembre 2015

update/insert/select query performance issue

Hi I have a question in sql server

I have 3 tables : 1) Targettable 2) sourcetable 3) sourcetable2 Target table and source table have columns 35 columns and all are varchar datatype Here I want Implement cocncept Incremental concept(scd) type 2 concept in sql server using merge statment.

Source table have records : 3 and half core records few off condition to implement scdtype 2 concept 1) I need fetch sourcetable1 table which are records not avilable sourcetable2 that records only 2)col4,col7,col8,col9,col10,col11 columns frequently change data we need to maintain history and latest

I done like this steps: 1)Handled null/empty values for all columns 2)I Created nonclustered index for col1,col2,col3,col4,col5,col6,col7,col8,col9,col10,col11 Reason for nonclustered index to fetch records fastly 3)I apply merge statment to implement scdtype2 concept.

query look like below:

INSERT INTO Test.[dbo].[targettable]
([col1],[col2],[col3],[col4],col5,col6,col7,col8,col9,col10,col11,col12,col13,col14,col15,col16,
col17,col18,col19,col20,col21,col22,col23,col24,col25,col26,col27,col28,col29,col30,col31,col32,col33
,col34,col35)
    SELECT 
       [col1],[col2],[col3],[col4],col5,col6,col7,col8,col9,col10,col11,col12,col13,col14,col15,col16,
col17,col18,col19,col20,col21,col22,col23,col24,col25,col26,col27,col28,col29,col30,col31,col32,col33
,col34,col35
      ,[Flag],[RecordValidFromDate],[RecordExpiredDate]
  FROM (
  merge   Test.[dbo].[targettable]  target
  using( 
select * from 
 (select [col1],[col2],[col3],[col4],col5,col6,col7,col8,col9,col10,col11,col12,col13,col14,col15,col16,
col17,col18,col19,col20,col21,col22,col23,col24,col25,col26,col27,col28,col29,col30,col31,col32,col33
,col34,col35
,
ROW_NUMBER()over(partition by  col1 order by col5 desc,col6 desc)as rn 
from    Test1.[dbo].[sourcetable] a
where   col2 !='820' and isnull(col3,'') !='')a

where a.rn=1 and not exists 
(select 1 from  Test1.[dbo].[sourcetable2] b where a.col1=b.pcol1)
 ) stag 
on target.[col1]=stag.[col1]
when not matched then
insert ([col1],[col2],[col3],[col4],col5,col6,col7,col8,col9,col10,col11,col12,col13,col14,col15,col16,
         col17,col18,col19,col20,col21,col22,col23,col24,col25,col26,col27,col28,col29,col30,col31,col32,col33
         ,col34,col35,[Flag],[RecordValidFromDate],[RecordExpiredDate]
    )values 
        ( CASE WHEN coalesce(ltrim(rtrim(stag.[col1])),'') = '' THEN 'NA' ELSE ltrim(rtrim(stag.[col1])) END
        ,CASE WHEN coalesce(ltrim(rtrim(stag.col2)),'') = '' THEN '1800-01-01' ELSE ltrim(rtrim(stag.col2)) END
        , CASE WHEN coalesce(ltrim(rtrim(stag.col3)),'') = '' THEN '1800-01-01' ELSE ltrim(rtrim(stag.col3)) END
        ,  CASE WHEN coalesce(ltrim(rtrim(stag.col4)),'')= '' THEN 'NA' ELSE ltrim(rtrim(stag.col4)) END

         ------similary way I done upto 35 columns to hanndel empty and null value for all columns-----------------------------------------
        , CASE WHEN coalesce(ltrim(rtrim(stag.col35)),'') = '' THEN 'NA' ELSE ltrim(rtrim(stag.col35)) END
        ,'1',getdate(),'1800-01-01'
                  )
when matched and target.flag=1 and 
                 (CASE WHEN coalesce(ltrim(rtrim(target.col4)),'') = '' THEN 'NA' ELSE ltrim(rtrim(target.col4)) END
        <>CASE WHEN coalesce(ltrim(rtrim(stag.col4)),'') = '' THEN 'NA' ELSE ltrim(rtrim(stag.col4)) END
        or CASE WHEN coalesce(ltrim(rtrim(target.col7)),'') = '' THEN 'NA' ELSE ltrim(rtrim(target.col7)) END
        <>CASE WHEN coalesce(ltrim(rtrim(stag.col7)),'') = '' THEN 'NA' ELSE ltrim(rtrim(stag.col7)) END
        orCASE WHEN coalesce(ltrim(rtrim(target.col8)),'') = '' THEN 'NA' ELSE ltrim(rtrim(target.col8)) END
        <>CASE WHEN coalesce(ltrim(rtrim(stag.col8)),'') = '' THEN 'NA' ELSE ltrim(rtrim(stag.col8)) END
        or CASE WHEN coalesce(ltrim(rtrim(target.col9)),'') = '' THEN 'NA' ELSE ltrim(rtrim(target.col9)) END
        <>CASE WHEN coalesce(ltrim(rtrim(stag.col9)),'') = '' THEN 'NA' ELSE ltrim(rtrim(stag.col9)) END
        or CASE WHEN coalesce(ltrim(rtrim(target.col10)),'') = '' THEN 'NA' ELSE ltrim(rtrim(target.col10)) END
                <>CASE WHEN coalesce(ltrim(rtrim(stag.col10)),'') = '' THEN 'NA' ELSE ltrim(rtrim(stag.col10)) END
        or  CASE WHEN coalesce(ltrim(rtrim(target.col11)),'') = '' THEN 'NA' ELSE ltrim(rtrim(target.col11)) END
        <> CASE WHEN coalesce(ltrim(rtrim(stag.col11)),'') = '' THEN 'NA' ELSE ltrim(rtrim(stag.col11)) END
                 )
       then update set target.flag='0',target.[RecordExpiredDate]=getdate()
       output $ACTION ACTIONOUT,
       stag.[col1],stag.[col2],stag.[col3],stag.[col4],stag.col5,stag.col6,stag.col7,stag.col8,stag.col9,stag.col10,stag.col11,stag.col12,stag.col13,stag.col14,
stag.col15,stag.col16,
stag.col17,stag.col18,stag.col19,stag.col20,stag.col21,stag.col22,stag.col23,stag.col24,stag.col25,stag.col26,stag.col27,stag.col28,stag.col29,
stag.col30,stag.col31,stag.col32,stag.col33,stag.col34,stag.col35,'1' as flag,getdate() as RecordValidFromDate,'1800-01-01' as [RecordExpiredDate]
       )AS MERGE_OUT
       WHERE MERGE_OUT.ACTIONOUT='UPDATE';

when I ran above query For first time it is executed with in 3 minutes after that I Try to ran 2nd time its taking more than 2 hours and some tim its take 1hour 50 minuts.

coluld please tell me where I need to change query or what step I need to implement above query to give best performance and reduce exectuion time in sql server.

Aucun commentaire:

Enregistrer un commentaire