2000字范文,分享全网优秀范文,学习好帮手!
2000字范文 > 三个主流数据库(Oracle MySQL和SQL Server)的“单表造数

三个主流数据库(Oracle MySQL和SQL Server)的“单表造数

时间:2023-03-05 07:09:37

相关推荐

三个主流数据库(Oracle MySQL和SQL Server)的“单表造数

oracle

1.创建表

CREATE TABLE "YZH2_ORACLE" ("VARCHAR2_COLUMN" VARCHAR2(20) NOT NULL ENABLE,"NUMBER_COLUMN" NUMBER,"DATE_COLUMN" DATE,"CLOB_COLUMN" CLOB,"BLOB_COLUMN" BLOB,"BINARY_DOUBLE_COLUMN" BINARY_DOUBLE,"BINARY_FLOAT_COLUMN" BINARY_FLOAT,"CHAR_COLUMN" CHAR(1),"CHAR_VARYING_COLUMN" VARCHAR2(20),"DEC_COLUMN" NUMBER(*, 0),"DECIMAL_COLUMN" NUMBER(*, 0),"DOUBLE_PRECISION_COLUMN" FLOAT(126),"CHARACTER_COLUMN" CHAR(1),"CHARACTER_VARYING_COLUMN" VARCHAR2(20),"FLOAT_COLUMN" FLOAT(126),"INT_COLUMN" NUMBER(*, 0),"INTEGER_COLUMN" NUMBER(*, 0),"NATIONAL_CHAR_COLUMN" NCHAR(1),"NATIONAL_CHAR_VARYING_COLUMN" NVARCHAR2(20),"NATIONAL_CHARACTER_COLUMN" NCHAR(1),"NATIONAL_CHARACTER_VARY_COLUMN" NVARCHAR2(20),"NCHAR_COLUMN" NCHAR(1),"NCHAR_VARYING_COLUMN" NVARCHAR2(20),"NCLOB_COLUMN" NCLOB,"NUMERIC_COLUMN" NUMBER(*, 0),"NVARCHAR2_COLUMN" NVARCHAR2(20),"RAW_COLUMN" RAW(20),"REAL_COLUMN" FLOAT(63),"SMALLINT_COLUMN" NUMBER(*, 0),"TIMESTAMP_COLUMN" TIMESTAMP (6),"VARCHAR_COLUMN" VARCHAR2(20))

预设游标10000(必要时)

alter system set open_cursors = 10000;

模拟新增10万条数据

DECLARE I number := 0; BEGIN FOR I IN 0..100000 LOOP INSERT INTO YZH2_ORACLE (VARCHAR2_COLUMN, NUMBER_COLUMN, BINARY_DOUBLE_COLUMN,BINARY_FLOAT_COLUMN, CHAR_VARYING_COLUMN,DEC_COLUMN, DECIMAL_COLUMN, DOUBLE_PRECISION_COLUMN,CHARACTER_VARYING_COLUMN, FLOAT_COLUMN,INT_COLUMN, INTEGER_COLUMN, NATIONAL_CHAR_VARYING_COLUMN,NATIONAL_CHARACTER_VARY_COLUMN,NCHAR_VARYING_COLUMN, NUMERIC_COLUMN,NVARCHAR2_COLUMN, REAL_COLUMN, SMALLINT_COLUMN,VARCHAR_COLUMN)VALUES (I, I, I, I, I, I, I, I, I, I, I, I, I, I, I, I,I, I, I, I); END LOOP; COMMIT; END;

1.1oracle一条sql数据生成100万条数据

SELECTrownum AS id,to_char(sysdate + rownum / 24 / 3600, 'yyyy-mm-dd hh24:mi:ss') AS inc_datetime,trunc(dbms_random.value(0, 100)) AS random_id,dbms_random.string('x',20) AS random_stringFROMdualCONNECT BYLEVEL <= 1000000; #可传参数

2.SQL SERVER

创建测试表

