Hi,
I have the following table:
CREATE TABLE #MachineMessageLog
(
[ProgID] [INT] NOT NULL,
[MainOperationID] [INT] NULL,
[OperationID] [INT] NULL,
[SeqID] [INT] NOT NULL,
[Timestamp] [DATETIME] NOT NULL,
[TriggerID] [INT] NULL,
[OperationTypeID] [INT] NULL,
[ToolCode] [NVARCHAR](50) NULL,
[ToolGroupNo] [INT] NULL,
[ToolDiameter] [FLOAT] NULL
CONSTRAINT [PK_#MachineMessageLog] PRIMARY KEY CLUSTERED
(
[SeqID] ASC
)
WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) ON [PRIMARY]
) ON [PRIMARY]
CREATE UNIQUE NONCLUSTERED INDEX [IX_#MachineMessageLog_TriggerID_SeqID] ON [#MachineMessageLog]
(
[TriggerID] ASC,
[SeqID] ASC
)WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, SORT_IN_TEMPDB = OFF, IGNORE_DUP_KEY = OFF, DROP_EXISTING = OFF, ONLINE = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) ON [PRIMARY]
and I also the following query:
UPDATE #MachineMessageLog
SET OperationID =
(
SELECT MAX(b.SeqID)
FROM #MachineMessageLog b
WHERE b.TriggerID = 4
AND b.SeqID <= #MachineMessageLog.SeqID
)
I am using this query in a stored procedure in different variation. When I use it with another column (both are not indexed) and TriggerID it works fine.When I use it like this it takes a very long time (minutes). I have executed the query with SET STATISTICS PROFILE ON and the results are:
61258 1 UPDATE #MachineMessageLog SET OperationID = (SELECT MAX(b.SeqID) FROM #MachineMessageLog b WHERE b.TriggerID = 4 AND b.SeqID <= #MachineMessageLog.SeqID )
61258 1 |--Clustered Index Update(OBJECT:([tempdb].[dbo].[#MachineMessageLog]), SET:([#MachineMessageLog].[OperationID] = [Expr1007])) 0 0 |--Compute Scalar(DEFINE:([Expr1007]=[Expr1005]))
61258 1 |--Nested Loops(Inner Join, OUTER REFERENCES:([#MachineMessageLog].[SeqID]))
61258 1 |--Table Spool
61258 1 | |--Top(ROWCOUNT est 0)
61258 1 | |--Clustered Index Scan(OBJECT:([tempdb].[dbo].[#MachineMessageLog]), ORDERED FORWARD)
61258 61258 |--Stream Aggregate(DEFINE:([Expr1005]=MAX(#MachineMessageLog.[SeqID] as [b].[SeqID])))
61256 61258 |--Top(TOP EXPRESSION:((1)))
61256 61258 |--Filter(WHERE:(#MachineMessageLog.[SeqID] as [b].[SeqID]<=[#MachineMessageLog].[SeqID] AND #MachineMessageLog.[TriggerID] as [b].[TriggerID]=(4)))
1876487084 61258 |--Table Spool
61258 1 |--Clustered Index Scan(OBJECT:([tempdb].[dbo].[#MachineMessageLog] AS [b]), ORDERED BACKWARD)
as you can see, the second eager spool is problematic.
So my questions are: 1. what am I doing wrong and how can i improve performance (I've tried order by + top)? 2. how come the same query with different parameters behaves differently?
thanks in adavance for your help?
Sharon.