【发布时间】:2019-08-06 11:01:34
【问题描述】:
我有一个大约 50 列的表。每次行发生变化时,我都不知道哪些列会发生变化。我不想在更新表格时处理每一个排列和组合。
因此,当我必须这样做时,我会更新所有 50 列,我知道,在处理大量更新时,这比我预期的要花费更多的时间。
- 为了解决这个问题,我有一个解决方案。创建不同的一组经常更新的字段并以这种方式设计我的应用程序。我知道每当向我的表中添加新字段时都需要更改。
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)
- 另一种方法是我用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 的内部工作。我想了解的是,当它的值没有通过分配自己的值来改变时,它是否会忽略该列。