Ich habe Probleme mit der Abfrageoptimierung, derzeit bin ich sehr nahe am Punkt der Neugestaltung der Datenbank. Und stackoverflow ist meine letzte Hoffnung. Ich glaube nicht, dass es ausreicht, Ihnen nur die Abfrage zu zeigen, daher habe ich nicht nur das Datenbankskript verlinkt, sondern auch das Datenbank-Backup angehängt, falls Sie die Daten nicht manuell generieren möchten
Hier finden Sie sowohl das Skript als auch das Backup
Die Probleme beginnen, wenn Sie versuchen, Folgendes zu tun...
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'
Die Hauptprobleme treten in diesem Abschnitt auf:
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: Hier sind die Mengen an Zeilen in jeder Tabelle:
Spicies 71536
Results 10240
Probes 10240
SpicieBranches 4096
Branches 256
Estimates 5
Generations 1
Versions 1
Objectives 1
0 Stimmen
Habe versucht, wiederherzustellen, aber leider kein R2. Wie viele Zeilen gibt es in den Tabellen
Results
undProbes
jeweils?0 Stimmen
Ich habe die Frage bearbeitet, um die Anzahl der Zeilen anzuzeigen.
0 Stimmen
SqlServer Profiler gibt für CPU/Reads/Writes/Duration etwa 6300/500000/670/8100.