【问题标题】:Avoding unnecessary updates In Update Query在更新查询中避免不必要的更新
【发布时间】:2009-06-30 08:29:47
【问题描述】:

在我们的应用程序中,许多页面都包含“更新”,当我们更新表时,我们更新了不必要的列,这些列也不会改变。 我想知道有没有办法避免不必要的列更新?我们在 .net 2003 中使用存储过程。在以下链接中,我找到了一个解决方案,但它不适用于存储过程。

http://blogs.msdn.com/alexj/archive/2009/04/25/tip-15-how-to-avoid-loading-unnecessary-properties.aspx

谢谢

【问题讨论】:

  • 据我了解,数据库的最小工作单元是一行,更新一列的成本与更新所有列的成本相同。我相信唯一的例外可能是包含 text/ntext 或 blob 列的表。
  • 不一定正确。如果这些列有外键和索引,它们可能需要更多的工作来更新给定的行
  • 我的问题是哪个 rdbms?如果是 sql 2008,MERGE 语句可能会有所帮助。

标签: asp.net sql stored-procedures


【解决方案1】:

您实际上只能使用为您生成更新查询的优秀 ORM 工具来完成此操作。它通常会查看更改的内容并仅针对更改的列生成查询。

如果您使用的是存储过程,那么当您调用存储过程时,所有列值都会被发送到数据库,因此您无法保存在那里。 SP 可能只会执行普通的 UPDATE 语句。然后 RDMS 接管。如果没有不同,它不会物理更改磁盘上的数据。它足够聪明。

所以我的回答很简单:不用担心。这并不是什么大问题,需要进行大刀阔斧的改变才能得到你想要的,而且你甚至看不到性能优势。

【讨论】:

  • 这完全不是真的。无论如何,大多数数据库引擎都会执行更新。它们仍然是事务跟踪、更改日志记录(如果实施)、索引更新和外键检查。更新不必要的列肯定会产生影响,尤其是在这些列被索引时,如果它们是聚集索引的一部分,则更糟。
  • 我相信 Hibernate/NHibernate 会开箱即用。它检查对象是否“脏”(对其属性进行了更改),然后将创建自己的 SQL 语句来更新相应的列。当然,您还会获得运行 ORM 框架的额外开销,但如果该框架与数据库不在同一台服务器上,这可能会有所帮助。
【解决方案2】:

当我在一家金融软件公司工作时,绩效至关重要。有些表有数百列,更新语句的成本很高。我们创建了自己的 ORM 层(在 java 中),其中包括一个对象缓存。当我们生成更新语句时,我们将每个字段的当前值与加载时的值进行比较,并且只更新更改的字段。

我们的数据库是 SQLServer。我不记得性能改进,但它是可观的,值得投资。我们还尽可能进行批量插入和更新。

如果你不想自己写的话,我相信 Hibernate 和其他大型 ORM 都会为你做这种事情。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2021-11-02
    • 2012-09-30
    • 1970-01-01
    • 1970-01-01
    • 2020-10-25
    • 2021-03-06
    • 2022-01-18
    相关资源
    最近更新 更多