在doris中,同步的物化视图主要用于单表,他可以实现提前对单表的数据进行预聚合,在单表写入数据的时候,就会在物化视图表里面对数据进行预聚合计算,并把结果写入到物化视图中,如果后期需要查询相关聚合数据的时候就不用进行实时聚合计算了,直接查询之前存储的结果即可。下面直接演示:
一、创建表
这里演示直接创建一张users表即可,创建sql如下:
-- 创建表 create table orders( --订单编号 order_id int, -- 购买用户id user_id int, -- 支付状态 1、未支付,2、已支付,3、退款中 4、已退款 order_status int, -- 支付方式,1:支付宝,2:微信 payment_method date, -- 支付金额 payable_amount DECIMAL, -- 创建时间 cts date ) distributed by hash(order_id) properties("replication_num" = "1");
二、插入数据
接着向orders表里面插入示例数据,由于示例数据的需求较多,所以这里编写一个java程序来生成模拟数据,数据的java示例代码如下:
package com.test; import java.text.DecimalFormat; import java.util.Random; public class Test2 { private static Random random = new Random(); private static DecimalFormat df = new DecimalFormat("#.00"); public static void main(String[] args) { int[] usersid = new int[] { 1, 2, 3, 4, 5 }; int[] status = new int[] { 1, 2 }; String[] payDates = new String[] { "2024-12-01", "2024-12-02", "2024-12-03", "2024-12-04", "2024-12-05" }; int totalNn = 1000; for (int i = 1; i <= totalNn; i++) { System.out.println("insert into orders values" + "(" + i + "," + usersid[random.nextInt(usersid.length)] + "," + status[random.nextInt(2)] + "," + status[random.nextInt(2)] + "," + getRandomAmount() + "," + "\"" + payDates[random.nextInt(payDates.length)] + "\"" + ");"); } } public static String getRandomAmount() { double randomDouble = 0; while (true) { randomDouble = random.nextDouble() * 100; // 生成0到100之间的随机数 if (randomDouble > 1) { break; } } String formattedDouble = df.format(randomDouble); // 格式化为两位小数 return formattedDouble; } }
这个程序是生成相关的执行sql的,如下:
他这些sql语句复制到navicat中直接执行即可:
三、创建物化视图
接下来给当前orders表创建一个预计算的物化视图,对应的sql语句如下:
CREATE TABLE `orders` (
`order_id` int NULL,
`user_id` int NULL,
`order_status` int NULL,
`payment_method` int NULL,
`payable_amount` decimal(38,9) NULL,
`cts` date NULL)
DISTRIBUTED BY HASH(`order_id`)
properties("replication_num" = "1");