在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");