【问题标题】:Performance Tuning on Update query更新查询的性能调优
【发布时间】:2016-08-03 02:29:04
【问题描述】:

我的简单更新查询执行时间过长。 大约有 1000 万条记录——其中我只为 1k 条记录执行。

语句是这样的:

UPDATE tab
   SET col1= 'yes',
       col2 = 'yes'
 WHERE col7 ||'_'|| col8 = 'VAL_0'
   AND col10 = 'NA'

此语句执行大约需要 70 分钟。

我还在col7 ||'_'|| col8 这个上创建了索引。 虽然需要这么长的时间。

编辑:这里的“VAL_0”来自其他结果集(数据表)

有什么建议可以让我的查询运行得更快。我尝试在 (col10) 和 (col7 ||'_'|| col8) 上使用索引,但执行起来需要大量时间。 您建议的其他调优技术?

谢谢

【问题讨论】:

  • 双引号"NA",这是一栏吗?
  • 为什么要在第二个yes后面加逗号?
  • 为什么不简单地col7 = 'VAL' and col8 = '0'
  • 我不是预言家,但是:最好检查一下col7='VAL' AND col8=0... col10 上有索引吗?将 col1 和 col2 设置为“yes”是否会影响其他索引?
  • @jarlh,Joe Taras,抱歉输入错误我更新了我的问题,'VAL_0' 是来自其他表的数据

标签: sql oracle performance sql-update database-tuning


【解决方案1】:

这是查询:

UPDATE tab
   SET col1= 'yes',
       col2 = 'yes',
 WHERE col7 ||'_'|| col8 = 'VAL_0' AND col10 = 'NA'

tab(col10) 上的索引开始。这可能会有所帮助。

如果可以,请将查询更改为:

UPDATE tab
   SET col1= 'yes',
       col2 = 'yes',
 WHERE col7 = 'VAL'  AND col8 = '0' AND col10 = 'NA';

(注意:如果col8 实际上是一个数字,请使用0 而不是'0'。)

然后在tab(col10, col7, col8)上创建索引

【讨论】:

  • 您能描述一下为什么在创建索引时选择列顺序 col10, col7, col8 吗?
  • @jarlh 根据 OP 提供的信息,索引列的顺序是否重要?海事组织,任何排列都可以。 (显然,如果有其他查询使用这 3 列中的一列或多列,那么这会改变事情 - 也许。但 OP 没有提到除这一个查询之外的任何其他内容,所以......)
  • @jarlh 。 . .对于平等条件,这并不重要。我只是选择了适用于两个版本的查询的索引。
猜你喜欢
  • 1970-01-01
  • 2016-06-12
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多