验证数据压缩能力

表创建成功后,在 order 表单中,建立存储过程,并随机插入 20,000 行数据,查看租户资源的使用大小,并与 MySQL 数据库的数据进行比较。

说明

由于条件限制,本教程仅 20,000 行数据为例,如您时间充裕,可尝试插入 10,000,000 数据, 数据量越大压缩效果越明显。

概念介绍

存储过程是一条或多条语句的集合,对数据库进行一系列复杂操作时,存储过程可以在数据库内将这类复杂操作封装成一个代码块,以便重复使用,从而减少数据库开发人员的工作量。存储过程旨在完成特定功能的 SQL 语句集,经编译创建并保存在数据库中,用户可以通过指定存储过程名并指定所需参数来调用执行,利用存储过程可以加速 SQL 语句的执行。更多内容参见新建存储过程

在存储程序中可以使用系统变量和用户定义变量,存储程序可以使用 DECLARE 来定义局部变量,存储例程(过程和函数)可以声明参数,以在例程及其调用者之间传递值。更多内容参见存储程序的变量

操作步骤

  1. 打开新的 SQL 窗口。image.png

  2. 单击 请选择数据库, 进入 tutorial_database 数据库。image.png

  3. 执行如下命令,建立一个存储过程,并向表中插入随机生成的数据。

    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 ;
  1. 单击运行按钮,查看运行结果。image.png

  1. 运行成功后打开新的 SQL 窗口,执行如下命令,调用存储过程,并生成 20,000 行数据。

call generate_orders(20000);
  1. 运行成功后打开新的 SQL 窗口,执行如下命令,验证当前表的数据量,返回 20,000 时,则表示当前表中数据生成成功。

select count(*) from orders;

查看运行结果:

image.png

  1. 返回租户工作台,查看已使用存储大小,数据越大越准确,以实际效果为准。

image.png

压缩比能力分析

在同等数据量情况下,OceanBase 数据库生成 20,000 行数据所占用的资源仅为 Mysql/Oracle 的 1/4 到 1/3,可降低存储成本 70%-90%。数据量越大时,压缩效果越显著。如您时间充裕,可尝试插入更多数据。

说明

上述数据仅供参考,实际数值请以您的实际实验结果为准。