【发布时间】:2019-10-31 01:00:55
【问题描述】:
通常,它执行正常,但有时一周一两次,它在 Oracle 中被挂起或减速。
有没有更好的优化方法?
FOR i IN ( SELECT * FROM process_data) LOOP
BEGIN
SELECT employee_plan_id
INTO lc_emp_plan_id
FROM employee
WHERE employeeid = i.emp_id
AND join_year = (
SELECT join_year
FROM employeedata
WHERE employeeid = i.emp_id
AND i.joining_date BETWEEN join_date AND termination_date
);
END;
SELECT employee_plan_type
INTO lc_emp_type
FROM employee_plans
WHERE employee_plan_id = lc_emp_plan_id;
-- Mark failed record if emp_lastname is null
UPDATE process_data
SET
is_failure = 1
WHERE emp_lastname IS NULL
AND emp_plan_type = lc_emp_type;
END LOOP;
记住
SELECT join_year
FROM employeedata
WHERE employeeid = i.emp_id
AND i.joining_date BETWEEN joining_date AND termination_date;
它总是会返回 1 条记录,这是被证明的。
这里lc_emp_plan_id是一个变量,这个for循环在过程中执行?
【问题讨论】:
-
我看到两种可能性:要么你的数据包含一些奇怪的东西,例如您的子查询返回一万亿行(您说这被证明是错误的),或者服务器上存在其他一些资源争用(例如锁定)。你查看过服务器的内存、CPU 和磁盘使用情况吗?
-
谓词中的
joining_date和termination_date是什么?它们是参数还是只是列名? -
你为什么要循环播放?在您的真实代码中,循环中正在做什么?您是否在更新、插入等内容?
-
请更新您的问题以包含更新声明。您很可能在这里不必要地循环播放,但没有更多信息,很难说。
-
您的更新语句是否应该以某种方式链接回外部光标?
标签: sql oracle oracle11g query-optimization