Please start any new threads on our new
site at https://forums.sqlteam.com. We've got lots of great SQL Server
experts to answer whatever question you can come up with.
| Author |
Topic |
|
Jessica
Starting Member
23 Posts |
Posted - 2007-11-29 : 12:12:49
|
| Please see the attached query. In SQL Server 2000, this query ran in ~1 sec. In SQL Server 2005 it takes 40 seconds!!!! Yikes. I had a look through the execution plan and in 2005 it is bringing back 100,000s of rows where in 2000 it was only find 1 row. The indexes and statistics were all rebuilt on import from 2005 to 2000. I have also run it through the DTA but and applied the suggestions but it didn't make any difference under 2005. Please help.ALTER PROCEDURE [dbo].[spSelectCancelledTitlesByTitleNumber] @titleNumber varchar(13),@cancelledAfter datetime = nullASDeclare @Level smallintDeclare @MaxLevel smallintDeclare @FurtherBreakdown smallintDeclare @SKeyCanCS as uniqueidentifierDeclare @SKeyCanTi as uniqueidentifierDeclare @SKeyCanNP as uniqueidentifierDeclare @NameCanCS as varchar(60)Declare @NameCanTi as varchar(60)Declare @NameCanNP as varchar(60)Select @SKeyCanCS = SKey from ArticleType where HCKey = 'CancelledCondoPlan'Select @SKeyCanTi = SKey from ArticleType where HCKey = 'CancelledTitle'Select @SKeyCanNP = SKey from ArticleType where HCKey = 'CancelledNonPatent'Select @NameCanCS = [Name] from ArticleType where HCKey = 'CancelledCondoPlan'Select @NameCanTi = [Name] from ArticleType where HCKey = 'CancelledTitle'Select @NameCanNP = [Name] from ArticleType where HCKey = 'CancelledNonPatent'Set @Level = 0If substring(@titlenumber,10,1) = '+'and not exists (Select *from ALTA_Staging..vwTITL TITLinner join vwMinLTOXHTOXLINC LTOXHTOXLINC on LTOXHTOXLINC.TITLE_REFRNC_NBR = TITL.DTI_TITLE_REFRNC_NBR where DTI_TITLE_REFRNC_NBR = @titleNumberand DTI_TITLE_STATUS_IND in ('R','V') and (TITL.DTI_EXPIRY_DATE is null or TITL.DTI_EXPIRY_DATE >= @cancelledAfter or @cancelledAfter is null)) beginselect @titlenumber = left(@titlenumber,9) + left('000', 13 - len(@titlenumber)) + substring(@titlenumber,11,999)end Select DistinctTITL.DTI_TITLE_REFRNC_NBR as TITLE_REFRNC_NBR,LTOXHTOXLINC.PROPRTY_PARCEL_ID,LTOXHTOXLINC.LINC_NBR,LTOXHTOXLINC.RIGHTS_IND,LTOXHTOXLINC.NON_PATENT_IND,LTOXHTOXLINC.LINCCount,LTOXHTOXLINC.MUNC_CODE,LTOXHTOXLINC.LTOXHTOX,@Level as Levelinto #TempTITLHist from ALTA_Staging..vwTITL TITLinner join vwMinLTOXHTOXLINC LTOXHTOXLINC on LTOXHTOXLINC.TITLE_REFRNC_NBR = TITL.DTI_TITLE_REFRNC_NBR where DTI_TITLE_REFRNC_NBR = @titleNumberand DTI_TITLE_STATUS_IND in ('R','V') and (TITL.DTI_EXPIRY_DATE is null or TITL.DTI_EXPIRY_DATE >= @cancelledAfter or @cancelledAfter is null)exec sp2SelectCancelledTitlesByTitleNumber @Level, @cancelledAfterSelect @MaxLevel = Max(Level) from #TempTITLHistSelect Level, #TempTITLHist.TITLE_REFRNC_NBR as TitleNumber,min(Case when PROPRTY_PARCEL_ID like '%;CS' then @NameCanCSwhen NON_PATENT_IND = 'N' then @NameCanTiwhen NON_PATENT_IND = 'Y' then @NameCanNPelse nullend) as TitleType, min(LINC_NBR) as LINCNumber,min(LincCount) as LINCCount, min(PROPRTY_PARCEL_ID) as ShortLegalDescription, min(MUNC_CODE) as Municipality,min(PropertyRightsType.[Name]) as RightsType,min(TITL.DTI_CREATE_DATE) as RegistrationDate,min(TITL.DTI_EXPIRY_DATE) as TitleChangeDate,min(#TempTITLHist.TITLE_REFRNC_NBR) as ArticleID,Case when PROPRTY_PARCEL_ID like '%;CS' then @SKeyCanCSwhen NON_PATENT_IND = 'N' then @SKeyCanTiwhen NON_PATENT_IND = 'Y' then @SKeyCanNPelse nullend as ArticleType,Sum(Casewhen Level = @MaxLevel then Case when REFTITL.DTI_EXPIRY_DATE >= @cancelledAfter or (REFTITL.DTI_EXPIRY_DATE is not null and @cancelledAfter is null) then 1else 0end else nullend) as FurtherBreakdownfrom #TempTitlHistInner join ALTA_Staging..vwTITL TITL on TITL.DTI_TITLE_REFRNC_NBR = #TempTITLHist.TITLE_REFRNC_NBRleft outer join ALTA_Staging..vwTITL REFTITL on REFTITL.DTI_TITLE_REFRNC_NBR = TITL.DRE_TITLE_REFRNC_NBRleft outer join Spin_II..PropertyRightsType PropertyRightsType on PropertyRightsType.HCKey = #TempTITLHist.RIGHTS_IND where (LTOXHTOX = 'HTOX' or TITL.DTI_EXPIRY_DATE is not null)and TITL.DTI_TITLE_STATUS_IND in ('R','V') and (TITL.DTI_EXPIRY_DATE >= @cancelledAfter or @cancelledAfter is null)Group by Level, #TempTITLHist.TITLE_REFRNC_NBR,Case when PROPRTY_PARCEL_ID like '%;CS' then @SKeyCanCSwhen NON_PATENT_IND = 'N' then @SKeyCanTiwhen NON_PATENT_IND = 'Y' then @SKeyCanNPelse nullendOrder by Level, #TempTITLHist.TITLE_REFRNC_NBR drop table #TempTITLHist The above stored proc calls sp2SelectCancelledTitlesByTitleNumber. Details of that one are:Declare @NextLevel smallintDeclare @titleNumber varchar(12)-- This is done because it gives better performance than a join to #TempTITLHist -- Works because there is only one title at this level or SP is not executed Select @titleNumber = TITLE_REFRNC_NBR from #TempTITLHist where Level = @LevelSet @NextLevel = @Level + 1Insert into #TempTITLHistSelect TITL.DRE_TITLE_REFRNC_NBR as TITLE_REFRNC_NBR ,LTOXHTOXLINC.PROPRTY_PARCEL_ID,LTOXHTOXLINC.LINC_NBR,LTOXHTOXLINC.RIGHTS_IND,LTOXHTOXLINC.NON_PATENT_IND,LTOXHTOXLINC.LINCCount,LTOXHTOXLINC.MUNC_CODE,LTOXHTOXLINC.LTOXHTOX,@NextLevel as Levelfrom ALTA_Staging..vwTITL TITL inner join vwMinLTOXHTOXLINC LTOXHTOXLINC on LTOXHTOXLINC.TITLE_REFRNC_NBR = TITL.DRE_TITLE_REFRNC_NBR where TITL.DTI_TITLE_REFRNC_NBR = @titleNumber and DTI_TITLE_STATUS_IND in ('R','V') and (TITL.DTI_EXPIRY_DATE is null or TITL.DTI_EXPIRY_DATE >= @cancelledAfter or @cancelledAfter is null)If (Select count(distinct TITLE_REFRNC_NBR) from #TempTITLHist where #TempTITLHist.Level = @NextLevel) = 1 and @NextLevel <= 30 BeginExec sp2SelectCancelledTitlesByTitleNumber @NextLevel, @cancelledAfterEndIt seems to really bog down in this part of the SP:Select TITL.DRE_TITLE_REFRNC_NBR as TITLE_REFRNC_NBR ,LTOXHTOXLINC.PROPRTY_PARCEL_ID,LTOXHTOXLINC.LINC_NBR,LTOXHTOXLINC.RIGHTS_IND,LTOXHTOXLINC.NON_PATENT_IND,LTOXHTOXLINC.LINCCount,LTOXHTOXLINC.MUNC_CODE,LTOXHTOXLINC.LTOXHTOX,@NextLevel as Levelfrom ALTA_Staging..vwTITL TITL inner join vwMinLTOXHTOXLINC LTOXHTOXLINC on LTOXHTOXLINC.TITLE_REFRNC_NBR = TITL.DRE_TITLE_REFRNC_NBR where TITL.DTI_TITLE_REFRNC_NBR = @titleNumber and DTI_TITLE_STATUS_IND in ('R','V') and (TITL.DTI_EXPIRY_DATE is null or TITL.DTI_EXPIRY_DATE >= @cancelledAfter or @cancelledAfter is null)Please help as this is preventing our users from accomplishing certain business functionality!!! Of course. The SQL Server 2005 instance is installed on a server that has more memory and faster processors. The disk is the same between the 2000 instance and the 2005 instance. As well, the load from users is the same. |
|
|
Hommer
Aged Yak Warrior
808 Posts |
Posted - 2007-11-29 : 12:34:23
|
| This sounds pretty dump thou, but does the underlying data between your 2005 and 2000 about the same?Compared getting 1 row in 1 second in 2k vs. getting 100K rows in 40 sec in 2005, I am not sure the problem is in stat/index... |
 |
