【发布时间】:2019-01-01 17:43:30
【问题描述】:
我有plsql函数。这个函数有如下查询:
select colum_name
from table_name
where filter_coloumn_name in ( select filter_coloumn_name from table_name_2);
其他查询使用我的函数从查询返回值。使用此功能的查询需要更多时间。连网站(前屏)都下来了。因为 table_name_2 有三百万条记录。所以我必须在我的函数中使用一些性能调整方法。我将函数查询更改如下:
cursor my_cursor IS
select filter_coloumn_name from table_name_2;
TYPE cursor_array_type IS TABLE OF my_cursor%ROWTYPE INDEX BY BINARY_INTEGER;
m cursor_array_type;
TYPE cursor_table_type IS TABLE OF VARCHAR2(20) INDEX BY BINARY_INTEGER;
cursor_table_object cursor_table_type;
fetch_size NUMBER := 5000;
index_var number;
begin
index_var := 1;
open my_cursor;
loop
FETCH my_cursor BULK COLLECT
into m LIMIT fetch_size;
exit when my_cursor %notfound;
for i in 1 .. m.count loop
cursor_table_object (index_var) := m(i).filter_coloumn_name;
index_var := index_var + 1;
end loop;
end loop;
Close my_cursor;
select colum_name
from table_name
where filter_coloumn_name in (cursor_table_object);
选择列名 从表名 其中 filter_coloumn_name in (cursor_table_object);
也就是说,我想一次获取所有值,然后我想像上面一样使用这个表对象。但是我不能在 sql 查询中使用带有条件表达式的表对象。
我接受PLS-00382: expression is of wrong type 错误。
我想像下面这样使用这个表对象:
select colum_name
from table_name
where filter_coloumn_name in ('bla', 'bla bla', 'bla bla bla');
我应该将表对象转换为数组吗?
【问题讨论】:
-
table_name 表有多少条记录?
-
它也有300万条记录。
-
需要一次性返回所有记录吗?你能解释一下这个功能的目的吗?因为返回 300 万条记录非常高。
-
它有一些条件,所以记录数会减少。但我必须在条件后使用准备好的、获取的数据(数组、表)。
-
代替函数使用查看和使用内连接代替子查询。请分享条件信息
标签: sql oracle plsql query-performance