之后我可以访问嵌套表的数据是多么合理 使用Pipe Row命令?实际保存的数据在哪里?
我知道在流水线功能中,数据直接发送到 调用者客户端,这减少了进程的动态内存 在SGA上。但是当我尝试在流水线操作后访问该信息时,我成功了。这让我很吃惊,因为这意味着数据实际上保存在某个地方,而不是本地SGA。那么在哪里?
以下是我做过的一个例子:
CREATE OR REPLACE TYPE collection_t IS OBJECT (
ID NUMBER,
NAME VARCHAR2(50));
/
CREATE OR REPLACE TYPE collection_nt_t IS TABLE OF collection_t;
/
CREATE OR REPLACE FUNCTION my_test_collection_p(rownumvar NUMBER)
RETURN collection_nt_t
PIPELINED
IS
collection_nt collection_nt_t:= collection_nt_t();
BEGIN
FOR i IN 1..rownumvar LOOP
collection_nt.EXTEND(1);
collection_nt(i) := collection_t (i, 'test');
PIPE ROW (collection_nt(i));
END LOOP;
DBMS_OUTPUT.PUT_LINE(collection_nt(3).id);--"queries" the collection successfully! Where is the collection being saved?
RETURN;
END;
/
SELECT * FROM TABLE(my_test_collection_p(100));
我已经尝试过批次vs逐行的想法(慢慢地 通过使用批量收集和forall缓慢)。但不管道流水线意味着什么 很多上下文单独切换?每次发声都要返回一行 像个坏主意。另外,如何选择管道的体积大小 行功能,如果有的话?
为什么通过查询"SELECT * FROM TABLE(..)"
sqlplus显示
批量为15的数据,PL / SQL Developer显示批次
100?幕后发生了什么 - 一行批次,没有?
为什么全世界都使用sqlplus,当你有像PL / SQL Developer这样的好IDE?即使是你的小线索也会对我有所帮助,非常感谢!
详细信息1:当我使用常规Function表执行相同操作时,正在使用的内存大小为每1M行170MB。但是当使用上面的管道表函数时,内存不会增加。我试图了解究竟是什么记忆 - 事实上集合被保存为变量?
CREATE OR REPLACE FUNCTION my_test_collection(rownumvar NUMBER) RETURN
collection_nt_t IS
collection_nt collection_nt_t:= collection_nt_t();
BEGIN
FOR i IN 1..rownumvar LOOP
collection_nt.EXTEND(1);
collection_nt(i) := collection_t (i, 'test');
END LOOP;
RETURN collection_nt;
END;
SELECT * FROM TABLE(my_test_collection(1000000));--170MB of SGA delta!
SELECT * FROM TABLE(my_test_collection_p(1000000));--none. but both of them store the whole collection!