【问题标题】:Stored Procedure or calculations via IQueryable?通过 IQueryable 存储过程或计算?
【发布时间】:2011-06-02 02:45:50
【问题描述】:

这是一个基于选择性能而不是设计实践的问题。如果我有一个每秒会执行多次的方法;

public static IQueryable<IPerson> InRadius(this IQueryable<IPerson> query, Coordinate center, double radius)
{
    return (from u in query
            where CallHeavyMathFormula(u, center, radius)
            select u);
}

IQueryable 的这种扩展方法会生成一个 SQL,用于执行一些繁重的数学计算(余弦、正弦等)。这意味着应用程序每次调用都会向服务器发送 1-2KB 的 sql。

我听说将所有应用程序逻辑都放在您的应用程序中。我还想在将来更改为 azure 等数据库或其中一种可扩展的数据库。我该如何处理这样的事情?我应该保持原样还是编写存储过程?像 twitter 或 facebook 这样的应用程序是如何做到的?

【问题讨论】:

    标签: c# database design-patterns architecture


    【解决方案1】:

    存储过程语言往往会将您与特定的供应商或产品紧密联系在一起。如果您预计将来会迁移,请考虑可能需要重写。

    话虽如此,我认为这样的决定取决于其他因素,例如是否需要将大量数据从数据库移到内存中。多少数据;多少内存;电线上来回多少字节?这些是你必须发送的东西。

    每个数据库调用 1-2KB 对我来说听起来并不多。

    我不会考虑计算正弦和余弦重数学。动态 FFT 或线性代数解决方案将更具挑战性。我称之为重的东西不会每秒执行几次。

    在我看来,将这个计算保留在应用程序端是安全的。

    【讨论】:

      【解决方案2】:

      首先,根据使用的数据库,它可能会缓存存储过程和即席查询的执行计划和结果。这应该是使用代码与存储过程的主要原因。您也可以在 sql 中使用 .net 函数,将条件的一部分保留为 .net 代码(太难将条件写为 sql 等) 然后我不会太频繁地访问 db,而是尝试缓存结果。

      在应用程序中同时拥有存储过程(主要用于复杂查询,其中 SP 会带来很大的改进)和通过可查询的临时代码并不是一种“罪恶”。

      使用 sql profiler 还可以帮助您确定最佳解决方案。

      只要您没有在近期计划中迁移到另一个数据库,或者只是“可能发生”,请暂时忽略它,考虑稍后将其作为必要重构的一部分时刻。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2012-12-17
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2015-04-29
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多