CSV出力時とDB格納時のサイズ比較

CSV出力時とDB格納時のサイズはおよそ同じ

 

(8.0.29)

-- 1. テストデータ作成


drop table tab1;
create table tab1(
    col1 int primary key
   ,col2 bigint
   ,col3 datetime
   ,col4 varchar(100)
   );


drop procedure proc1;

delimiter //
create procedure proc1(in x int)
begin
  declare i int;
  set i = 0;
  start transaction;
  while i < x do
    set i = i + 1;
    insert into tab1 values(
     i
    ,floor(rand() * 1000000000000)+1
    ,date_add('2001-01-01', interval floor(365*20*24*3600 * rand() ) second)
    ,substring(md5(rand() ), 1, 30)
    );
  end while;
  commit;
end
//
delimiter ;

call proc1(10000000);
select count(*) from tab1;

select * from tab1 order by rand() limit 20;


analyze table tab1;
select
   table_name
  ,table_rows
  ,avg_row_length
  ,data_length/1024/1024/1024 tableGB
  ,index_length/1024/1024/1024 indexGB
from information_schema.tables
where table_schema = database()
and table_name = 'tab1'
;

件数: 1千万
データサイズ: 680M

 


-- 2. CSV出力

show variables like 'secure_file_priv';


select * into outfile '/var/lib/mysql-files/tab1.csv'
fields terminated by ',' optionally enclosed by '"'
from tab1;

head tab1.csv
ls -lh tab1.csv

CSVファイルサイズ: 723M


-- 3. 結果


CSVファイルサイズはDB格納時サイズとほぼ同じ

(19c)

-- 1. テストデータ作成

drop table tab1 purge;
create table tab1(
    col1 int primary key
   ,col2 int
   ,col3 timestamp
   ,col4 varchar2(100)
   );

declare
begin
for i in 1..10000000 loop
  insert into tab1 values
  (i
  ,floor(dbms_random.value(1, 1000000000001) )
  ,to_date('20010101','yyyymmdd') + floor(dbms_random.value(0, 365*20*24*3600) )/24/3600
  ,substr(standard_hash(dbms_random.value(), 'MD5'),1,30)
  );
end loop;
end;
/

commit;
select count(*) from tab1;
select * from tab1 order by dbms_random.value()  fetch first 20 rows only;

 

select sum(bytes/1024/1024/1024) bytes from user_segments where segment_name ='TAB1';


件数: 1千万
データサイズ: 617M

 

-- 2. CSV出力

vim a.sql

set trims on
set head off
set feed off
set echo off
set termout off
set verify off
set pagesize 0
set linesize 32767
set markup csv on quote on
alter session set nls_timestamp_format='YYYY/MM/DD HH24:MI:SS';
col col2 format 999999999999999999
spool tab1.csv
select * from tab1;
exit
spoo off


sqlplus test/test@pdb1 @a.sql


head tab1.csv
ls -lh tab1.csv

CSVファイルサイズ: 742M


-- 3. 結果

CSVファイルサイズはDB格納時サイズより少し大きい

 


(14)
-- 1. テストデータ作成

drop table tab1;
create table tab1(
    col1 int primary key
   ,col2 bigint
   ,col3 timestamp
   ,col4 varchar(100)
   );

start transaction;
insert into tab1 select
   g
  ,floor(random() * 1000000000000)+1
  ,'2001-01-01'::date + CAST( floor(365*20*24*3600*random() ) || 'second' AS interval)
  ,substring(md5(random()::text), 1, 30)
from generate_series(1,10000000) g;

commit;

select count(*) from tab1;

\pset pager 0
select * from tab1 order by random() limit 20;


select pg_size_pretty(pg_relation_size('tab1') );


件数: 1千万
データサイズ: 805M

-- 2. CSV出力

COPY tab1 TO '/tmp/tab1.csv' WITH ( FORMAT csv,  NULL '', QUOTE '"', FORCE_QUOTE * );

head tab1.csv
ls -lh tab1.csv

CSVファイルサイズ: 761M


-- 3. 結果


CSVファイルサイズはDB格納時サイズとほぼ同じ


(2019)

-- 1. テストデータ作成

drop table tab1;
create table tab1(
    col1 int primary key
   ,col2 bigint
   ,col3 datetime2
   ,col4 varchar(100)
   );


set nocount on
declare @i int;
set @i = 1;
begin transaction;
while @i <= 10000000
begin
  insert into tab1 values(
     @i
    ,floor(rand() * 1000000000000)+1
    ,dateadd(second,floor(365*20*24*3600 * rand() ),'2001-01-01')
    ,substring(master.dbo.fn_varbintohexstr(HASHBYTES('MD5',cast(rand() as varchar) ) ),3,30)
    );
  set @i = @i + 1;
end
commit;
select count(*) from tab1;


select top 20 * from tab1 order by newid();

exec sp_spaceused 'dbo.tab1';
go

件数: 1千万
データサイズ: 744M


-- 2. CSV出力

bcp "select col1,col2,QUOTENAME(col3,'""'),QUOTENAME(col4,'""') from test.dbo.tab1" queryout "C:\test\tab1.csv"  -T -c -t,

 


Get-Content .\tab1.csv | Select-Object -first 100

(Get-Item .\tab1.csv).Length


CSVファイルサイズ: 808M

-- 3. 結果

CSVファイルサイズはDB格納時サイズより少し大きい