前言:
数据库学习的过程中,很可能需要数据量比较大的表来进行模拟测试,那么,测试表的创建需要遵循的是贴近实际的生产环境,尽量的模仿实际的生产环境。
因此,学习数据库的时候,快速的创建一个具有足够数据量的大表是非常有必要的。
OK,本文将就如何创建一个数量级达到2000W的单表做一个详细的介绍。
一,
创建表用到的函数
- generate_series(1,20000000)
自增序列函数,主要功能是输出一个连续的序列号,示例如下:
postgres=# select generate_series(1,10); generate_series ----------------- 1 2 3 4 5 6 7 8 9 10 (10 rows) ####注意,此命令和上面是一样的select * from generate_series(1,10);
使用说明:
可以使用时间作为参数生成时间序列
generate_series(start, stop,step)生成一个数值序列,从start 到 stop,步进为 step
- lpad()
填充字符函数
lpad(string, length, characters)
参数
str
必需的。 需要填充的字符串。
length
必需的。 需要填充到的字符串长度。
characters
可选的。 用来填充的字符。默认是一个空格。
例如:
SELECT lpad('hellozsk', 12, 'world');
输出是:
postgres=# SELECT lpad('hellozsk', 12, 'world'); lpad -------------- worlhellozsk (1 row)
为什么是这么输出呢?左边hellozsk是8位,右边是5位,指定输出12位,差4位,从右边借4位放到hellozsk的左边,从而输出worlhellozsk
顺便说一下,还有rpad函数,两个是一对的,示例如下:
postgres=# SELECT rpad('hellozsk', 12, 'world'); rpad -------------- hellozskworl (1 row)
postgres=# select * from rpad('hello',10,'world'); rpad ------------ helloworld (1 row)
- random()
postgres=# select * from random(); random -------------------- 0.5445090305686442 (1 row)
二,
随机生成23位数字加字母的自定义函数
create or replace function gen_id( a date, b date ) returns text as $$ select lpad((random()*99)::int::text, 3, '0') || lpad((random()*99)::int::text, 3, '0') || lpad((random()*99)::int::text, 3, '0') || to_char(a + (random()*(b-a))::int, 'yyyymmdd') || lpad((random()*99)::int::text, 3, '0') || random()::int || (case when random()*10 >9 then 'xy' else (random()*9)::int::text end ) ; $$ language sql strict;
三,
创建测试表
create table if not exists testpg ( "id" int, "suijishuzi" VARCHAR ( 255 ) COLLATE "pg_catalog"."default" ); #或者创建这个表 CREATE SEQUENCE test START 1; create table if not exists testpg ( "id" int8 not null DEFAULT nextval('test'::regclass), CONSTRAINT "user_vendorcode_pkey" PRIMARY KEY ("id"), "suijishuzi" VARCHAR ( 255 ) COLLATE "pg_catalog"."default" );
四,
向测试表插入数据,暂定是2000W条:
insert into testpg SELECT generate_series(1,20000000) as xm, gen_id('1949-01-01', '2023-10-16') as num;
插入数据的速度看CPU是否给力了,反正我的笔记本是比较差劲,因此十来分钟才生成完
五 ,
测试表的简单使用
#####注:为什么是使用navicat?因为navicat通常是远程连接的数据库,是可以真实模拟数据库使用的,在本地查询速度会快很多的。
1,
快速查询
select * from testpg where id between 10012 and 52013 limit 1000;
2,
慢速查询
select * from testpg where id between 10012 and 52013
3,
给ID列增加索引,然后无limit查询:
可以看到加索引后查询速度增加了30多倍,由15秒左右变为0.3秒左右
create index on testpg(id); select * from testpg where id between 10012 and 52013 ;
未完待续!!!!