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 |
|
dyckwal
Yak Posting Veteran
58 Posts |
Posted - 2003-10-10 : 06:44:08
|
| Hello,I have this script that is beginning to take up to much time. So I hope that this can be done faster. Maybe by using a join or update with complex select statemant??? I don't know!All tips are welcome...../*** This is the procedure ***/ALTER PROCEDURE [SP_UpdateSSCCStatus] @LockedNr as intAS/*Used to update a series of SSCC when locking a whole serie*/DECLARE @SSCC varchar(20), @LOCKED_NR int, @LOCKED_CODE tinyintDECLARE SSCC_Cursor CURSOR for SELECT INFO_SSCC.SSCC, INFO_LOCKED.LOCKED_NR, INFO_LOCKED.LOCKED_CODE FROM INFO_LOCKED, INFO_SSCC Where INFO_LOCKED.LOCKED_NR = @LockedNr and (INFO_SSCC.SSCC_STATUS = 1 OR INFO_SSCC.SSCC_STATUS = 5 OR INFO_SSCC.SSCC_STATUS = 6) and INFO_LOCKED.LIJN_NR = INFO_SSCC.LINE_ID AND( (INFO_SSCC.PRODUCTION_DATE >= INFO_LOCKED.START_DATE AND INFO_SSCC.PRODUCTION_DATE <= INFO_LOCKED.END_DATE ) OR (INFO_SSCC.PROD_DATE_LAST >= INFO_LOCKED.START_DATE AND INFO_SSCC.PROD_DATE_LAST <= INFO_LOCKED.END_DATE ) ) order by INFO_SSCC.SSCCOPEN SSCC_CursorFETCH NEXT from SSCC_Cursor into @SSCC, @LOCKED_NR, @LOCKED_CODEWHILE @@FETCH_STATUS = 0BEGIN UPDATE INFO_SSCC SET SSCC_STATUS = @LOCKED_CODE, LOCKED_NR = @LOCKED_NR WHERE SSCC = @SSCC FETCH NEXT from SSCC_Cursor into @SSCC, @LOCKED_NR, @LOCKED_CODEENDCLOSE SSCC_CursorDEALLOCATE SSCC_Cursor/*** End of Procedure ***/There are two tables involved, Info_Locked and Info_SSCC/*** Info tables ***/CREATE TABLE [dbo].[INFO_SSCC] ( [SSCC] [varchar] (20) COLLATE SQL_Latin1_General_CP1_CI_AS NOT NULL , [ITEM_CODE] [varchar] (6) COLLATE SQL_Latin1_General_CP1_CI_AS NULL , [SHIPMENTNR] [int] NULL , [CASECOUNT] [int] NULL , [TOT_WEIGHT_PALLET] [decimal](10, 4) NULL , [BEST_BEFORE_DATE] [datetime] NULL , [PRODUCTION_DATE] [datetime] NULL , [LINE_ID] [varchar] (2) COLLATE SQL_Latin1_General_CP1_CI_AS NULL , [LOG_DATE] [datetime] NULL , [READ_STATUS] [varchar] (20) COLLATE SQL_Latin1_General_CP1_CI_AS NULL , [VERIFIED] [varchar] (1) COLLATE SQL_Latin1_General_CP1_CI_AS NULL , [LANDCODE] [varchar] (4) COLLATE SQL_Latin1_General_CP1_CI_AS NULL , [BESTEMMINGSCODE] [varchar] (4) COLLATE SQL_Latin1_General_CP1_CI_AS NULL , [SSCC_STATUS] [tinyint] NULL , [PROD_DATE_LAST] [datetime] NULL , [LOCKED_NR] [int] NULL , [SHIPPED] [tinyint] NULL , [RECORD_ID] [numeric](18, 0) IDENTITY (1, 1) NOT NULL , [rowguid] uniqueidentifier ROWGUIDCOL NOT NULL ) ON [PRIMARY]GOCREATE TABLE [dbo].[INFO_LOCKED] ( [LOCKED_NR] [int] NOT NULL , [LIJN_NR] [tinyint] NULL , [START_DATE] [datetime] NULL , [END_DATE] [datetime] NULL , [DESCRIPTION] [varchar] (100) COLLATE SQL_Latin1_General_CP1_CI_AS NULL , [LOCKED_CODE] [tinyint] NULL , [SKEPCODE] [varchar] (4) COLLATE SQL_Latin1_General_CP1_CI_AS NULL , [rowguid] uniqueidentifier ROWGUIDCOL NOT NULL ) ON [PRIMARY]GO/*** End info Tables ***/ |
|
|
MakeYourDaddyProud
184 Posts |
Posted - 2003-10-10 : 07:11:44
|
| -- Try thisdeclare @lockednr int -- set your @lockednr variable-- might need a bot of tweakingUPDATE INFO_SSCCSET SSCC_STATUS = A.LOCKED_CODE, LOCKED_NR = A.LOCKED_NRFROM INFO_SSCC IJOIN ( SELECT INFO_SSCC.SSCC, INFO_LOCKED.LOCKED_NR, INFO_LOCKED.LOCKED_CODE FROM INFO_LOCKED, INFO_SSCC Where INFO_LOCKED.LOCKED_NR = @LockedNr and (INFO_SSCC.SSCC_STATUS = 1 OR INFO_SSCC.SSCC_STATUS = 5 OR INFO_SSCC.SSCC_STATUS = 6) and INFO_LOCKED.LIJN_NR = INFO_SSCC.LINE_ID AND( (INFO_SSCC.PRODUCTION_DATE >= INFO_LOCKED.START_DATE AND INFO_SSCC.PRODUCTION_DATE <= INFO_LOCKED.END_DATE ) OR (INFO_SSCC.PROD_DATE_LAST >= INFO_LOCKED.START_DATE AND INFO_SSCC.PROD_DATE_LAST <= INFO_LOCKED.END_DATE ) ) ) as AON A.SSCC = I.SSCCDaniel Small MIAPwww.danielsmall.com IT Factoring |
 |
