表创建成功后,在 order 表单中,建立存储过程,并随机插入 20,000 行数据,查看租户资源的使用大小,并与 MySQL 数据库的数据进行比较。
由于条件限制,本教程仅 20,000 行数据为例,如您时间充裕,可尝试插入 10,000,000 数据, 数据量越大压缩效果越明显。
概念介绍
存储过程是一条或多条语句的集合,对数据库进行一系列复杂操作时,存储过程可以在数据库内将这类复杂操作封装成一个代码块,以便重复使用,从而减少数据库开发人员的工作量。存储过程旨在完成特定功能的 SQL 语句集,经编译创建并保存在数据库中,用户可以通过指定存储过程名并指定所需参数来调用执行,利用存储过程可以加速 SQL 语句的执行。更多内容参见新建存储过程。
在存储程序中可以使用系统变量和用户定义变量,存储程序可以使用 DECLARE 来定义局部变量,存储例程(过程和函数)可以声明参数,以在例程及其调用者之间传递值。更多内容参见存储程序的变量。
操作步骤
打开新的 SQL 窗口。
单击 请选择数据库, 进入 tutorial_database 数据库。
执行如下命令,建立一个存储过程,并向表中插入随机生成的数据。
drop procedure if exists generate_orders; delimiter $$ create procedure generate_orders ( IN `num_rows` int(11)) BEGIN DECLARE i INT DEFAULT 0; DECLARE customer_id INT DEFAULT 1; DECLARE order_date DATETIME; DECLARE shipping_date DATETIME; DECLARE `status` VARCHAR(10); DECLARE subtotal DECIMAL(10, 2); DECLARE tax DECIMAL(10, 2); DECLARE shipping DECIMAL(10, 2); DECLARE total DECIMAL(10, 2); DECLARE `address` VARCHAR(200); DECLARE city VARCHAR(100); DECLARE `state` VARCHAR(50); DECLARE country VARCHAR(50); DECLARE zip_code VARCHAR(20); DECLARE phone VARCHAR(20); DECLARE email VARCHAR(100); DECLARE created_at DATETIME; DECLARE updated_at DATETIME; SET i = 1; SET order_date = NOW(); WHILE i <= num_rows DO SET customer_id = FLOOR(RAND() * 100) + 1; SET shipping_date = ADDDATE(order_date, INTERVAL FLOOR(RAND() * 30) DAY); SET status = CASE FLOOR(RAND() * 4) WHEN 0 THEN 'Pending' WHEN 1 THEN 'Processing' WHEN 2 THEN 'Shipped' ELSE 'Delivered' END; SET subtotal = ROUND(RAND() * 1000, 2); SET tax = ROUND(subtotal * 0.1, 2); SET shipping = ROUND(RAND() * 100, 2); SET total = subtotal + tax + shipping; SET address = CONCAT('Address ', FLOOR(RAND() * 1000)); SET city = 'City'; SET state = 'State'; SET country = 'Country'; SET zip_code = '12345'; SET phone = '1234567890'; SET email = CONCAT('customer', customer_id, '@example.com'); SET created_at = NOW(); SET updated_at = NOW(); INSERT INTO `orders` ( `customer_id`, `order_date`, `shipping_date`, `status`, `subtotal`, `tax`, `shipping`, `total`, `address`, `city`, `state`, `country`, `zip_code`, `phone`, `email`, `created_at`, `updated_at` ) VALUES ( customer_id, order_date, shipping_date, status, subtotal, tax, shipping, total, address, city, state, country, zip_code, phone, email, created_at, updated_at ); SET i = i + 1; END WHILE; END $$ delimiter ;
单击运行按钮,查看运行结果。
运行成功后打开新的 SQL 窗口,执行如下命令,调用存储过程,并生成 20,000 行数据。
call generate_orders(20000);
运行成功后打开新的 SQL 窗口,执行如下命令,验证当前表的数据量,返回 20,000 时,则表示当前表中数据生成成功。
select count(*) from orders;
查看运行结果:
返回租户工作台,查看已使用存储大小,数据越大越准确,以实际效果为准。
压缩比能力分析
在同等数据量情况下,OceanBase 数据库生成 20,000 行数据所占用的资源仅为 Mysql/Oracle 的 1/4 到 1/3,可降低存储成本 70%-90%。数据量越大时,压缩效果越显著。如您时间充裕,可尝试插入更多数据。
上述数据仅供参考,实际数值请以您的实际实验结果为准。