这是我没有听说过SP的争论。褶皱,温柔的下颚,
由于每次访问数据库服务器都会产生开销,因此我建议将SQL放在SP中的可能原因是嵌入式代码更容易在不影响性能的情况下进行更改。
例如。假设您需要执行返回标量整数的查询A.
然后,之后,需求会发生变化,您可以确定标量的结果是> x然后,只有这时,您需要执行另一个查询。如果您在SP中执行了第一个查询,则可以轻松检查第一个查询的结果,并在同一个SP中有条件地执行第二个SQL。
如何在嵌入式SQL中有效地执行此操作,而不执行单独的查询或不必要的查询?
以下是一个例子:
--This SP may return 1 or two queries.
SELECT @CustCount = COUNT(*) FROM CUSTOMER
IF @CustCount > 10
SELECT * FROM PRODUCT
这可以/在嵌入式SQL中执行此操作的最佳方式是什么?
答案 0 :(得分:7)
答案 1 :(得分:2)
在您提供的示例中,节省的时间是通过网络发送单个标量值和单个后续查询。在任何合理的情况下,这都是微不足道的。这并不是说使用SP可能没有其他有效的性能原因;只是这不是一个原因。
答案 2 :(得分:1)
我通常不会将业务逻辑放在SP中,我希望它们在数据库之外以我的母语选择。我同意SP更好的唯一一次是当有大量数据移动不需要从数据库中出来时。
所以,为了回答你的问题,我宁愿在我的代码中有两个查询,而不是在SP中嵌入,在我看来,我的交易是一个小的性能点击更清楚的东西。
答案 3 :(得分:0)
你将如何有效地做到这一点 嵌入式SQL没有单独执行 查询或不必要的查询?
取决于您使用的数据库。在SQL Server中,这是一个简单的CASE
语句。
答案 4 :(得分:0)
也许在该sproc中包含WHERE子句:
WHERE (all your regular conditions)
AND myScalar > myThreshold
答案 5 :(得分:0)
SP的好处:
缺点:
我的2美分......
关于您的示例,可以这样做:
select * from products where (select count(*) from customers>10)
答案 6 :(得分:0)
最近我更喜欢不使用SP(除非出现uber复杂性,其中proc会更好......或者CLR会更好)。我一直在使用带有LINQ to SQL的Repository模式,其中我的查询在我的数据层中以强类型LINQ表达式编写。这里的关键是查询是强类型的,这意味着当我重构时,我正在重构一个直接从数据库表生成的类的属性(这使得DB的更改一直向前移动超级简单和准确)。虽然我的SQL是为我生成并发送到服务器的,但我仍然可以选择遵循DRY原则,因为存储库模式允许我将其分解为最小的组件。我确实有一个问题,我可能会去服务器,根据查询的结果,我可能会发现我需要再次访问服务器。我不担心这个问题。如果我后来发现它成为一个问题,那么我可以将该代码重构为更高效的代码。这里的全部关键是没有一个魔法子弹。我倾向于使用绿地应用程序,这使我的开发方法最有效。