流水线表功能 - 幕后

时间:2014-03-20 11:21:06

标签: sql oracle plsql

  1. 之后我可以访问嵌套表的数据是多么合理 使用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));
    
  2. 我已经尝试过批次vs逐行的想法(慢慢地 通过使用批量收集和forall缓慢)。但不管道流水线意味着什么 很多上下文单独切换?每次发声都要返回一行 像个坏主意。另外,如何选择管道的体积大小 行功能,如果有的话?

  3. 为什么通过查询"SELECT * FROM TABLE(..)" sqlplus显示 批量为15的数据,PL / SQL Developer显示批次 100?幕后发生了什么 - 一行批次,没有?

  4. 为什么全世界都使用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!
    

0 个答案:

没有答案