先上结论
字段1的数据类型为 VARCHAR(64) 其中插入30个字符
字段2的数据类型为 number(8) 其中插入数字序列
在数据量为100万条记录的情况下
数据占用空间比约为 3:1
查询时间比约为 5:1
字段1 每百万数据占用空间约 40 MB
准备数据
-- 创建两个测试表
-- 一个为字符类型ID, 另一个为数字类型ID
-- 并将ID字段配置为主键
CREATE TABLE TEST1(
ID VARCHAR2(64)
CONSTRAINT PK_TEST1 PRIMARY KEY(ID)
);
CREATE TABLE TEST2(
ID NUMBER(8)
CONSTRAINT PK_TEST2 PRIMARY KEY(ID)
);
-- 创建序列, 用于插入数字类型ID
CREATE SEQUENCE SEQ_TEST INCREMENT BY 1 START WITH 1;
-- 循环写入100万条数据
BEGIN
FOR I IN 1..1000000 LOOP
--向TEST1中写入带6位毫秒的时间戳+10位随机字符的字符串
INSERT INTO TEST1
SELECT TO_CHAR(SYSTIMESTAMP,'YYYYMMDDHH24MISSFF6')||ROUND(DBMS_RANDOM.VALUE(),10)*10000000000 FROM DUAL;
--向TEST2中写入序列SEQ_TEST的值
INSERT INTO TEST2 SELECT SEQ_TEST.NEXTVAL FROM DUAL;
END LOOP;
COMMIT;
END;
比较表空间占用情况
-- TEST1 40 MB
-- TEST1 13 MB
-- PK_TEST1 41 MB
-- PK_TEST2 15 MB
SELECT SEGMENT_NAME, SUM(BYTES) / 1024 / 1024 MB
FROM USER_SEGMENTS
WHERE SEGMENT_NAME IN ('TEST1','TEST2','PK_TEST1','PK_TEST2')
GROUP BY SEGMENT_NAME;
查询时间比较
-- 查询时间 9.371 秒
select count(1) from test1;
-- 查询时间 1.817 秒
select count(1) from test1;