【问题标题】:Stored Procedure or Bulk Statements存储过程或批量语句
【发布时间】:2011-03-29 01:00:39
【问题描述】:

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

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

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

  2. 存储过程是一个很好的方法 有多个 select 语句 (不使用连接)从多个表中进行选择并且只对数据库进行一次访问

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

现在我想拥有多个 SELECT 语句,并且按照建议以及以上几点,我认为我应该使用存储过程选项。但我想到了使用批处理 SELECT 语句来代替

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

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

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

【问题讨论】:

  • 为什么不在存储过程中使用 JOIN?这很常见。
  • 删除重复项需要大量代码(循环和 if 语句).. 我希望您参考我的旧问题并检查答案中的 Join 语句.. 也许我正在关注糟糕的书面声明! stackoverflow.com/questions/4391933/…

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


【解决方案1】:

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

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

【讨论】:

  • 因此,两者都将访问数据库一次,并且两种方法都将产生相同的性能,但差异很小,不会被注意到。但是对于繁重和频繁操作的存储过程是要走的路吗? ...我说对了吗?
【解决方案2】:

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

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

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

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

【讨论】:

  • 实际上我需要我选择的所有列。我认为数据库设计会导致重复的行。当然,这不是完全重复的,但例如我有 2 个表(项目和类别,其中一个项目可能有多个类别).. 连接查询将不会导致位于 Cat1 和 Cat2 中的 Item1 的 2 行。 . 我希望你明白这一点,这是我的数据库的示例设计和建议的 JOIN 查询:stackoverflow.com/questions/4391933/… .. 非常感谢 =)
【解决方案3】:

我看了你的另一个问题。

有两种方法是合理的。

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

但是,在您的情况下,对于您的模型,您必须询问您对数据做了什么?模型很好。编写一个连接所有表的查询也很好。但是在一对多的关系中,你期待什么?您是否期望填充一个父级,然后填充一组子级?至此,您已经离开了行和列的世界,并且拥有了一个对象模型。这就是 Entity Framework 或 NHibernate 或自定义代码之类的东西发挥作用的地方 - 将您良好的数据库设计转换为可以在应用程序中很好使用的对象模型。

【讨论】:

  • 1- 我如何决定何时使用多个连接是合理的? 2- 我正在显示一个特定的孩子个人资料,一对多和多对多将使用中继器来显示它们。 3- 这里的主要项目不是孩子,所以我需要填写孩子的所有信息并将他的父母作为一条信息。 4- 如果你注意到了,我被告知要经常使用 LinqToSql 和 NHibernate,我想我可能会选择 NHibernate(但我认为我的应用程序现在没有它们可以做得更多,因为我按计划进行,但我会一定要学 NH)。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2010-12-29
  • 1970-01-01
  • 2019-02-27
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-03-05
相关资源
最近更新 更多