通过IQueryable存储过程或计算?

时间:2010-12-31 20:42:11

标签: c# database design-patterns architecture

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

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等应用程序如何做到这一点?

2 个答案:

答案 0 :(得分:1)

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

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

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

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

听起来我觉得你可以安全地将这个计算保留在应用程序方面。

答案 1 :(得分:1)

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

在应用程序中存储过程(主要用于复杂查询,SP会产生很大的改进)和ad-hoc代码通过iqueriable,这不是“罪”。

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

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