【问题标题】:Update necessary fields only in VoltDB仅在 VoltDB 中更新必要的字段
【发布时间】:2019-08-06 11:01:34
【问题描述】:

我有一个大约 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)

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

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

【问题讨论】:

  • UPDATE TBLX SET NAME = ? WHERE ? != '####'?
  • @jarlh 你是对的,但我的主要挑战是我确实有 50 个字段,更新查询也将有 50 个字段,但实际更新的值是 3 个字段。所以从技术上讲,我不希望 DBMS 更新所有其他字段。发生这种情况时,我们会降低性能。
  • 您可以使用“EXPLAIN UPDATE ...”来获取每个查询的查询计划,看看什么看起来更有效率。另一个选项是 UPSERT 语句或默认的 TBLX.upsert 过程,如果表有主键,则会自动生成。
  • 您是否尝试过将它们与 explainproc 进行比较? docs.voltdb.com/UsingVoltDB/sysprocexplainproc.php
  • @BenjaminBallard 我已经用命令“解释更新...”的输出更新了这个问题,它没有显示 VoltDB 的内部工作。我想了解的是,当它的值没有通过分配自己的值来改变时,它是否会忽略该列。

标签: sql database voltdb


【解决方案1】:

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

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

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

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

【讨论】:

  • 感谢您的详细解释。似乎只有运行基准测试才能告诉我编写复杂查询是否可以节省我的时间,或者我将不得不采取其他方式。
猜你喜欢
  • 2011-09-21
  • 2019-06-24
  • 1970-01-01
  • 1970-01-01
  • 2015-05-29
  • 2012-12-03
  • 2017-11-05
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多