Errore Intra-query parallelism caused your server command to deadlock

martedì 07 aprile 2009 - 17.19

Teo Profilo | Junior Member


Ciao a tutti,
facendo una select con una funziona dal Query Analizer (SQL 2000),
ricevo questo errore:
Intra-query parallelism caused your server command (process ID #99) to deadlock. Rerun the query without intra-query parallelism by using the query hint option (maxdop 1)
Mai visto prima...
Qualcuno ha qualche suggerimento in merito?

La funzione e' questa:

IF EXISTS (SELECT *
FROM sysobjects
WHERE name = N'Fn_MaxPagMatricola')
DROP FUNCTION Fn_MaxPagMatricola
GO

CREATE FUNCTION Fn_MaxPagMatricola
(@MatrEst VARCHAR(16))

RETURNS DATETIME
AS
BEGIN
DECLARE @DataMaxScad DATETIME

SET @DataMaxScad = (SELECT CASE WHEN MatrEst NOT IN (SELECT MatrEst FROM DocRighe) THEN ''
ELSE
MAX(DtaScadnza) END
FROM DocRighe R (NOLOCK)
JOIN DocRif F (NOLOCK) ON R.IdDoc = F.IdDoc
JOIN DocScad S (NOLOCK) ON R.IdDoc = S.IdDoc
WHERE MatrEst = @MatrEst
GROUP BY MatrInt, MatrEst )

RETURN @DataMaxScad
END

E questa invece e' la banale select che mi da l'errore:

SELECT MatricEst , dbo.Fn_MaxPagMatricola(MatricEst) AS MaxPag FROM SMatricole

Grazie a chi sapra' darmi qualche indicazione... ;-)

lbenaglia Profilo | Guru

>facendo una select con una funziona dal Query Analizer (SQL 2000),
>ricevo questo errore:
>Intra-query parallelism caused your server command (process ID
>#99) to deadlock. Rerun the query without intra-query parallelism
>by using the query hint option (maxdop 1)
>Mai visto prima...
>Qualcuno ha qualche suggerimento in merito?

Ciao Matteo,

Hai un bel deadlock:
http://msdn.microsoft.com/en-us/library/ms177433.aspx

Come si può tentare di minimizzarlo? Scrivendo meglio la query

SET @DataMaxScad = ( SELECT CASE WHEN MatrEst NOT IN (SELECT MatrEst FROM DocRighe) THEN '' ELSE MAX(DtaScadnza) END FROM DocRighe R (NOLOCK) JOIN DocRif F (NOLOCK) ON R.IdDoc = F.IdDoc JOIN DocScad S (NOLOCK) ON R.IdDoc = S.IdDoc WHERE MatrEst = @MatrEst GROUP BY MatrInt, MatrEst )

Io toglierei quel CASE basato su una subquery (che con molta probabilità causa il deadlock visto che poi DocRighe la rimetti in JOIN), tutti quegli HINTS di NOLOCK, e testerei separatamente l'esistenza di MatrEst in DocRighe.
Se esiste eseguo la query con il MAX(DtaScadnza) e le varie JOIN, altrimenti restituirei un banale 0 (e NON '' dato che 0 corrisponde alla base date 19000101).

>Grazie a chi sapra' darmi qualche indicazione... ;-)
Prego.

Ciao!
--
Lorenzo Benaglia
Microsoft MVP - SQL Server
http://blogs.dotnethell.it/lorenzo/
http://italy.mvps.org

Teo Profilo | Junior Member

Ciao Lorenzo,
grazie, sei sempre molto disponibile.
Ho risolto utilizzando una view al posto della funzione.

Mi incuriosisce pero' il tuo suggerimento di togliere i NOLOCK.
Come mai? Hanno un impatto sulle prestazioni?
A me hanno insegnato a metterli per evitare che il gestionale non riesca ad accedere alle tabelle mentre e' in corso l'esecuzione di view o altro.

Grazie 1000,

Matteo

lbenaglia Profilo | Guru

>Mi incuriosisce pero' il tuo suggerimento di togliere i NOLOCK.
>Come mai? Hanno un impatto sulle prestazioni?
No, sulla consistenza delle tue query.
L'hint NOLOCK fa in modo che non vengano messi locks di lettura durante l'esecuzione comando di SELECT, col rischio che altre transazioni ti cambino "sotto il naso" i dati che stai leggendo, introducendo errori logici difficili da individuare.
Paradossalmente non esistendo l'onere da parte del lock manager di gestire gli shared locks, potenzialmente l'esecuzione potrebbe essere più efficiente (a scapito dei dati che estrai).

>A me hanno insegnato a metterli per evitare che il gestionale
>non riesca ad accedere alle tabelle mentre e' in corso l'esecuzione
>di view o altro.
I gli shared locks servono appunto per non permettere ad altre transazioni di acquisire locks esclusivi tipici delle operazioni DML durante l'esecuzione delle letture.
Come già detto se non li metti, rischi di leggere dati incoerenti.

>Grazie 1000,
Prego.

Ciao!
--
Lorenzo Benaglia
Microsoft MVP - SQL Server
http://blogs.dotnethell.it/lorenzo/
http://italy.mvps.org

Teo Profilo | Junior Member

Grazie mille, sei stato chiarissimo.
Buona giornata, ciao.
Partecipa anche tu! Registrati!
Hai bisogno di aiuto ?
Perchè non ti registri subito?

Dopo esserti registrato potrai chiedere
aiuto sul nostro Forum oppure aiutare gli altri

Consulta le Stanze disponibili.

Registrati ora !
Copyright © dotNetHell.it 2002-2025
Running on Windows Server 2008 R2 Standard, SQL Server 2012 & ASP.NET 3.5