CREATE TABLE dbo.yzh2_ms_checker (BIGINT_COLUMN bigint NULL DEFAULT (NULL),BINARY_COLUMN binary(64) NULL DEFAULT (NULL),BIT_COLUMN bit NULL DEFAULT (NULL),CHAR_COLUMN char(64) NULL DEFAULT (NULL),CHAR_MAX_COLUMN char(128) NULL DEFAULT (NULL),DATE_COLUMN date NULL DEFAULT (NULL),DATETIME_COLUMN datetime NULL DEFAULT (NULL),DECIMAL_COLUMN decimal(18,0) NULL DEFAULT (NULL),FLOAT_COLUMN real NULL DEFAULT (NULL),INT_COLUMN int NULL DEFAULT (NULL),MONEY_COLUMN money NULL DEFAULT (NULL),NCHAR_COLUMN nchar(64) NULL DEFAULT (NULL),NCHAR_MAX_COLUMN nchar(128) NULL DEFAULT (NULL),NTEXT_COLUMN ntext NULL DEFAULT (NULL),NUMERIC_COLUMN numeric(18,0) NULL DEFAULT (NULL),NVARCHAR_COLUMN nvarchar(64) NULL DEFAULT (NULL),NVARCHAR_MAX_COLUMN nvarchar(128) NULL DEFAULT (NULL),REAL_COLUMN real NULL DEFAULT (NULL),SMALLINT_COLUMN smallint NULL DEFAULT (NULL),SMALLMONEY_COLUMN smallmoney NULL DEFAULT (NULL),TEXT_COLUMN text NULL DEFAULT (NULL),TINYINT_COLUMN tinyint NULL DEFAULT (NULL),VARBINARY_COLUMN varbinary(64) NULL DEFAULT (NULL),VARCHAR_COLUMN varchar(64) NULL DEFAULT (NULL),VARCHAR_MAX_COLUMN varchar(128) NULL DEFAULT (NULL),XML_COLUMN xml NULL DEFAULT (NULL));GO

DECLARE @i INTSET@i = 1 WHILE @i <=30000 BEGININSERT INTO dbo.yzh2_ms_checker (BIGINT_COLUMN, BINARY_COLUMN, BIT_COLUMN,CHAR_COLUMN, CHAR_MAX_COLUMN, DATE_COLUMN,DATETIME_COLUMN, DECIMAL_COLUMN,FLOAT_COLUMN, INT_COLUMN, MONEY_COLUMN,NCHAR_COLUMN, NCHAR_MAX_COLUMN,NTEXT_COLUMN, NUMERIC_COLUMN, NVARCHAR_COLUMN,NVARCHAR_MAX_COLUMN, REAL_COLUMN,SMALLINT_COLUMN, SMALLMONEY_COLUMN,TEXT_COLUMN, TINYINT_COLUMN, VARBINARY_COLUMN,VARCHAR_COLUMN, VARCHAR_MAX_COLUMN,XML_COLUMN)VALUES(@i,1,@i,@i,@i,GETDATE(),GETDATE(),@i,@i,@i,@i,@i,@i,STR(@i),@i,STR(@i),STR(@i),@i,@i,@i,STR(@i),NULL,1,@i,@i,STR(@i))SET @i = @i + 1 END;

3.MySQL

创建测试表

CREATE TABLE `yzh2_sync` (`bigint_column` bigint(10) NOT NULL AUTO_INCREMENT COMMENT '1',`bit_column` bigint(10) NOT NULL COMMENT '2',`blob_column` blob NOT NULL COMMENT '3',`char_column` char(64) NOT NULL COMMENT '4',`date_column` date NOT NULL COMMENT '5',`datetime_column` datetime NOT NULL COMMENT '6',`decimal_column` decimal(18,9) NOT NULL COMMENT '7',`double_column` double NOT NULL COMMENT '8',`float_column` float NOT NULL COMMENT '10',`int_column` int(11) NOT NULL COMMENT '11',`longblob_column` longblob NOT NULL COMMENT '12',`longtext_column` longtext NOT NULL COMMENT '13',`mediumblob_column` mediumblob NOT NULL COMMENT '14',`mediumint_column` mediumint(9) NOT NULL COMMENT '15',`mediumtext_column` mediumtext NOT NULL COMMENT '16',`smallint_column` smallint(6) NOT NULL COMMENT '18',`text_column` text NOT NULL COMMENT '19',`time_column` time NOT NULL COMMENT '20',`timestamp_column` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '21',`tinyint_column` int(11) NOT NULL COMMENT '22',`tinytext_column` tinytext NOT NULL COMMENT '23',`varchar_column` varchar(32) NOT NULL COMMENT '24',PRIMARY KEY (`bigint_column`)) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;

模拟新增3万条数据

