| Author |
Topic |
|
MontyMagic
Starting Member
12 Posts |
Posted - 2011-09-20 : 10:59:09
|
| Hi Guys,Once again thank you for all your help with my previous posts about specific slow cursors, your answers are excellent and using approaches that I wouldnt have thought of. I am trying to understand them in isolation to improve my knowledge, but that will have to take a back seat until I can finish speeding up this application.My slowwwwwww cursor is as follows. I would appreciate your continued assistance if possible with any suggestions, comments or examples that you may offer.Once again thanks.Cursor Below:DECLARE @ACCOUNTID varchar (20)DECLARE @CONTACTID varchar(20)DECLARE @SOURCEACCID varchar(24)DECLARE @DESTACCID varchar (24)DECLARE @BRANCHID varchar (20)DECLARE @TYPE varchar (12)DECLARE @PREFIX01 varchar (12)DECLARE @PREFIX02 varchar (12)DECLARE @PREFIX03 varchar (12)DECLARE @PREFIX04 varchar (12)DECLARE @PREFIX05 varchar (50)DECLARE @FNAME01 varchar (64)DECLARE @FNAME02 varchar (64)DECLARE @FNAME03 varchar (64)DECLARE @FNAME04 varchar (64)DECLARE @FNAME05 varchar (64)DECLARE @FNAME06 varchar (8)DECLARE @SNAME01 varchar (64)DECLARE @SNAME02 varchar (64)DECLARE @SNAME03 varchar (64)DECLARE @SNAME04 varchar (64)DECLARE @SNAME05 varchar (64)/**********************************//*** THIS IS LEVEL 1 ACC MATCH ***//**********************************/DECLARE c1 CURSOR READ_ONLY FORSELECT CONSOURCE1.MASTERSOURCEACCID_LEV1 as ACCOUNTID, CONSOURCE1.RECORDID as SOURCEID,CONSOURCE1.SOURCECONID as SOURCEBRANCHID, 'Prospect' as SOURCERATING,PREFIX01,PREFIX02,PREFIX03,PREFIX04,PREFIX05,FNAME01,FNAME02,FNAME03,FNAME04,FNAME05,FNAME06,SNAME01,SNAME02,SNAME03,SNAME04,SNAME05from con CONSOURCE1inner join C_MATCH C_MATCH1 on CONSOURCE1.recordid = C_MATCH1.CONTACTIDinner join ADD_MATCH ADD_MATCH1 on CONSOURCE1.RECORDID = ADD_MATCH1.BRANCHID and 'CONTACT' = ADD_MATCH1.TYPEOPEN c1FETCH NEXT FROM c1 into @ACCOUNTID, @CONTACTID, @BRANCHID, @TYPE,@PREFIX01, @PREFIX02, @PREFIX03, @PREFIX04, @PREFIX05,@FNAME01, @FNAME02, @FNAME03, @FNAME04, @FNAME05, @FNAME06,@SNAME01, @SNAME02, @SNAME03, @SNAME04, @SNAME05WHILE @@FETCH_STATUS = 0BEGIN/*** PUT CODE HERE TO MATCH UP ***/insert into C_SCORE (SOURCEID,SOURCEBRANCHID,SOURCERATING,TARGETID,TARGETACCID,MASTERSOURCEACCID_LEV)select @CONTACTID,@BRANCHID,@TYPE,CONTACT2.RECORDID,CONTACT2.MASTERSOURCEACCID_LEV1,1from con CONTACT2inner join C_MATCH C_MATCH2 on CONTACT2.recordid = C_MATCH2.CONTACTIDwhere/*** THERE HAS TO BE AT LEAST AN ACCOUNT NAME MATCH MATCH ***/(CONTACT2.MASTERSOURCEACCID_LEV1 = @ACCOUNTIDandCONTACT2.RECORDID <> @CONTACTIDand/*** AND THERE HAS TO BE AT LEAST A FIRST OR LAST NAME MATCH ***/(IsNull(@FNAME01,'') <> '' and @FNAME01 = C_MATCH2.FNAME01))FETCH NEXT FROM c1 into @ACCOUNTID,@CONTACTID, @BRANCHID, @TYPE,@PREFIX01, @PREFIX02, @PREFIX03, @PREFIX04, @PREFIX05,@FNAME01, @FNAME02, @FNAME03, @FNAME04, @FNAME05, @FNAME06,@SNAME01, @SNAME02, @SNAME03, @SNAME04, @SNAME05ENDCLOSE c1DEALLOCATE c1/**********************************//*** THIS IS LEVEL 2 ACCC MATCH ***//**********************************/DECLARE c2 CURSOR READ_ONLY FORSELECT CONSOURCE1.MASTERSOURCEACCID_LEV2 as ACCOUNTID, CONSOURCE1.RECORDID as SOURCEID,CONSOURCE1.SOURCECONID as SOURCEBRANCHID, 'Prospect' as SOURCERATING,PREFIX01,PREFIX02,PREFIX03,PREFIX04,PREFIX05,FNAME01,FNAME02,FNAME03,FNAME04,FNAME05,FNAME06,SNAME01,SNAME02,SNAME03,SNAME04,SNAME05from con CONSOURCE1inner join C_MATCH C_MATCH1 on CONSOURCE1.recordid = C_MATCH1.CONTACTIDinner join ADD_MATCH ADD_MATCH1 on CONSOURCE1.RECORDID = ADD_MATCH1.BRANCHID and 'CONTACT' = ADD_MATCH1.TYPEwhereMASTERSOURCEACCID_LEV2 <> MASTERSOURCEACCID_LEV1OPEN c2FETCH NEXT FROM c2 into @ACCOUNTID, @CONTACTID, @BRANCHID, @TYPE,@PREFIX01, @PREFIX02, @PREFIX03, @PREFIX04, @PREFIX05,@FNAME01, @FNAME02, @FNAME03, @FNAME04, @FNAME05, @FNAME06,@SNAME01, @SNAME02, @SNAME03, @SNAME04, @SNAME05WHILE @@FETCH_STATUS = 0BEGIN/*** PUT CODE HERE TO MATCH UP ***/insert into C_SCORE (SOURCEID,SOURCEBRANCHID,SOURCERATING,TARGETID,TARGETACCID,MASTERSOURCEACCID_LEV)select @CONTACTID,@BRANCHID,@TYPE,CONTACT2.RECORDID,CONTACT2.MASTERSOURCEACCID_LEV2,2from con CONTACT2inner join C_MATCH C_MATCH2 on CONTACT2.recordid = C_MATCH2.CONTACTIDwhere/*** THERE HAS TO BE AT LEAST AN ACCOUNT NAME MATCH MATCH ***/(CONTACT2.MASTERSOURCEACCID_LEV2 = @ACCOUNTIDandCONTACT2.RECORDID <> @CONTACTIDand/*** AND THERE HAS TO BE AT LEAST A FIRST OR LAST NAME MATCH ***/(IsNull(@FNAME01,'') <> '' and @FNAME01 = C_MATCH2.FNAME01))FETCH NEXT FROM c2 into @ACCOUNTID,@CONTACTID, @BRANCHID, @TYPE,@PREFIX01, @PREFIX02, @PREFIX03, @PREFIX04, @PREFIX05,@FNAME01, @FNAME02, @FNAME03, @FNAME04, @FNAME05, @FNAME06,@SNAME01, @SNAME02, @SNAME03, @SNAME04, @SNAME05ENDCLOSE c2DEALLOCATE c2/**********************************//*** THIS IS LEVEL 3 ACCC MATCH ***//**********************************/DECLARE c3 CURSOR READ_ONLY FORSELECT CONSOURCE1.MASTERSOURCEACCID_LEV3 as ACCOUNTID, CONSOURCE1.RECORDID as SOURCEID,CONSOURCE1.SOURCECONID as SOURCEBRANCHID, 'Prospect' as SOURCERATING,PREFIX01,PREFIX02,PREFIX03,PREFIX04,PREFIX05,FNAME01,FNAME02,FNAME03,FNAME04,FNAME05,FNAME06,SNAME01,SNAME02,SNAME03,SNAME04,SNAME05from con CONSOURCE1inner join C_MATCH C_MATCH1 on CONSOURCE1.recordid = C_MATCH1.CONTACTIDinner join ADD_MATCH ADD_MATCH1 on CONSOURCE1.RECORDID = ADD_MATCH1.BRANCHID and 'CONTACT' = ADD_MATCH1.TYPEwhereMASTERSOURCEACCID_LEV3 <> MASTERSOURCEACCID_LEV2andMASTERSOURCEACCID_LEV3 <> MASTERSOURCEACCID_LEV1OPEN c3FETCH NEXT FROM c3 into @ACCOUNTID, @CONTACTID, @BRANCHID, @TYPE,@PREFIX01, @PREFIX02, @PREFIX03, @PREFIX04, @PREFIX05,@FNAME01, @FNAME02, @FNAME03, @FNAME04, @FNAME05, @FNAME06,@SNAME01, @SNAME02, @SNAME03, @SNAME04, @SNAME05WHILE @@FETCH_STATUS = 0BEGIN/*** PUT CODE HERE TO MATCH UP ***/insert into C_SCORE (SOURCEID,SOURCEBRANCHID,SOURCERATING,TARGETID,TARGETACCID,MASTERSOURCEACCID_LEV)select @CONTACTID,@BRANCHID,@TYPE,CONTACT2.RECORDID,CONTACT2.MASTERSOURCEACCID_LEV3,3from con CONTACT2inner join C_MATCH C_MATCH2 on CONTACT2.recordid = C_MATCH2.CONTACTIDwhere/*** THERE HAS TO BE AT LEAST AN ACCOUNT NAME MATCH MATCH ***/(CONTACT2.MASTERSOURCEACCID_LEV3 = @ACCOUNTIDandCONTACT2.RECORDID <> @CONTACTIDand/*** AND THERE HAS TO BE AT LEAST A FIRST OR LAST NAME MATCH ***/(IsNull(@FNAME01,'') <> '' and @FNAME01 = C_MATCH2.FNAME01))FETCH NEXT FROM c3 into @ACCOUNTID,@CONTACTID, @BRANCHID, @TYPE,@PREFIX01, @PREFIX02, @PREFIX03, @PREFIX04, @PREFIX05,@FNAME01, @FNAME02, @FNAME03, @FNAME04, @FNAME05, @FNAME06,@SNAME01, @SNAME02, @SNAME03, @SNAME04, @SNAME05ENDCLOSE c3DEALLOCATE c3Every Day's a School Day |
|
|
visakh16
Very Important crosS Applying yaK Herder
52326 Posts |
Posted - 2011-09-20 : 11:02:24
|
| would be much better if you can explain your scenario using sample data and required output rather than posting whole query here.------------------------------------------------------------------------------------------------------SQL Server MVPhttp://visakhm.blogspot.com/ |
 |
