我有一个查询,其中多个因素决定了实际的活动行。我是否可以实时执行此操作并且仍然具有高性能,或者是一种通常建议的方法使用位字段的方法,其中指示当前活动字段,索引和查询?
我的实时解决方案涉及视图中的中间步骤(以下示例中的临时表)。因此我关注性能,因为我将不得不处理数十万到数百万条记录。
举例说明:
DECLARE @grades TABLE (
person int,
grade int,
attempt int,
correction int)
INSERT @grades VALUES (1, 80, 1, 0)
INSERT @grades VALUES (1, 90, 2, 0)
INSERT @grades VALUES (1, 100, 3, 0)
INSERT @grades VALUES (2, 95, 1, 0)
INSERT @grades VALUES (2, 80, 1, 1)
INSERT @grades VALUES (2, 90, 1, 2)
INSERT @grades VALUES (2, 89, 1, 3)
SELECT b.*
INTO #grades_corrected
FROM @grades AS b
RIGHT JOIN (
SELECT person, attempt, MAX(correction) AS last_correction
FROM @grades as b
GROUP BY person, attempt
)
AS last_corrections
ON (b.attempt = last_corrections.attempt
AND b.correction = last_corrections.last_correction
AND b.person = last_corrections.person
)
SELECT g.*
FROM #grades_corrected g
LEFT OUTER JOIN #grades_corrected g2 ON (
g.person = g2.person
AND g.grade < g2.grade)
WHERE g2.grade is null
DROP TABLE #grades_corrected
答案 0 :(得分:0)
性能比你拥有的sql更加微妙。在任何情况下,上面的sql将使用max和temp表副本在组上最快崩溃。这两者在很大程度上取决于表中有多少记录以及sql server上有多少电量(主要是cpu和ram)。如果你复制&#34;数百万&#34;记录到临时表中,大多数标准很可能会很慢。