如何解决PL/SQL 性能分页游标带过滤和固定结果大小
我有一个 pl/sql 游标,它从一个定义的 rowid(由参数给出)开始,用于分页查询。
游标检索到的行是由特殊规则过滤的 - 因此结果行不会立即返回,而是收集在表类型变量中。
在循环中,我从游标中获取更多数据,直到将 100 个“行”放入表类型变量。这个结果是从函数返回的。
一切正常,但初始 sql 查询(打开游标)需要很长时间。 如果我限制 sql 语句中的行(“WHERE rownum
有没有办法通过不添加固定的“rownum
function get_metadata(p_toquery in number,p_startfrom in number) return t_Table_metadata
is
v_result_tab t_Table_metadata;
v_return_tab t_Table_metadata := t_Table_metadata();
c_meta SYS_REFCURSOR;
v_size_per_fetch integer := 100;
begin
open c_meta for
'SELECT t_type_metadata(....)
FROM (
SELECT t.*,rownum r
FROM (
select ...
from ...
where attr1 = '|| p_toquery||'
order by create_date desc
) t
-- with this where-Clause much faster!! WHERE rownum <= (100 + p_startfrom)
) f
WHERE r >= '|| p_startfrom;
loop
fetch c_meta bulk collect into v_result_tab limit v_size_per_fetch;
for i in 1..v_result_tab.count loop
v_check_row_result := check_row(....);
if (v_check_row_result = 1 and v_return_tab.count < 100) then
v_return_tab.extend;
v_return_tab(v_return_tab.count) := v_result_tab(i);
end if;
end loop;
exit when v_result_tab.count = 0 or v_return_tab.count >= 100;
end loop;
close c_meta;
return v_return_tab;
end;
解决方法
使用提示 FIRST_ROWS
要求 Oracle 优化查询以快速返回少量行。您仍然需要猜测 PL/SQL 循环所需的行数,但大概的猜测(例如 1000)可能已经足够了。
SELECT /*+ first_rows(1000) */ t_type_metadata(....)
正如其他人评论的那样,如果您可以将所有条件放入单个 SQL 语句中,那将是理想的。使用单个 SQL 语句,添加分页可以很简单:select ... offset 100 rows fetch next 100 rows only;
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。