quote: Originally posted by GilaMonster Can you show us us the update that''s on line 88 of uspFacilitySchedulerUpdateAssign and the select that's on line 8 of uspFacilitySchedulerGetAssignBySchedule. Also the table structure and indexes would be very useful.--Gail ShawSQL Server MVP
Thanks Gail! Here are the update and select statments.UPDATE dbo.fsAssign SET fsDeptID = @fsDeptID, fsStaffID = @fsStaffID, Charge = @Charge, UnscheduledAbsence = @UnscheduledAbsence, fsCancelReasonID = @fsCancelReasonID, CancelComment = @CancelComment, OvertimeShift = @OvertimeShift, CreateDateUTC = @CreateDateUTC, fsNeedID = @fsNeedID, fsNeedStatusID = @fsNeedStatusID, [Date] = @Date, fsDeptShiftID = @fsDeptShiftID, StartTime = @StartTime, EndTime = @EndTime, fsCountTypeID = @fsCountTypeID, fsProductiveID = @fsProductiveID, Approved = @ApprovedWHERE fsAssignID = @fsAssignID AND version = @versionSELECT A.fsAssignID, A.fsDeptID, A.fsStaffID, A.Charge, A.UnscheduledAbsence, A.fsCancelReasonID, A.CancelComment, A.OvertimeShift, A.CreateDateUTC, A.version, A.fsNeedID, A.fsNeedStatusID, A.[Date], A.fsDeptShiftID, A.StartTime, A.EndTime, A.fsCountTypeID, A.fsProductiveID, A.ProviderConfirmed, A.ApprovedFROM dbo.fsAssign AWHERE A.fsDeptID = @fsDeptID AND A.StartTime < @EndTime AND A.EndTime > @StartTime Here is the table structure. I can reproduce the deadlock even if I disable the triggers. Also, in case you're wondering, I use a sequential guid for the primary key so the clustered index doesn't have to be reordered on inserts. Thanks again!CREATE TABLE [dbo].[fsAssign] ( [fsAssignID] uniqueidentifier ROWGUIDCOL NOT NULL , [fsDeptID] [int] NOT NULL , [fsStaffID] [int] NOT NULL , [Charge] [tinyint] NOT NULL , [UnscheduledAbsence] [tinyint] NOT NULL , [fsCancelReasonID] [int] NULL , [CancelComment] [varchar] (50) COLLATE SQL_Latin1_General_CP1_CI_AS NOT NULL , [OvertimeShift] [tinyint] NOT NULL , [CreateDateUTC] [datetime] NULL , [appChanged] [varchar] (50) COLLATE SQL_Latin1_General_CP1_CI_AS NULL , [userChanged] [varchar] (50) COLLATE SQL_Latin1_General_CP1_CI_AS NULL , [version] [timestamp] NULL , [dateChangedUTC] [datetime] NULL , [fsNeedID] [uniqueidentifier] NOT NULL , [fsNeedStatusID] [tinyint] NOT NULL , [fsOrigDeptID] [int] NOT NULL , [Date] [smalldatetime] NOT NULL , [fsDeptShiftID] [int] NULL , [StartTime] [smalldatetime] NOT NULL , [EndTime] [smalldatetime] NOT NULL , [fsCountTypeID] [tinyint] NOT NULL , [fsProductiveID] [tinyint] NOT NULL , [ProviderConfirmed] [tinyint] NOT NULL , [Approved] [tinyint] NOT NULL ) ON [PRIMARY]GOALTER TABLE [dbo].[fsAssign] WITH NOCHECK ADD CONSTRAINT [PK_fsAssign_fsAssignID] PRIMARY KEY CLUSTERED ( [fsAssignID] ) ON [PRIMARY] GO CREATE INDEX [DK_fsAssign_fsDeptIDStartTimeEndTime] ON [dbo].[fsAssign]([fsDeptID], [StartTime], [EndTime]) ON [PRIMARY]GO CREATE INDEX [DK_fsAssign_fsStaffIDStartTimeEndTimefsDeptID] ON [dbo].[fsAssign]([fsStaffID], [StartTime], [EndTime], [fsDeptID]) ON [PRIMARY]GO CREATE INDEX [DK_fsAssign_fsNeedID] ON [dbo].[fsAssign]([fsNeedID]) ON [PRIMARY]GO CREATE INDEX [DK_fsAssign_fsOrigDeptIDStartTimeEndTime] ON [dbo].[fsAssign]([fsOrigDeptID], [StartTime], [EndTime]) ON [PRIMARY]GO CREATE INDEX [DK_fsAssign_fsDeptShiftIDStartTimeEndTime] ON [dbo].[fsAssign]([fsDeptShiftID], [StartTime], [EndTime]) ON [PRIMARY]GOALTER TABLE [dbo].[fsAssign] ADD CONSTRAINT [FK_fsAssign_fsCancelReason_fsCancelReasonID] FOREIGN KEY ( [fsCancelReasonID] ) REFERENCES [dbo].[fsCancelReason] ( [fsCancelReasonID] ) NOT FOR REPLICATION , CONSTRAINT [FK_fsAssign_fsCountType_fsCountTypeID] FOREIGN KEY ( [fsCountTypeID] ) REFERENCES [dbo].[fsCountType] ( [fsCountTypeID] ) NOT FOR REPLICATION , CONSTRAINT [FK_fsAssign_fsDept_fsDeptID] FOREIGN KEY ( [fsDeptID] ) REFERENCES [dbo].[fsDept] ( [fsDeptID] ) NOT FOR REPLICATION , CONSTRAINT [FK_fsAssign_fsDept_fsOrigDeptID] FOREIGN KEY ( [fsOrigDeptID] ) REFERENCES [dbo].[fsDept] ( [fsDeptID] ) NOT FOR REPLICATION , CONSTRAINT [FK_fsAssign_fsDeptShift_fsDeptShiftID] FOREIGN KEY ( [fsDeptShiftID] ) REFERENCES [dbo].[fsDeptShift] ( [fsDeptShiftID] ) NOT FOR REPLICATION , CONSTRAINT [FK_fsAssign_fsNeed_fsNeedID] FOREIGN KEY ( [fsNeedID] ) REFERENCES [dbo].[fsNeed] ( [fsNeedID] ) NOT FOR REPLICATION , CONSTRAINT [FK_fsAssign_fsNeedStatus_fsNeedStatusID] FOREIGN KEY ( [fsNeedStatusID] ) REFERENCES [dbo].[fsNeedStatus] ( [fsNeedStatusID] ) NOT FOR REPLICATION , CONSTRAINT [FK_fsAssign_fsProductive_fsProductiveID] FOREIGN KEY ( [fsProductiveID] ) REFERENCES [dbo].[fsProductive] ( [fsProductiveID] ) NOT FOR REPLICATION , CONSTRAINT [FK_fsAssign_fsStaff_fsStaffID] FOREIGN KEY ( [fsStaffID] ) REFERENCES [dbo].[fsStaff] ( [fsStaffID] ) NOT FOR REPLICATION GOSET QUOTED_IDENTIFIER ON GOSET ANSI_NULLS ON GOCREATE TRIGGER trfsAssign_InsUpd ON dbo.fsAssignFOR INSERT, UPDATE NOT FOR REPLICATIONAS SET NOCOUNT ON UPDATE A SET A.appChanged = dbo.ufnContextApplication(), A.userChanged = dbo.ufnContextUser(), A.dateChangedUTC = GETUTCDATE() FROM dbo.fsAssign A INNER JOIN INSERTED I ON A.fsAssignID = I.fsAssignIDGOCREATE TRIGGER trfsAssign_Pending_Upd ON [dbo].[fsAssign] FOR UPDATENOT FOR REPLICATIONAS SET NOCOUNT ON IF UPDATE([fsNeedStatusID]) BEGIN UPDATE N SET N.Pending = 1 FROM dbo.fsNeed N INNER JOIN inserted I ON N.fsNeedID = I.fsNeedID INNER JOIN deleted D ON N.fsNeedID = D.fsNeedID INNER JOIN dbo.fsAssignFromSrx Srx ON I.fsAssignID = Srx.fsAssignID WHERE I.fsNeedStatusID IN (3,4) -- New status is canceled or no-need AND I.fsNeedStatusID <> D.fsNeedStatusID ENDGOSET QUOTED_IDENTIFIER OFF GOSET ANSI_NULLS ON GO |