我想这个问题以前已经问过了。不幸的是,尽管进行了大量合理的搜索,但我仍未能找到我要查找的问题的实例。
总而言之,问题是:在相当容易做到的情况下,在列中缓存位值,然后在返回数百或数千条记录或进行联接时,将该位值用作select语句的一部分,性能会更好吗?另一个表并查询表中的结果位值?
我有一个名为client的表,然后有一个由clientid链接的名为客户付款的关联表。当用户列出他们所有的客户时(有〜200,000个客户/〜3000个用户),我需要该用户能够查看每个客户是否仍未偿还任何客户付款。那很容易。我目前在选择客户端(正在使用实体框架)时使用它:
return query.Select(ci => new ClientSummary {
[...]
HasFuturePayments = ci.ClientPayments.Any(c=>c.PaidDate==null)
}
那非常简单。并且会正常工作。
但是我可以用另一种方式做到这一点。从性能角度考虑第二种选择是否更好的建议?
当我保存客户付款时,我可以潜在地在客户表中通过添加一个位值来指示将来还需要付款。因此,选择将是这样:
return query.Select(ci => new ClientSummary {
[...]
HasFuturePayments = ci.HasFuturePayments
}
这显然意味着客户端可能有更多的存储空间。我在客户表中有3位值,所以目前只占用一个字节。但这意味着不必为了查找而查询关联的客户付款表。假设任何用户都可能拥有数百甚至数千个客户端(通常一次返回),那么不查询另一张表(作为选择的一部分)的性能改进值得在客户端表中占用额外的空间(假设我们目前有〜200,000,我想几年后会超过500,000)?
对于我来说,从实现的角度来看,这实际上都不重要。我只想提供最快的数据库性能。
希望这很有道理!
谢谢, 斯蒂芬