Thứ Tư, 2 tháng 3, 2022

Sinh 1 triệu row dữ liệu ngẫu nhiên để thực hành SQL

-- Ví dụ: Script PL/SQL thêm 1 triệu row vào bảng employees (bảng partition hoặc không partition)

-- Tạo bảng bang_to partition theo ngày
CREATE TABLE bang_to( EmployeesID int, LastName varchar(255), FirstName varchar(255), Address varchar(255), City varchar(255), create_date date ) TABLESPACE DATA PARTITION BY RANGE (create_date) ( PARTITION DATA20230101 VALUES LESS THAN (TO_DATE('2023-01-02 00:00:00', 'YYYY-MM-DD HH24:MI:SS', 'NLS_CALENDAR=GREGORIAN')) TABLESPACE DATA2023);
-- Add partition hết năm 2023 DECLARE v_nam NUMBER (4) := 2023; v_owner varchar2 (50) := 'oaz18'; v_tablename VARCHAR2 (50) := 'bang_to'; v_date_from date := to_date('02/01/2023','dd/mm/yyyy'); v_date_to date := to_date('31/12/2023','dd/mm/yyyy'); v_numday number(5); v_tablespace varchar2(50):='DATA'; BEGIN v_numday:=v_date_to-v_date_from; FOR i IN 0 .. v_numday LOOP DBMS_OUTPUT.put_line ('alter table '||v_owner||'.'|| v_tablename || ' add PARTITION DATA' ||to_char(v_date_from+i,'YYYYMMDD')||' VALUES LESS THAN (TO_DATE('''|| to_char(v_date_from+i+1,'YYYY-MM-DD')||' 00:00:00'',''SYYYY-MM-DD HH24:MI:SS'', ''NLS_CALENDAR=GREGORIAN'')) LOGGING TABLESPACE DATA'|| to_char(v_date_from+i,'YYYY')||';'); END LOOP; END; -- Them du lieu deu co cac partition theo ngay declare v_commit number; v_reset_date number; v_start date := to_date('01/01/2023','dd/mm/yyyy'); BEGIN FOR v_LoopCounter IN 1..1000000 LOOP if v_start = to_date('31/12/2023','dd/mm/yyyy') then v_start := to_date('01/01/2023','dd/mm/yyyy'); end if; INSERT INTO bang_to(EmployeesID, LastName, FirstName, Address, City,create_date) VALUES (TO_CHAR(v_LoopCounter),'Name'||v_LoopCounter,'FirstName'||v_LoopCounter,'HANOI','HANOI',v_start); v_start := v_start+1; if v_commit=1 then commit; v_commit :=1; end if; END LOOP; END; --Them 10.000 row cho ngay hien tai (vd 20/06/2023) BEGIN FOR v_LoopCounter IN 1..10000 LOOP INSERT INTO bang_to(EmployeesID, LastName, FirstName, Address, City, create_date) VALUES (TO_CHAR(v_LoopCounter),'Name'||v_LoopCounter,'FirstName'||v_LoopCounter,'HANOI','HANOI', sysdate); END LOOP; COMMIT; END;


-- Có thể Tạo bảng employees không partition

CREATE TABLE bang_to(
EmployeesID int,
LastName varchar(255),
FirstName varchar(255),
Address varchar(255),
City varchar(255)
)
TABLESPACE DATA
;

Thêm ít nhất 1.000.000 dòng dữ liệu vào bảng, sau đó kiểm tra dung lượng bảng (trường byte trong dba_segments).

BEGIN
FOR v_LoopCounter IN 1..1000000 LOOP
INSERT INTO bang_to(EmployeesID, LastName, FirstName, Address, City)
VALUES (TO_CHAR(v_LoopCounter),'Name'||v_LoopCounter,'FirstName'||v_LoopCounter,'HANOI','HANOI');
END LOOP;
COMMIT
END;

-- Ví dụ 1: Tạo bảng với 1.000.000 row hoặc hơn (sửa điều kiện bên dưới) rất dễ dàng


CREATE TABLE my_temp_table (
  id           NUMBER,
  description  VARCHAR2(20)
);

-- Insert dữ liệu 
INSERT INTO my_temp_table
WITH data AS (
  SELECT 1 AS id
  FROM   dual
  CONNECT BY level < 10000
)
SELECT rownum, TO_CHAR(rownum)
FROM   data a, data b
WHERE  rownum <= 1000000;

