【发布时间】:2011-06-30 23:58:28
【问题描述】:
我在查询优化方面遇到了困难,目前我非常接近重新设计数据库的点。而stackoverflow是我最后的希望。我认为仅向您显示查询还不够,因此我不仅链接了数据库脚本,还链接了数据库备份,以防您不想手动生成数据
Here你可以找到脚本和备份
当您尝试执行以下操作时,问题就开始了......
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'
这部分出现的主要问题:
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
编辑:这是每个表中的行数:
Spicies 71536
Results 10240
Probes 10240
SpicieBranches 4096
Branches 256
Estimates 5
Generations 1
Versions 1
Objectives 1
【问题讨论】:
-
已经尝试恢复,但没有 R2 unfort。表
Results和Probes分别有多少行? -
我已编辑问题以显示行数
-
SqlServer Profiler 为 CPU/Reads/Writes/Duration 提供大约 6300/500000/670/8100
标签: sql sql-server stored-procedures sql-server-2008-r2 sql-optimization