存储过程VS. F#

时间:2011-02-21 10:51:15

标签: sql database stored-procedures f#

对于大多数SP教学的开发人员,Linq和存储过程/函数之间没有选项。这可能是真的。

然而,现在有一个路口。在我花费太多时间进入F#的语法之前,我想更多关于F#的功率(和相反)位置的输入。

F#如何在此主题上执行(针对SP)?

F#必须以某种方式与数据库通信。通过Linq2Sql / Entity-app-layer或直接通过AnyDbConnection。那里什么新鲜事。但是F#具有并行功能,而且工作开销更少(Functional Programming with C#/F#)。此外,F#还具有作为数据和机器层的效率。非常像C#作为人与机器之间层的力量。

  • 我是否真的仍然让DB Server处理重复节点的请求,或者只是将普通数据提取到F#并在那里处理它?作为来自C#的对象方法调用,封装得很好而且流畅吗?
  • 存储过程是否仍然是扫描50万条记录以查找孤儿或符合结果0.5%的标准的最佳选择?
  • SP或函数是否仍然是查找下一个父节点的简单任务的最佳选择?
  • SP是否仍然最好收集一百万条数据并返回计算的金额和/或期间?

单个责任原则完全构建的单个f#dll库是否更有用,然后存储过程连接在sql server中?当然有利有弊。但他们是什么?

4 个答案:

答案 0 :(得分:3)

存储过程并不神奇超快。通常,它们实际上相当慢。

许多人会对这个答案进行投票,提供轶事证据,证明存储过程一旦使应用程序整体更快。但是,我实际看到的代码中的所有这些示例都表明他们完全重新考虑了一些错误的SQL来将其打包为SP。我认为将错误的SQL重新打包到程序中的规则比SP本身更有帮助。

如果没有测量基准,大多数积分都无法评估。

我建议您执行以下操作。

  1. 将其写入F#。

  2. 测量它。

  3. 如果您的生产应用程序太慢,请尝试一些存储过程以查看它是否更快。如果它对您的生产应用程序足够快,那么您有答案,F#适合您。适合您的应用。对于您的数据。对于您的架构。

  4. 没有“一般”的答案。虽然我对某些特定类型的查询的基准测试表明,与Java相比,SP引擎相当慢。 F#也可能比SP引擎更快。

    重要的是要确保数据库 - 如果它将是“纯”数据 - 已经过优化,以便查询像“扫描50万条记录以查找孤儿或符合0的标准, 5%的结果?“将尽快检索行。这通常涉及调整缓冲区和数组大小以及数据库到F#连接的其他元素。这通常意味着您需要更直接的连接,以便您可以调整大小。

答案 1 :(得分:2)

数据库对于某些任务是有效的(例如,当他们可以使用索引来搜索指定的行时),但如果您需要处理所有行并使用它们(在数据库中)或计算它们,则可能不会比F#快。基于所有数据的一些新结果。

正如S. Lott所说,最好的选择是尝试在F#中实现你需要的东西,你会发现。并行性可以为您带来一些性能优势,特别是如果您正在进行一些计算量很大的计算。但是,您可能仍希望将数据存储在数据库中,加载并在F#中处理它(我相信这就是微软adCenter使用F#的方式)。

可能最重要的一点是数据库为您提供了有关数据一致性的各种保证 - 无论发生什么情况,您仍然会得到一致的状态。自己实现这一点可能很棘手(例如更新数据时),但您需要考虑是否需要它。

答案 2 :(得分:2)

你问这个:

  

存储过程是否仍然是扫描50万条记录以查找孤儿或匹配0.5%结果的标准的最佳选择?

我的问题是'我在sql server中有这个数据。我应该在sql或客户端代码中查询它(在这种情况下是F#)。如果可能的话,这样的查询绝对应该在sql中执行。如果您在F#中进行此操作,则需要将这5000万行传输到客户端,以进行一些聚合/查找。

我希望我能正确理解你的问题。

答案 3 :(得分:1)

据我所知,SP只是意味着您调用了一些预编译的执行计划,您可以通过API调用它,而不是将字符串推送到服务器。这两个保存在毫秒级,不到一秒钟。对于较大的查询,差异可以忽略不计。它们适用于高频率/吞吐量的东西(当然也包含复杂的逻辑,但这似乎并不适用于此)。

因为SP使用了一个预编译的计划,它确实比普通查询慢,因为它不再检查基础数据的统计数据(因为已经编译了执行计划。)因为你提到的条件适用于0.5行的百分比,这可能很重要。

在SP vs F#的讨论中,我会将其重新命名为'on the server'vs'on the client'。如果你说的是更高的数据量(50M行符合条件),我的第一选择就是“将木材放在木头上”,这意味着如果可能的话,在服务器上执行。只有涉及到一些非常复杂的逻辑时,您才可能要考虑F#,但我认为这不适用。然后,我宁愿在服务器上执行该操作,而不是先通过网络拖动所有这些行(可能很慢)。

GJ