我有这个简单的UPDATE声明:
UPDATE v_my_view mv
SET mv.name =
(SELECT RTRIM(name)
FROM v_another_view av
WHERE av.KEY_ID = mv.KEY_ID)
WHERE mv.VALID = 1;
此语句需要很长时间(20秒),而同一视图上的其他更复杂的更新只需不到1秒。首先我认为它是RTRIM函数,但它不是,如果我不使用它,它就像以前一样慢。
两个视图上的SELECT都会非常快速地返回记录。
视图上没有TRIGGER,但桌子后面有一个。但它不能成为瓶颈,因为即使我对所有TRIGGER代码进行评论,它也会有相同的缓慢性能。
有人有建议吗?
编辑:添加了缺少的WHERE子句 编辑:视图(或后面的表)每个只包含8000条记录,没有特殊的数据类型。
答案 0 :(得分:0)
您正在更新整个视图而没有任何WHERE子句。
如果您有大量数据甚至索引,可能会减慢您的操作速度。
答案 1 :(得分:0)
name
的基础表中的列v_my_view
上是否有任何索引?如果是,请禁用它们,看看它是否会导致对查询性能的任何改进。
正如Nick.McDermaid所说,如果没有执行计划和等待事件统计数据,很难说。你可以期待的最好的是某种形式的心灵调试。
答案 2 :(得分:0)
merge --+ use_hash(MV,AV) no_merge(AV) no_merge(MV)
into (select * from v_my_view MV where valid = 1)
using v_another_view AV
on MV.key_id = AV.key_id
when matched then
update
set MV.name = rtrim(AV.name)
;
虽然我并不完全确定merge
进入内嵌视图,但您至少可以尝试一下(如果不起作用则发表评论)。
此外,最好显示查询的执行计划以及查询。