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 |
|
abacusdotcom
Posting Yak Master
133 Posts |
Posted - 2010-03-03 : 06:54:05
|
Morning Good people,I am having performance issue with following code. Kindly advice how I can optimize the code;with MyCTE (acid ,MAIN_CLASSIFICATION_USER , SUB_CLASSIFICATION_USER , USER_CLASSIFICATION_DATE,RowVersion)AS(select acid, MAIN_CLASSIFICATION_USER, SUB_CLASSIFICATION_USER, USER_CLASSIFICATION_DATE,ROW_NUMBER() OVER(PARTITION BY acid ORDER BY USER_CLASSIFICATION_DATE desc) RowVersionfrom(select -- All loans + Classification acid, MAIN_CLASSIFICATION_USER, SUB_CLASSIFICATION_USER, USER_CLASSIFICATION_DATEfromDBO.dwv_allclassificationexceptselect acid, MAIN_CLASSIFICATION_USER, SUB_CLASSIFICATION_USER, USER_CLASSIFICATION_DATEfrom(selectROW_NUMBER() OVER(PARTITION BY acid ORDER BY USER_CLASSIFICATION_DATE desc) RowVersion, acid, MAIN_CLASSIFICATION_USER, SUB_CLASSIFICATION_USER, USER_CLASSIFICATION_DATEfromDBO.dwv_allclassification)twhereRowVersion = 1and MAIN_CLASSIFICATION_USER = '001')t),MyMiniCTE(acid,MAIN_CLASSIFICATION_USER,SUB_CLASSIFICATION_USER,USER_CLASSIFICATION_DATE,map)as(select b.acid,b.MAIN_CLASSIFICATION_USER,b.SUB_CLASSIFICATION_USER,b.USER_CLASSIFICATION_DATE,case when (b.SUB_CLASSIFICATION_USER > l.SUB_CLASSIFICATION_USER and l.MAIN_CLASSIFICATION_USER = '001') then 1 else 0 end mapfrom MyCTE bLEFT JOIN MyCTE L ON b.acID = L.acIDAND B.RowVersion = L.RowVersion-1),myctemaped(acid,MAIN_CLASSIFICATION_USER,SUB_CLASSIFICATION_USER,USER_CLASSIFICATION_DATE,RowVersion)as(selectacid,MAIN_CLASSIFICATION_USER,SUB_CLASSIFICATION_USER,USER_CLASSIFICATION_DATE,ROW_NUMBER() OVER(PARTITION BY acid ORDER BY USER_CLASSIFICATION_DATE asc) RowVersionfrom MyMiniCTEwhere map = 1),FinalCTE(acid,MAIN_CLASSIFICATION_USER,SUB_CLASSIFICATION_USER,USER_CLASSIFICATION_DATE,USER_CLASSIFICATION_END_DATE)as(selectb.acid,b.MAIN_CLASSIFICATION_USER,b.SUB_CLASSIFICATION_USER,b.USER_CLASSIFICATION_DATE,l.USER_CLASSIFICATION_DATE USER_CLASSIFICATION_END_DATEfrom myctemaped bLEFT JOIN myctemaped L ON b.acID = L.acIDAND B.RowVersion = L.RowVersion-1),FullCTEas(selectb.acid,b.MAIN_CLASSIFICATION_USER,b.SUB_CLASSIFICATION_USER,b.USER_CLASSIFICATION_DATE,USER_CLASSIFICATION_END_DATE = (select max(USER_CLASSIFICATION_DATE) from MyMiniCTE y where map=0 and b.acid=y.acid and y.USER_CLASSIFICATION_DATE between b.USER_CLASSIFICATION_DATE and b.USER_CLASSIFICATION_END_DATE )from FinalCTE b)select * from FullCTE Pls Note:1. The main view DBO.dwv_allclassification contains more than one million records.2. It takes an hour plus for the script to finish executing.Many ThanksI sign for fame not for shame but all the same, I sign my name. |
|
|
webfred
Master Smack Fu Yak Hacker
8781 Posts |
Posted - 2010-03-03 : 07:13:16
|
As I can see "dwv_allclassification" is the only "real" table in your select statement.If you could provide table structure, example data and wanted output thenmaybe it is easier for us to help. No, you're never too old to Yak'n'Roll if you're too young to die. |
 |
