sql - 仅在 VoltDB 中更新必要的字段

标签 sql database voltdb

我有一个包含大约 50 列的表格。每次行发生变化时,我都不知道哪些列会发生变化。我不想在更新表格时处理每一个排列和组合。

因此,当我必须这样做时,我会更新所有 50 列,而且我知道,在处理大量更新时,这比我预期的要花费更多的时间。

  1. 为了解决这个问题,我有一个解决方案。创建不同的一组经常更新的字段并以这种方式设计我的应用程序。我知道每当新字段添加到我的表时都需要更改。
UPDATE TBLX SET NAME = ? WHERE ID = ?;

解释更新的结果...

UPDATE
 INDEX SCAN of "TBLX" using "TBLX_ID"
  scan matches for (U_ID = ?5), filter by (column#0 = ?6)
  1. 另一种方法是我编写一个带有 when 和 then 的查询(如下所示)。这样我的代码将需要更新,但不会像第一种方法中那样需要更新。
UPDATE TBLX SET NAME = CASE WHEN (? != '####') THEN ? ELSE NAME END WHERE ID = ?;

解释更新的结果...

UPDATE
 INDEX SCAN of "TBLX" using "TBLX_ID"
  scan matches for (U_ID = ?3), filter by (column#0 = ?4)

所以我的问题是关于查询执行的内部。 如何处理这两种类型的查询以及哪种查询会更快。

我想了解的是执行程序是否会忽略我未更改列中值的查询部分。即为该列分配相同的值。

最佳答案

计划显示两个查询都在使用 TBLX_ID 索引上的匹配项,这是查找特定行或要更新的行的最快方法。如果是单行,这应该是相当快的。

这两个查询之间的区别本质上是它在找到行后对更新工作所做的工作。虽然该计划没有显示更新一行时将采取的步骤,但无论哪种方式都应该很快。在这一点上,它是 native C++ 代码更新内存中它具有独占访问权限的行。如果非要我猜的话,使用 CASE 子句的可能需要稍长的时间,但差异可以忽略不计。您必须运行一个基准来衡量执行时间的差异才能确定,但​​我希望它在这两种情况下都很快。

比这两个更新之间的区别更重要的是您如何处理更新多列。例如,查找受影响的行的成本可能高于实际更新列的逻辑。或者,至少如果你设计它以便更新 n 列,你必须排队 n 个 SQL 语句,那么引擎必须执行 n 个语句,并使用相同的索引查找相同的行 n 次。所有这些开销都会大得多。相反,如果您有一个包含许多参数的复杂 UPDATE 语句,您可以在其中传递不同的值来更新各个列或将它们设置为当前值,但在所有这些中,引擎只需执行一个语句并找到该行一次,然后尽管这看起来很复杂,但它可能会更快。更快的方法可能是简单地将所有列更新为新值,无论它是否与当前值相同。

如果您可以对此进行测试并运行几百个示例,那么“exec @Statistices PROCEDUREDETAIL 0;”输出将显示每个 SQL 语句以及整个过程的平均执行时间。这应该提供找到最佳方法所需的指标。

关于sql - 仅在 VoltDB 中更新必要的字段,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57374548/

相关文章:

java - 在 derby 示例数据库中创建关系

hadoop - Sqoop从voltdb导出数据

php - 如何为数据库中的 N 个用户维护单个用户的多个唯一数据

sql - 如何组合一列中的日期和另一列中的时间

c# - 查找 SQL 语句字符串中外层 FROM 子句的索引

php - 在哪里可以找到一个函数是否存在?

ruby-on-rails - Heroku 推送错误

java - 如何在不安装 MS Access 的情况下使用 .mdb 文件?

液体碱 : How to use <preconditions> with changeset having runAlways true?

php - 一起使用 PHP + VoltDB?