|
|
Jessica
Starting Member
23 Posts |
Posted - 2007-11-29 : 12:42:22
|
| Yes. The data is exactly the same. It was imported from 2000 to 2000 via backup and restore. |
 |
|
|
Jessica
Starting Member
23 Posts |
Posted - 2007-11-29 : 12:43:54
|
| Actually...let me be more specific on what I mean by Rows returned. The end result in both 2000 and 2005 from the query is 1 row. The difference is in the execution plans. 2000 finds one row in it's index seek and 2005 is find 100,000s of rows in it's index scan. Hopefully that is clearer. |
 |
|
|
Hommer
Aged Yak Warrior
808 Posts |
Posted - 2007-11-29 : 14:54:55
|
| Then I misunderstood your original post.Do these two views have index on the key?ALTA_Staging..vwTITL TITL inner join vwMinLTOXHTOXLINC LTOXHTOXLINC on LTOXHTOXLINC.TITLE_REFRNC_NBR = TITL.DRE_TITLE_REFRNC_NBR Can you post the exec plan on the problematic part? |
 |
|
|
Jessica
Starting Member
23 Posts |
Posted - 2007-11-29 : 15:07:24
|
| vwMinLTOXHTOXLinc:Select TITLE_REFRNC_NBR,LINC_NBR,RIGHTS_IND,NON_PATENT_IND,MUNC_CODE,PROPRTY_PARCEL_ID,LincCount, 'LTOX' as LTOXHTOXfrom vwMinLTOXLINCunion allSelect TITLE_REFRNC_NBR,LINC_NBR,RIGHTS_IND,NON_PATENT_IND,MUNC_CODE,PROPRTY_PARCEL_ID,LincCount, 'HTOX' as LTOXHTOXfrom vwMinHTOXLINCvwMinHTOXLINC:Select DHT_TITLE_REFRNC_NBR as TITLE_REFRNC_NBR,HTXLINC.DHL_LINC_NBR as LINC_NBR,DHL_RIGHTS_IND as RIGHTS_IND,DPR_NON_PATENT_IND as NON_PATENT_IND,DPR_MUNC_CODE MUNC_CODE,DPR_PROPRTY_PARCEL_ID PROPRTY_PARCEL_ID,(Select Count(*) from ALTA_Staging..DB_HTXLINC HTXLINCAWHERE HTXLINCA.F_K_HTXTITL_HTXLINC = HTXLINC.F_K_HTXTITL_HTXLINC) as LincCountfrom ALTA_Staging..DB_HTXLINC HTXLINCinner join ALTA_Staging..DB_HTXTITL HTXTITL on HTXTITL.P_K = HTXLINC.F_K_HTXTITL_HTXLINCleft outer join ALTA_Staging..DB_PROPRTY PROPRTY on PROPRTY.DPR_LINC_NBR = HTXLINC.DHL_LINC_NBR where HTXLINC.DHL_LINC_NBR = (Select Min(DHL_LINC_NBR) FROM ALTA_Staging..DB_HTXLINC HTXLINCB WHERE HTXLINCB.F_K_HTXTITL_HTXLINC = HTXLINC.F_K_HTXTITL_HTXLINC)vwMinLTOXLINC:Select DXT_TITLE_REFRNC_NBR as TITLE_REFRNC_NBR,LTXLINC.DXL_LINC_NBR as LINC_NBR,DXL_RIGHTS_IND as RIGHTS_IND,DPR_NON_PATENT_IND as NON_PATENT_IND,DPR_MUNC_CODE as MUNC_CODE,DPR_PROPRTY_PARCEL_ID as PROPRTY_PARCEL_ID,(Select Count(*) from ALTA_Staging..DB_LTXLINC LTXLINCAWHERE LTXLINCA.F_K_LTXTITL_LTXLINC = LTXLINC.F_K_LTXTITL_LTXLINC) as LincCountfrom ALTA_Staging..DB_LTXLINC LTXLINCinner join ALTA_Staging..DB_LTXTITL LTXTITL on LTXTITL.P_K = LTXLINC.F_K_LTXTITL_LTXLINCleft outer join ALTA_Staging..DB_PROPRTY PROPRTY on PROPRTY.DPR_LINC_NBR = LTXLINC.DXL_LINC_NBR where LTXLINC.DXL_LINC_NBR = (Select Min(DXL_LINC_NBR) FROM ALTA_Staging..DB_LTXLINC LTXLINCB WHERE LTXLINCB.F_K_LTXTITL_LTXLINC = LTXLINC.F_K_LTXTITL_LTXLINC)vwTitl:Select DTI_TITLE_REFRNC_NBR, DTI_TITLE_STATUS_IND,DTI_CREATE_DATE,DTI_EXPIRY_DATE,DRE_TITLE_REFRNC_NBRfrom ALTA_Staging..DB_TITLE TITLE left outer join ALTA_Staging..DB_REFTITL REFTITL on REFTITL.F_K_TITLE_REFTITL = TITLE.P_K I'm not sure how to post the execution plan in a readable format on here....any ideas? |
 |
|
|
evilDBA
Posting Yak Master
155 Posts |
|
|
Jessica
Starting Member
23 Posts |
Posted - 2007-11-29 : 15:34:24
|
| We are running SQL SErver 2005 SP2. |
 |
|
|
|
|
|
|
|