UPDATE t1
SET (report_date,report_status) =(
SELECT t2.create_date,t2.report_status
FROM t2
WHERE t2.mr_msgid=t1.mt_msgid
AND t2.create_date>=sysdate-1
AND t2.create_date<sysdate-1+1/24
AND ROWNUM=1
)
WHERE EXISTS (
SELECT 1
FROM t2
WHERE t2.mr_msgid=t1.mt_msgid
AND t2.create_date>=sysdate-1
AND t2.create_date<sysdate-1+1/24
);问题:这个SQL以前正常执行,现在异常缓慢,几乎是死锁状态属性:1。t1,t2都是两千多万的数据量。
2。msgid均有索引。
3。create_date字段都为按月分区字段,而且此字段也有索引。
4。msgid几乎是全剧唯一的数据库版本:9I
数据配置:共享池80MB
高速缓存:864MB
SGA总容量:1009MB
高速缓存命中百分比 50%
SET (report_date,report_status) =(
SELECT t2.create_date,t2.report_status
FROM t2
WHERE t2.mr_msgid=t1.mt_msgid
AND t2.create_date>=sysdate-1
AND t2.create_date<sysdate-1+1/24
AND ROWNUM=1
)
WHERE EXISTS (
SELECT 1
FROM t2
WHERE t2.mr_msgid=t1.mt_msgid
AND t2.create_date>=sysdate-1
AND t2.create_date<sysdate-1+1/24
);问题:这个SQL以前正常执行,现在异常缓慢,几乎是死锁状态属性:1。t1,t2都是两千多万的数据量。
2。msgid均有索引。
3。create_date字段都为按月分区字段,而且此字段也有索引。
4。msgid几乎是全剧唯一的数据库版本:9I
数据配置:共享池80MB
高速缓存:864MB
SGA总容量:1009MB
高速缓存命中百分比 50%
SET (report_date,report_status) =(
SELECT t2.create_date,t2.report_status
FROM t2
WHERE t2.mr_msgid=t1.mt_msgid
AND t2.create_date>=sysdate-1
AND t2.create_date<sysdate-1+1/24
AND ROWNUM=1
)
第一步:找出create_date,t2.report_status不同的行=〉PL/SQL TABLE(bulk);
第二步:Batch Update;
说实在的共享池80MB小了点.
我用游标试了一下,逐条执行,速度也比较快。循环次数大约在两万次。我想知道,用游标一般能保持较高性能的情况下,循环次数的上限是多少呢?