DROP PROCEDURE if EXISTS test_insert;DELIMITER //CREATE PROCEDURE test_insert()BEGINDECLARE y BIGINT DEFAULT 0;WHILE y<30000DOINSERT INTO yzh2_sync (bit_column, blob_column, char_column,date_column, datetime_column, decimal_column,double_column, float_column, int_column,longblob_column, longtext_column,mediumblob_column, mediumint_column,mediumtext_column, smallint_column,text_column, time_column, timestamp_column,tinyint_column, tinytext_column,varchar_column)VALUES(y, y, y, now(), now(), y, y, y, y, y, y, y, y, y, y, y,now(), now(), y, y, y);SET y=y+1;END WHILE ;commit;END //

{ CALL xag.test_insert() }

开发过程中经常需要测试 SQL 在大量数据集时候的执行效率,这就需要我们在表中插入大量的测试数据,下面介绍如何使用存储过程插入大量的测试数据

定义常用方法

我们要确保生成的测试数据要有足够的随机性,测试结果才会更准确,如果某个字段的测试数据都是一样的,索引的效率会大大折扣,测试结果往往与真实数据的执行结果大相径庭

我们可以使用 MySQL 的自定义函数来实现随机值的生成,下面罗列出几种常见的字段的函数定义

生成随机时间

函数声明:

CREATE DEFINER=`root`@`%` FUNCTION `genDate`(start_time VARCHAR(10),end_time VARCHAR(10)) RETURNS VARCHAR(255) CHARSET utf8mb4BEGINDECLARE random_date DATETIME DEFAULT NULL;SET random_date = CONCAT((DATE(FROM_UNIXTIME(UNIX_TIMESTAMP(start_time) + FLOOR(RAND() * (UNIX_TIMESTAMP(end_time) - UNIX_TIMESTAMP(start_time) + 1))))), ' ', FLOOR(RAND() * 24), ':', FLOOR(RAND() * 60), ':', FLOOR(RAND() * 60));RETURN date_format(random_date,'%Y-%m-%d %H:%i:%s');ENDselect genDate('-01-01','-01-01');

生成中文名

函数声明:

CREATE DEFINER=`root`@`%` FUNCTION `genUsername`() RETURNS varchar(255) CHARSET utf8mb4BEGINDECLARE first_name_dict VARCHAR(2056) DEFAULT '赵钱孙李周郑王冯陈楮卫蒋沈韩杨朱秦尤许何吕施张孔曹严华金魏陶姜戚谢喻柏水窦章云苏潘葛奚范彭郎鲁韦昌马苗凤花方俞任袁柳酆鲍史唐费廉岑薛雷贺倪汤滕殷罗毕郝邬安常乐于时傅皮齐康伍余元卜顾孟平黄和穆萧尹姚邵湛汪祁毛禹狄米贝明臧计伏成戴谈宋茅庞熊纪舒屈项祝董梁杜阮蓝闽席季麻强贾路娄危江童颜郭梅盛林刁锺徐丘骆高夏蔡田樊胡凌霍虞万支柯昝管卢莫经裘缪干解应宗丁宣贲邓郁单杭洪包诸左石崔吉钮龚程嵇邢滑裴陆荣翁';DECLARE last_name_dict VARCHAR(2056) DEFAULT '嘉懿煜城懿轩烨伟苑博伟泽熠彤鸿煊博涛烨霖烨华煜祺智宸正豪昊然明杰诚立轩立辉峻熙弘文熠彤鸿煊烨霖哲瀚鑫鹏致远俊驰雨泽烨磊晟睿天佑文昊修洁黎昕远航旭尧鸿涛伟祺轩越泽浩宇瑾瑜皓轩擎苍擎宇志泽睿渊楷瑞轩弘文哲瀚雨泽鑫磊梦琪忆之桃慕青问兰尔岚元香初夏沛菡傲珊曼文乐菱痴珊恨玉惜文香寒新柔语蓉海安夜蓉涵柏水桃醉蓝春儿语琴从彤傲晴语兰又菱碧彤元霜怜梦紫寒妙彤曼易南莲紫翠雨寒易烟如萱若南寻真晓亦向珊慕灵以蕊寻雁映易雪柳孤岚笑霜海云凝天沛珊寒云冰旋宛儿绿真盼儿晓霜碧凡夏菡曼香若烟半梦雅绿冰蓝灵槐平安书翠翠风香巧代云梦曼幼翠友巧听寒梦柏醉易访旋亦玉凌萱访卉怀亦笑蓝春翠靖柏夜蕾冰夏梦松书雪乐枫念薇靖雁寻春恨山从寒忆香觅波静曼凡旋以亦念露芷蕾千兰新波代真新蕾雁玉冷卉紫山千琴恨天傲芙盼山怀蝶冰兰山柏翠萱乐丹翠柔谷山之瑶冰露尔珍谷雪乐萱涵菡海莲傲蕾青槐冬儿易梦惜雪宛海之柔夏青亦瑶妙菡春竹修杰伟诚建辉晋鹏天磊绍辉泽洋明轩健柏煊昊强伟宸博超君浩子骞明辉鹏涛炎彬鹤轩越彬风华靖琪明诚高格光华国源宇晗昱涵润翰飞翰海昊乾浩博和安弘博鸿朗华奥华灿嘉慕坚秉建明金鑫锦程瑾瑜鹏经赋景同靖琪君昊俊明季同开济凯安康成乐语力勤良哲理群茂彦敏博明达朋义彭泽鹏举濮存溥心璞瑜浦泽奇邃祥荣轩';DECLARE first_name VARCHAR(3) DEFAULT substring(first_name_dict, floor(length(first_name_dict) / 3 * rand()), 1);DECLARE last_name VARCHAR(9);DECLARE full_name_length INT DEFAULT FLOOR(2+(RAND()*3))*3;DECLARE full_name VARCHAR(12) DEFAULT first_name;WHILE LENGTH(full_name) < full_name_length DOSET full_name = CONCAT(full_name, substring(last_name_dict, floor(length(last_name_dict) / 3 * rand()), 1));END WHILE;return full_name;endselect genUsername();