-- Ví dụ 2: Tạo bảng với 1.000.000 row hoặc hơn (sửa điều kiện bên dưới) rất dễ dàng và test update

-- Thêm dữ liệu
create table test_update(id number, name varchar2(100), description varchar2(4000)) storage initial(48M next 4m);

SQL> declare
v_n number;
v_name number;
v_desc number;
i number;
begin
for i in 1..1000000 LOOP
insert into test_update(id, name, description) values(i, 'Test Name'||i, 'Test Name '||i||' description ');
END LOOP;
end;
/

Elapsed: 00:04:277.23

The above script will insert 1 million rows.

SQL> select count(*) from test_update where description like '%5 description%';

  COUNT(*)
----------
    100000

Elapsed: 00:00:02.63

-- Update
SQL> create table test_update_rowids as select rowid rid, description from test_update where description like '%5 description%';

Elapsed: 00:00:54.58

The table test_update_rowids stores the rowids and the new values that has to be updated. ie 100000 rows needs to be updated.

SQL>  declare
begin
for c1 in(select rid, description from test_update_rowids)
LOOP
update test_update set description=c1.description||' after update' where rowid=c1.rid;
END LOOP;
end;
/
-- Ví dụ 4:
begin
  for i in 1..100 loop
    insert /*+ append parallel (huge,12) */ into
  dw_huge huge
  (ID
  ,SOURCEID
  ,TIMESTAMPSOURCELT
  ,TIMESTAMPSOURCEUTC
  ,FRACTIONOFASECOND)
select /*+ parallel (o,12) */
       dw_huge_seq.nextval
      ,object_id
      ,sysdate
      ,sysdate+1/24
      ,0
  from all_objects o;
  commit;
end loop;
end;
/

-- Ví dụ 5:
create table big_table
as
select rownum id,
               OWNER, OBJECT_NAME, SUBOBJECT_NAME,
               OBJECT_ID, DATA_OBJECT_ID,
               OBJECT_TYPE, CREATED, LAST_DDL_TIME,
               TIMESTAMP, STATUS, TEMPORARY,
               GENERATED, SECONDARY
  from all_objects a
 where 1=0
/
alter table big_table nologging;

declare
    l_cnt number;
    l_rows number := &1;
begin
    insert /*+ append */
    into big_table
    select rownum,
               OWNER, OBJECT_NAME, SUBOBJECT_NAME,
               OBJECT_ID, DATA_OBJECT_ID,
               OBJECT_TYPE, CREATED, LAST_DDL_TIME,
               TIMESTAMP, STATUS, TEMPORARY,
               GENERATED, SECONDARY
      from all_objects a
     where rownum <= &1;

    l_cnt := sql%rowcount;

    commit;

    while (l_cnt < l_rows)
    loop
        insert /*+ APPEND */ into big_table
        select rownum+l_cnt,
               OWNER, OBJECT_NAME, SUBOBJECT_NAME,
               OBJECT_ID, DATA_OBJECT_ID,
               OBJECT_TYPE, CREATED, LAST_DDL_TIME,
               TIMESTAMP, STATUS, TEMPORARY,
               GENERATED, SECONDARY
          from big_table
         where rownum <= l_rows-l_cnt;
        l_cnt := l_cnt + sql%rowcount;
        commit;
    end loop;
end;
/

alter table big_table add constraint
big_table_pk primary key(id)
/

begin
   dbms_stats.gather_table_stats
   ( ownname    => user,
     tabname    => 'BIG_TABLE' )
     cascade    => TRUE );
end;
/
select count(*) from big_table;
-- Ví dụ 6:
SQL Monitor

Rows Processed : 1,000M (1B)

Time to Complete : 36mins

IO Requests : 444K

IO Bytes : 458GB

Code

create table big_table
as
select rownum id,
               OWNER, OBJECT_NAME, SUBOBJECT_NAME,
               OBJECT_ID, DATA_OBJECT_ID,
               OBJECT_TYPE, CREATED, LAST_DDL_TIME,
               TIMESTAMP, STATUS, TEMPORARY,
               GENERATED, SECONDARY
  from all_objects a
 where 1=0
/



alter table big_table nologging;


declare
    l_cnt number;
    l_rows number := &1;
