存储过程或批量声明

时间:2011-03-29 01:00:40

标签: c# asp.net sql sql-server ado.net

故事是我需要优化我的数据库访问。

现在我需要从6个不同的表中检索相关数据。我在这些方面总结了人们的建议:

  1. 使用相同的连接 不同的命令仍然支付 使用每个命令访问数据库 执行

  2. 存储过程是一种很好的方法 有超过选择声明 (不使用联接)从多个表中进行选择,只需访问一次数据库

  3. 数据库上实际负载的来源是与它的连接,而不是数据的数量(数量仍会影响性能,但N连接是一个更大的因素)。

  4. 现在我想拥有多个SELECT语句,并且建议多了以上几点我认为我应该使用Stored Procedure选项。但我想到了使用批处理SELECT语句而不是

    示例:SELECT e FROM p; SELECT x,y,z FROM t; SELECT ....; SELECT ....;

    这是否会导致单次访问数据库作为存储过程? 你怎么看我的选择?

    ..感谢您提前的时间:)

3 个答案:

答案 0 :(得分:1)

您没有提及有关索引的任何内容。从那里开始,因为在select语句中包含6个表并不是很多。根据需要排除不必要的列并过滤行。查看执行计划并查看成本最高的内容(还有很多其他要查找的内容。Start Here)如果返回的结果不相关,则可以在存储过程中作为单独的查询运行。

通过数据库引擎优化顾问运行它,让SQL Server获得许可费用。

让存储过程返回多个查询可能不是一个理想的解决方案:Any SQL Server multiple-recordset stored procedure gotchas?

尝试管理用户对要提取的数据量的期望。我有一些用户,因为他们绝对必须拥有一个拥有200多个字段的单个数据集。他们发誓表演永远不会成为问题;时代变了。

答案 1 :(得分:1)

  

这是否会导致单次访问数据库作为存储过程?你怎么看我的选择?

回答您的问题:唯一的区别是您将整个查询而不仅仅是存储的proc名称传输到数据库服务器。除非您的查询长度为几MB或每秒执行几千次,否则在性能方面不应有任何差异。

答案 2 :(得分:0)

我看了你的另一个问题。

采用这两种方法是合理的。

在某些应用程序中,有多个连接是合理的,每个连接都并行提取数据(您可以使用异步方法在ADO.NET中执行此操作)以在表单或网页上显示。

但是,在您的情况下,对于您的模型,您必须询问您对数据的处理方式?模特很好。编写连接所有表的查询也没问题。但在一对多的关系中,你期待什么?您是否希望填充一位家长,然后是一群孩子?此时,您已经离开了行和列的世界,并且您有一个对象模型。这就是实体框架或NHibernate或自定义代码之类的东西 - 将您的良好数据库设计转换为可在应用程序中很好地使用的对象模型。