|
|
raymondpeacock
Constraint Violating Yak Guru
367 Posts |
Posted - 2003-10-10 : 07:14:03
|
| Not sure that you need a cursor to do this, you could really just use an UPDATE statement with the same WHERE clause.Also do you think the reason it is starting to increase the time it takes due to the fact you may be updating records that have already been updated and don't need done again? i.e. where you are setting SSCC_STATUS and LOCKED_NR to the variable values, they may already have those values? To eliminate this, add another WHERE clause along the lines of 'AND SSCS_STATUS <> INFO_LOCKED.LOCKED_CODE AND LOCKED_NR <> INFO_LOCKED.LOCKED_NR'Hope this helpsRaymond |
 |
|
|
SamC
White Water Yakist
3467 Posts |
Posted - 2003-10-10 : 07:24:26
|
| It's early and I haven't had my coffee yet. Here's a WAGUPDATE ASET SSCC_STATUS = @LOCKED_CODE, LOCKED_NR = @LOCKED_NRFROM INFO_SSCC A, INFO_LOCKED BWHERE B.LOCKED_NR = @LockedNrAND (A.SSCC_STATUS IN (1, 5, 6))AND B.LIJN_NR = A.LINE_IDAND( (A.PRODUCTION_DATE >= B.START_DATE AND A.PRODUCTION_DATE <= B.END_DATE )OR (A.PROD_DATE_LAST >= B.START_DATE AND A.PROD_DATE_LAST <= B.END_DATE ) )Don't know about this.Sam |
 |
|
|
dyckwal
Yak Posting Veteran
58 Posts |
Posted - 2003-10-10 : 09:04:59
|
| Thanks guys for the swift response...One of the reasons it is getting slow, could it be the number of records in the table (416656)? |
 |
|
|
SamC
White Water Yakist
3467 Posts |
Posted - 2003-10-10 : 09:07:16
|
| No. That's just a tiny bit of records.I'll bet if you rewrite it as a set-based update, it'll run in a blink of an eye. |
 |
|
|
X002548
Not Just a Number
15586 Posts |
Posted - 2003-10-10 : 14:41:55
|
How does this look? UPDATE s SET SSCC_STATUS = l.LOCKED_CODE , LOCKED_ND = l.LOCKED_CODE FROM INFO_LOCKED lINNER JOIN INFO_SSCC s ON l.LIJN_NR = s.LINE_ID WHERE l.LOCKED_NR = @LockedNr AND s.SSCC_STATUS IN (1, 5, 6) AND( (s.PRODUCTION_DATE >= l.START_DATE AND s.PRODUCTION_DATE <= l.END_DATE ) OR (s.PROD_DATE_LAST >= l.START_DATE AND s.PROD_DATE_LAST <= l.END_DATE ) ) Brett8-) |
 |
|
|
|
|
|
|
|