|
|
MontyMagic
Starting Member
12 Posts |
Posted - 2011-09-20 : 11:27:59
|
| Hi visakh16,Thank you for your suggestion, I totally agree that it must be a nightmare to understand. To clarify my position I am not the DBA that wrote this code, he unfortunately has left and left us with a slow application and very little in the way of commented code. I am struggling to understand exactly what these stored procedures are doing, so its very difficult for me to understand how to rewrite or how to explain them. As far as I am able to understand this code is designed to compare fields from the source table against the target table to identify potential matches. It then inserts these into the C_SCORE table where a later procedure will identify real matching records based upon the number of fields/items that have matched and their importance. For example the FNAME field is FirstName and has 6 entries for matching FNAME01, FNAME02, etc... These contain the following:FNAME01 = FIRSTNAME(complete), FNAME02 = SOUNDEX of FIRSTNAME, FNAME03 = METAPHONE of FIRSTNAME, FNAME04 = NORMALISED VERSION OF FIRSTNAME (e.g. ROBERT, BOBBY, ROB, ROBBIE etc all go to BOB), FNAME05 is the LEFT CHAR 1 of FIRSTNAME, FNAME06 is the LEFT CHAR1 of the normalised firstname.We cross compare these to idenify all potential matches in firstname, the apporach is similar for surname etc.I am sorry that I am unable to explain more as to what exactly this code is supposed to do, as I am struggling to understand more myself.I greatly appreciate any help you can give. Once again thank you for your time...MontyPS. If it helps, I believe that the LEV 1, 2, 3 is the level of confidence we have in the matching, e.g. 1 is a tight match, 2 is a normal match and 3 is a very fuzzy match. I believe these are selected based upon the types of fields that match, e.g. a FNAME01 exact match is better than a FNAME06 normalised initials match etc...I am sorry I don't understand more at this stage.Every Day's a School Day |
 |
|
|
MontyMagic
Starting Member
12 Posts |
Posted - 2011-09-21 : 03:28:26
|
| Hi Guys,Did anyone have any thoughts on how I can replace the cursor on this query?I am struggling somewhat and would greatly appreciate any help available.ThanksMontyEvery Day's a School Day |
 |
|
|
|
|
|