begin
    insert /*+ append */
    into big_table
    select rownum,
               OWNER, OBJECT_NAME, SUBOBJECT_NAME,
               OBJECT_ID, DATA_OBJECT_ID,
               OBJECT_TYPE, CREATED, LAST_DDL_TIME,
               TIMESTAMP, STATUS, TEMPORARY,
               GENERATED, SECONDARY
      from all_objects a
     where rownum <= &1;

    l_cnt := sql%rowcount;

    commit;

    while (l_cnt < l_rows)
    loop
        insert /*+ APPEND */ into big_table
        select rownum+l_cnt,
               OWNER, OBJECT_NAME, SUBOBJECT_NAME,
               OBJECT_ID, DATA_OBJECT_ID,
               OBJECT_TYPE, CREATED, LAST_DDL_TIME,
               TIMESTAMP, STATUS, TEMPORARY,
               GENERATED, SECONDARY
          from big_table
         where rownum <= l_rows-l_cnt;
        l_cnt := l_cnt + sql%rowcount;
        commit;
    end loop;
end;
/

-- Ví dụ 7:

CREATE TABLE TRANSACTION (transaction_id,  start_time)
AS SELECT LEVEL rn,SYSDATE
FROM DUAL
CONNECT BY LEVEL<=1000000

=============================
* KHOÁ HỌC ORACLE DATABASE A-Z ENTERPRISE trực tiếp từ tôi giúp bạn bước đầu trở thành những chuyên gia DBA, đủ kinh nghiệm đi thi chứng chỉ OA/OCP, đặc biệt là rất nhiều kinh nghiệm, bí kíp thực chiến trên các hệ thống Core tại VN chỉ sau 1 khoá học.
* CÁCH ĐĂNG KÝ: Gõ (.) hoặc để lại số điện thoại hoặc inbox https://m.me/tranvanbinh.vn hoặc Hotline/Zalo 090.29.12.888
* Chi tiết tham khảo:
https://bit.ly/oaz_w
=============================
KẾT NỐI VỚI CHUYÊN GIA TRẦN VĂN BÌNH:
📧 Mail: binhoracle@gmail.com
☎️ Mobile: 0902912888
⚡️ Skype: tranbinh48ca
👨 Facebook: https://www.facebook.com/BinhOracleMaster
👨 Inbox Messenger: https://m.me/101036604657441 (profile)
👨 Fanpage: https://www.facebook.com/tranvanbinh.vn
👨 Inbox Fanpage: https://m.me/tranvanbinh.vn
👨👩 Group FB: https://www.facebook.com/groups/DBAVietNam
👨 Website: https://www.tranvanbinh.vn
👨 Blogger: https://tranvanbinhmaster.blogspot.com
🎬 Youtube: http://bit.ly/ytb_binhoraclemaster
👨 Tiktok: https://www.tiktok.com/@binhoraclemaster?lang=vi
👨 Linkin: https://www.linkedin.com/in/binhoracle
👨 Twitter: https://twitter.com/binhoracle
👨 Địa chỉ: Tòa nhà Sun Square - 21 Lê Đức Thọ - Phường Mỹ Đình 1 - Quận Nam Từ Liêm - TP.Hà Nội

=============================
học oracle database, Tự học Oracle, Tài liệu Oracle 12c tiếng Việt, Hướng dẫn sử dụng Oracle Database, Oracle SQL cơ bản, Oracle SQL là gì, Khóa học Oracle Hà Nội, Học chứng chỉ Oracle ở đầu, Khóa học Oracle online,khóa học pl/sql, học dba, học dba ở việt nam, khóa học dba, khóa học dba sql, tài liệu học dba oracle, Khóa học Oracle online, học oracle sql, học oracle ở đâu tphcm, học oracle bắt đầu từ đâu, học oracle ở hà nội, oracle database tutorial, oracle database 12c, oracle database là gì, oracle database 11g, oracle download, oracle database 19c, oracle dba tutorial, oracle tunning, sql tunning , oracle 12c, oracle multitenant, Container Databases (CDB), Pluggable Databases (PDB), oracle cloud, oracle security, oracle fga, audit_trail, oracle dataguard, oracle goldengate, mview, oracle exadata, oracle oca, oracle ocp, oracle ocm , oracle weblogic, middleware, hoc solaris, hoc linux, hoc aix, unix, securecrt, xshell, mobaxterm, putty

ĐỌC NHIỀU

Trần Văn Bình - Oracle Database Master