解决问题并找到只有存储过程才能完成的用例,这才是您想要实现的。也许在真正的用例中,存储过程脱颖而出。
如果有所作为,我正在使用MSSQL和Entity Framework。
我在EF知识是有限的,但就我所看到的,EF是(只)像任何其他的ORM; 而幸运的是能够使用原始的SQL。
如果我有两个要点:
一份复杂的报告需要几分钟才能运行(这是Web应用程序中的页面)。我发现我可以编写比LINQ提供的SQL更有效的SQL(只需花费几秒钟即可运行)。
编写报告时,LINQ / EF不足。正如您所注意到的,它SQL
比使用ORM快得多。但这是说支持存储过程还是仅反对对所有内容使用ORM?
您的问题显然可以使用SQL解决。根据您的示例,如果该查询已存储并在代码库中控制版本,则至少没有区别。
一个Web应用程序需要读写一个单独数据库中的几个表,其中包含许多其他与该应用程序无关的敏感信息。我没有给它访问所有内容的权限,而是使用了一个存储过程,该过程仅执行所需的操作,并且仅返回有限的信息。然后,可以只给Web应用程序访问此存储过程的权限,而不能访问任何表等。
同样的事情:一个简单的连接字符串和UPDATE,问题就解决了。这个问题可以解决,甚至有一个ORM:
只需使用一个Web服务在其他数据库前,同compartementalization / 隔离的实现。
所以没什么可看的。
查看其他人提出的一些观点:
您有复杂的工作单元,可能涉及许多表,使用EF的功能无法轻松地将它们包装在事务中。
但是SQL
可以做到。这里没有魔术。
您的数据库不能与EF配合使用
同样:在适当的时候使用EF。
您需要处理与链接服务器跨越服务器边界的数据
我看不到,存储过程如何提供帮助。所以我看不到存储过程的优势;但也许有人对此有所启发。
您有非常复杂的数据检索方案,其中需要“裸机” SQL以确保足够的性能
再次:“ EF的边界”。
您的应用程序对表没有完全的CRUD权限,但是可以允许您的应用程序在服务器信任的安全上下文下运行
好的。我可能会去。
到目前为止,只支持存储过程一半。
也许有性能方面的考虑,这有利于存储过程。
1)存储查询的好处是可以简单地调用存储过程,从而简化了复杂性。由于查询计划者知道查询,因此“轻松”进行优化。但是节省的是当前复杂的查询计划器_minimal。
最重要的是,即使使用即席查询会花费很少的钱,但是如果您的数据结构合理且经过精心索引,则数据库仅仅是应用程序的瓶颈。因此,即使增量较小,但考虑其他因素也可以忽略不计。
2)尽管如此,有人认为将复杂的查询存储在数据库中。有两件事要考虑:
a)复杂的查询大量使用数据库基础结构,这增加了其他每个查询的占用时间。您不能并行运行许多昂贵的查询。这既不赞成也不反对存储过程,但是反对复杂的查询。
b)如果查询仍然需要时间,那么为什么要以低速打扰存储过程呢?
tl; dr
没有什么直接反对存储过程。因此,使用存储过程是可以的-如果它使您满意。
但是,另一方面:我无法想象一个恰当的用例,它可以毫无疑问地向人们讲。
什么时候应该使用存储过程?
正确的答案是:每当您喜欢时。但是还有其他选择。