计算列,或触发更新列,以保持统计
对于每一个用户,我们的应用程序计算的一些统计数据,就像他们在多少次登陆或用了多少的答案错了在智力竞赛中,...它可以是各种东西的。该应用程序的SQL Server和.NET实体框架6.1计算列,或触发更新列,以保持统计
上现在运行的统计数据是按需计算,但随着用户群的扩大,这使得应用程序的报告部分永远慢。
我们想知道或者使用计算列(无论是持久或不持久)或使用触发器来将这些值存储与用户。
你会怎么做呢?在我看来,计算列可能更容易实现,但每当我从表中读取用户时,它们都会重新计算,这可能不会比我们现在所做的更快。由于我们将整个SQL查询放入计算列中,因此坚持列似乎并不合适(SQL Server如何推断它应更新计算?)。 某些行为的触发似乎对我来说更符合逻辑。
为了讨论的方便,假设所有的计算统计count(*)
和其他表中,没有什么比这更有趣的值sum(*)
。
如果你的有来存储计算值,宁愿让SQL引擎为你工作,而不是手动实现这个通过触发器。
所以,这将持续computed column和/或indexed views。
,他们会得到重新计算每次我从表
读取了用户的时间只有当你包括计算列在您的SELECT
(你也没有选择了它要坚持) 。这就是为什么查询通常只需要查询所需列的原因,而不是select *
。但是,由于您使用的是ORM,你可能不能够告诉它不包括昂贵列 - 这就是为什么你应该更喜欢持久性或使用索引视图 - 因此,它的作为,你只加载一个单独的物体进行处理需要的时候。
如何将SQL Server的推断,它应该更新计算?
因为幕后,SQL服务器有效地实现了触发本身。但是,这里的奖金是,这些触发器已经过数百万次测试,并且是您不必编写的代码。
为了讨论的方便,假设所有的计算统计
count(*)
和价值观的sum(*)
其他表
在这种情况下,你真的不能去计算列路线(计算列只有真的应该参考自己的自己行自己的表。有一些古怪的方式,试图绕过此使用UDF的,但我通常会建议反对),所以在这种情况下,我肯定会被建议索引视图。
为了讨论的方便,假设所有的计算统计值,没有什么比这更有趣的计数()和sum()。
由于您的报告操作非常简单,我建议您为这些统计信息报告表/审计日志表。
基本前提是所有的报告可以作为一个简单的查询像
SELECT COUNT(*) FROM tblUserLog (NO LOCK) WHERE UserID=34
的变化或类似
SELECT
COUNT(*) OVER(PARTITION BY colA ORDER BY colB) as Metric1,
SUM(*) OVER (PARTITION BY colD ORDER BY colC) as Metric2
FROM tblUserLog (NO LOCK) WHERE UserID =34
主要问题稍微复杂的查询来获得现在如何填充此表tblUserLog
和应该是什么组成。
组成:
的表的模式应该是通用的,并且必须满足像列的所有报表需要指望或总结上。说一句就行了
LogID (PK, auto increment)
LogDateTimestamp
LogType
UserID
MetricToSum1
MetricToSum2
....
这是比较不规范的表;我不会推荐标准化它。
如何填充:
这绝对不应该被通过触发器实现。寻找最佳可行方案,并假设您的Web应用程序具有良好的分层架构;你应该有一个日志方法,可以插入到DB表中必要的细节异步。所以基本上在桌上写字与主要用户表格CRUD异步发生,并在需要报告时按需阅读 。
对于一个非常简单的操作,我建议你简单地实现一个像主要实体表一样的视图。这种排序的例子是一个视图,它返回说明管理员报告活动用户的数量。
__他们多次登录___:这是一个不断演变的数字,而__如果他们在测验中出错的答案很多,似乎是“测验”完成后的一个静态数字。所以你真的有两种不同的情况,可能需要不同的方法。 – SMor
嘿,谢谢你的评论,但他们只是两个愚蠢的例子。事实上,他们都在不断变化的数字。 –