字符串分割选取

函数声明:

CREATE FUNCTION `splitStr` (str VARCHAR (1000),delimiter VARCHAR (5),str_order INT) RETURNS VARCHAR (255) CHARSET utf8mb4 DETERMINISTICBEGINDECLARE result VARCHAR (255) DEFAULT '';SET result = REVERSE(substring_index(REVERSE(substring_index(str,delimiter,str_order)),delimiter,1));RETURN result;endselect splitStr('I love MySQL',' ',2);

使用示例:该函数用于将字符串按照指定的分割符进行分割,并返回分割后的第 n(n 由参数指定) 个字符串,如取字符串”I love MySQL“按空格分割后的第 2 个字符串

生成随机手机号

函数声明:

CREATE DEFINER=`root`@`%` FUNCTION `genMobile`() RETURNS char(11) CHARSET utf8mb4 NOT DETERMINISTICBEGINDECLARE head VARCHAR(100) DEFAULT '132,133,139,183,186,187,130,131,189,151,156,157,176,134,135,137,138,136,000';DECLARE content CHAR(10) DEFAULT '0123456789';DECLARE phone CHAR(20) DEFAULT splitStr(head, ',', FLOOR(1 + RAND() * 19));DECLARE i int DEFAULT 1;WHILE i<9 DOSET i=i+1;SET phone = CONCAT(phone, substring(content, floor(1 + RAND() * 10), 1));END WHILE;RETURN phone;endselect genMobile();

插入大量测试数据

如下面这张表,现在要插入 10w 的测试数据,我们可以定义一个 MySQL 存储过程,通过存储过程的方式插入数据到表中

表结构

CREATE TABLE `t_user` (`user_id` int(11) NOT NULL AUTO_INCREMENT,`username` varchar(50) DEFAULT NULL,`sex` tinyint(1) DEFAULT NULL,`mobile` varchar(45) DEFAULT NULL,`create_time` datetime DEFAULT CURRENT_TIMESTAMP,PRIMARY KEY (`user_id`),KEY `idx_create_time` (`create_time`) USING BTREE) ENGINE=InnoDB AUTO_INCREMENT=100001 DEFAULT CHARSET=utf8mb4

存储过程定义

CREATE DEFINER=`root`@`%` PROCEDURE `t_user_batch_insert`(IN size INT)BEGINdeclare i int default 0;while i < size doinsert into t_user(username,sex,mobile) values(genUsername(),floor(rand() * 2),genMobile());set i = i + 1;end while;END

调用存储过程

>callt_user_batch_insert(100000);

在我这边,插入 10w 条数据,只要 52s

延伸

除了使用存储过程的方法插入数据外,还可以通过代码的方式插入数据,但是该方法的执行效率不高,但是改方法的执行效率不高。另外,如果你有 navicat 的话,也可以试试 navicat 的数据生成方案,由于我没有 navicat,就不介绍了,感兴趣的可以看 navicat 的文档

本内容不代表本网观点和政治立场,如有侵犯你的权益请联系我们处理。
网友评论
网友评论仅供其表达个人看法,并不表明网站立场。