将活动行存储在位列中,而不是将逻辑存储在视图中

时间:2018-05-18 19:45:38

标签: sql sql-server query-optimization

我有一个查询,其中多个因素决定了实际的活动行。我是否可以实时执行此操作并且仍然具有高性能,或者是一种通常建议的方法使用位字段的方法,其中指示当前活动字段,索引和查询?

我的实时解决方案涉及视图中的中间步骤(以下示例中的临时表)。因此我关注性能,因为我将不得不处理数十万到数百万条记录。

举例说明:

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

1 个答案:

答案 0 :(得分:0)

性能比你拥有的sql更加微妙。在任何情况下,上面的sql将使用max和temp表副本在组上最快崩溃。这两者在很大程度上取决于表中有多少记录以及sql server上有多少电量(主要是cpu和ram)。如果你复制&#34;数百万&#34;记录到临时表中,大多数标准很可能会很慢。