|
|
abacusdotcom
Posting Yak Master
133 Posts |
Posted - 2010-03-03 : 08:06:26
|
Many thanks webfred,DBO.dwv_allclassification is actually a viewas d structure is acid varchar(11) MAIN_CLASSIFICATION_USER varchar(5) SUB_CLASSIFICATION_USER varchar(5) USER_CLASSIFICATION_DATE datetimeand sample dataacid MAIN_CLASSIFICATION_USER SUB_CLASSIFICATION_USER USER_CLASSIFICATION_DATELG1080724 002 002 2010-02-25 00:00:00.000LG1080724 002 002 2010-01-29 00:00:00.000YE1141396 002 004 2010-01-08 00:00:00.000LG1080724 001 001 2009-04-30 00:00:00.000LG1080724 002 003 2008-12-31 00:00:00.000LG1080724 002 002 2008-08-29 00:00:00.000LG1080724 001 001 2008-07-31 00:00:00.000LG1080724 002 002 2008-06-30 00:00:00.000LG1080724 001 001 2008-01-04 00:00:00.000YE1141396 001 001 2007-02-01 00:00:00.000 expect outputacid MAIN_CLASSIFICATION_USER SUB_CLASSIFICATION_USER USER_CLASSIFICATION_DATE USER_CLASSIFICATION_END_DATELG1080724 002 002 2008-06-30 00:00:00.000 2008-07-31 00:00:00.000LG1080724 002 002 2008-08-29 00:00:00.000 2008-12-31 00:00:00.000LG1080724 002 002 2010-01-29 00:00:00.000 nullYE1141396 002 004 2010-01-08 00:00:00.000 nullMany ThanksI sign for fame not for shame but all the same, I sign my name. |
 |
|
|
Transact Charlie
Master Smack Fu Yak Hacker
3451 Posts |
Posted - 2010-03-03 : 10:53:52
|
quote: DBO.dwv_allclassification is actually a view
And the code for the view is.......If that view is horrible then you'll want to start there.Charlie===============================================================Msg 3903, Level 16, State 1, Line 1736The ROLLBACK TRANSACTION request has no corresponding BEGIN TRANSACTION |
 |
|
|
abacusdotcom
Posting Yak Master
133 Posts |
Posted - 2010-03-03 : 11:38:25
|
Thanks WebfredLol, and the code for the view isALTER view [dbo].[dwv_allclassification]asWITH MyCTE (acid ,MAIN_CLASSIFICATION_USER , SUB_CLASSIFICATION_USER , USER_CLASSIFICATION_DATE)AS(select B2K_ID acid, MAIN_CLASSIFICATION_USER, SUB_CLASSIFICATION_USER, USER_CLASSIFICATION_DATEfrom(select B2K_ID, MAIN_CLASSIFICATION_USER, SUB_CLASSIFICATION_USER, USER_CLASSIFICATION_DATEfromdbo.SRC_ACHunion allselect B2K_ID, MAIN_CLASSIFICATION_USER, SUB_CLASSIFICATION_USER, USER_CLASSIFICATION_DATEfromdbo.SRC_ACDwhere entity_cre_flg='Y'AND del_flg='N')t )select distinct b.acid , b.MAIN_CLASSIFICATION_USER , b.SUB_CLASSIFICATION_USER , b.USER_CLASSIFICATION_DATE from MyCTE b dbo.SRC_ACH - > History table (count => 1357647 )dbo.SRC_ACD - > Current Table (count => 1331155 )Script runs once in a month, and populates the dbo.SRC_ACH and truncate and insert fresh status in dbo.SRC_ACD.Many thanksI sign for fame not for shame but all the same, I sign my name. |
 |
|
|
Transact Charlie
Master Smack Fu Yak Hacker
3451 Posts |
Posted - 2010-03-03 : 11:55:20
|
OK -- try running the view code standalone; WITH MyCTE ( acid , MAIN_CLASSIFICATION_USER , SUB_CLASSIFICATION_USER , USER_CLASSIFICATION_DATE )AS ( select B2K_ID acid , MAIN_CLASSIFICATION_USER , SUB_CLASSIFICATION_USER , USER_CLASSIFICATION_DATE from ( select B2K_ID , MAIN_CLASSIFICATION_USER , SUB_CLASSIFICATION_USER , USER_CLASSIFICATION_DATE from dbo.SRC_ACH union all select B2K_ID , MAIN_CLASSIFICATION_USER , SUB_CLASSIFICATION_USER , USER_CLASSIFICATION_DATE from dbo.SRC_ACD where entity_cre_flg='Y' AND del_flg='N' ) t )select distinct b.acid , b.MAIN_CLASSIFICATION_USER , b.SUB_CLASSIFICATION_USER , b.USER_CLASSIFICATION_DATE from MyCTE b And take a look at the actual execution plan (cntrl + M) in management studioDo you get good index usage? Any table scans or key lookups?Also do you actually need the DISTINCT? generally that's a good indication that the SELECT statement isn't specific enough. (you are having to discard rows that you shouldn't have brought back in the first place).Charlie===============================================================Msg 3903, Level 16, State 1, Line 1736The ROLLBACK TRANSACTION request has no corresponding BEGIN TRANSACTION |
 |
|
|
abacusdotcom
Posting Yak Master
133 Posts |
Posted - 2010-03-03 : 12:15:27
|
| Yes!! I had good index usage. even the whole query executed for 02.28 mins. This indicate the problem is in my first code.I sign for fame not for shame but all the same, I sign my name. |
 |
|
|
|
|
|
|
|