빅 데이터 양의 두 표 데이터 복제 경험 총화

15873 단어 데이터 뱅 크
1. 만약 에 두 표 의 데이터 구조 가 같다 면 여러 가지 방식 을 고려 할 수 있다.
(1)create table as select * from tbl_name;
(2) insert /*+ append*/ into tbl_name select * from  tbl_name, 소프트웨어 플랫폼 과 하드웨어 플랫폼 이 충분 하 다 면 parallel 의 hits 가입 을 고려 할 수 있 습 니 다.
(3) 스 크 립 트 도입:      DECLARE
maxnum number defult 5000;
CURSOR   cur  IS
SELECT   FROM   aa; --
TYPE rec  IS   TABLE   OF   aa%ROWTYPE; --
recs rec;
BEGIN
OPEN   cur;  -- LOOP  -- EXIT  WHEN   cur%NOTFOUND; --
FETCH   cur BULK COLLECT  --
   INTO   recs LIMIT maxnum;  -- , 5000
FORALL i  IN   1 .. recs. COUNT   -- , ,
   INSERT   INTO   bb  VALUES   recs (i); --
COMMIT --
END   LOOP;  --
CLOSE   cur; -- 1,

END ;
2. , : (1)insert /*+ append*/ into tbl_name(col1,col2,....) select col1,col2,... from  tbl_name, , parallel hits。 select , , 。

4. 567914. 천만 급 데이터 시트 를 복사 할 때 사용 하 는 저장 과정3. CREATE OR REPLACE PROCEDURE "LARGEDATA_INSERT" (ip_table_name   in varchar2, --
                                          ip_table_column in varchar2, --
                                          ip_table_select in varchar2, --SELECT
                                          return_result   out number -- 1, ,0
                                          ) as
--   create Templates by chenzhoumin 20110614
  runTime number;--
  i       number;--
  amount  number;--
  s_sql   varchar2(10000);--SQL
  e_sql   varchar2(10000);-- SQL
  countNumber number;--
begin
  --set serveroutput on size 20000000000000
  countNumber := 10000;
  return_result := 0; -- 0
  -- , ,
  s_sql := 'select count(1) from (' || ip_table_select || ')';
  execute immediate s_sql
    into amount;
  -- 100
  runTime := amount mod countNumber;
  if (runTime > 0) then
    runTime := 1 + trunc(amount / countNumber);
  end if;
  if (runTime = 0) then
    runTime := 0 + trunc(amount / countNumber);
  end if;
  FOR i IN 1 .. runTime LOOP
    e_sql := 'insert into '||ip_table_name ||'
    ('||ip_table_column ||')
     select '|| ip_table_column ||'
     from
     (select selectSec.*, rownum rownumType
          from ('|| ip_table_select ||') selectSec
         WHERE ROWNUM <= '|| i * countNumber ||')
    WHERE rownumType > '||(i - 1) * countNumber;
    dbms_output.enable(99999999999999);
    dbms_output.put_line(e_sql);
    execute immediate e_sql;
    --
    commit;
  END LOOP;
  return_result := 1;
  return;
exception
  when others then
    return_result := 0;
    raise;
    dbms_output.enable(99999999999999);
    dbms_output.put_line(' ');
    return;
end;


좋은 웹페이지 즐겨찾기