J'ai du mal avec l'optimisation des requêtes, actuellement je suis très proche de la refonte de la base de données. Et le stackoverflow est mon dernier espoir. Je ne pense pas que juste vous montrer la requête est assez si j'ai lié non seulement le script de base de données, mais aussi la sauvegarde de la base de données jointe au cas où vous ne voulez pas générer les données à la main. scénario et la sauvegardeProcédure stockée très lente
les problèmes commencent lorsque vous essayez de faire ce qui suit ...
exec LockBranches @count=64,@lockedBy='034C0396-5C34-4DDA-8AD5-7E43B373AE5A',@lockedOn='2011-07-01 01:29:43.863',@unlockOn='2011-07-01 01:32:43.863'
les principaux problèmes se produisent dans cette partie:
UPDATE B
SET B.LockedBy = @lockedBy,
B.LockedOn = @lockedOn,
B.UnlockOn = @unlockOn,
B.Complete = 1
FROM
(
SELECT TOP (@count) B.LockedBy, B.LockedOn, B.UnlockOn, B.Complete
FROM Objectives AS O
INNER JOIN Generations AS G ON G.ObjectiveID = O.ID
INNER JOIN Branches AS B ON B.GenerationID = G.ID
INNER JOIN
(
SELECT SB.BranchID AS BranchID, SUM(X.SuitableProbes) AS SuitableProbes
FROM SpicieBranches AS SB
INNER JOIN Probes AS P ON P.SpicieID = SB.SpicieID
INNER JOIN
(
SELECT P.ID, 1 AS SuitableProbes
FROM Probes AS P
/* ----> */ INNER JOIN Results AS R ON P.ID = R.ProbeID /* SSMS Estimated execution plan says this operation is the roughest */
GROUP BY P.ID
HAVING COUNT(R.ID) > 0
) AS X ON P.ID = X.ID
GROUP BY SB.BranchID
) AS X ON X.BranchID = B.ID
WHERE
(O.Active = 1)
AND (B.Sealed = 0)
AND (B.GenerationNo < O.BranchGenerations)
AND (B.LockedBy IS NULL OR DATEDIFF(SECOND, B.UnlockOn, GETDATE()) > 0)
AND (B.Complete = 1 OR X.SuitableProbes = O.BranchSize * O.EstimateCount * O.ProbeCount)
) AS B
EDIT: Voici les montants des lignes dans chaque table:
Spicies 71536
Results 10240
Probes 10240
SpicieBranches 4096
Branches 256
Estimates 5
Generations 1
Versions 1
Objectives 1
J'ai essayé de restaurer, mais je n'ai pas R2 malchance. Combien de lignes dans les tableaux 'Results' et' Probes' respectivement? –
J'ai édité la question pour montrer le nombre de lignes – Lu4
SqlServer Profiler donne pour CPU/Reads/Writes/Duration autour de 6300/500000/670/8100 – Lu4