将活动行存储在位列中与将逻辑存储在视图中

Posted

技术标签:

【中文标题】将活动行存储在位列中与将逻辑存储在视图中【英文标题】:Storing active row in a bit column vs. storing the logic in a view 【发布时间】:2018-05-18 19:45:38 【问题描述】:

我有一个查询,其中多个因素决定了实际的活动行。我可以实时执行此操作并且仍然保持性能,还是使用位字段的方法是通常推荐的方法,其中指示、索引和查询当前活动的字段?

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

举例说明:

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

【问题讨论】:

我不知道你在问什么。 SQL Server 没有“活动”行的概念。 只是我的两分钱:“......我将不得不处理数十万到数百万条记录......” - 也许 SQL Server 不是适合您的情况的数据库。也许您应该考虑升级到 Oracle 或 DB2。一般来说,SQL Server 是一个“部门数据库”;无论如何它都不是高端的。 【参考方案1】:

性能将比您拥有的 sql 更加细微。在任何情况下,您上面的 sql 将通过 max 和 temp 表副本在组中最快地分解。这两者都将在很大程度上取决于表中有多少记录以及您的 sql 服务器上有多少功率(主要是 cpu 和 ram)。如果您将“数百万”条记录复制到临时表中,按照大多数标准,它很可能会很慢。

【讨论】:

以上是关于将活动行存储在位列中与将逻辑存储在视图中的主要内容,如果未能解决你的问题,请参考以下文章

每次调用 Firebase Analytic 的 getInstance() 与将实例存储为 Application 类中的静态变量

oracle逻辑存储结构

如何将通用存储库(或业务逻辑层)注入 ViewModel

ORALCE逻辑存储结构

行逻辑链接的矩阵乘法

如何查询blob类型中存的是啥格式的文件