如果你对大数据开发充满好奇,但苦于零基础不知从何入手,这系列文章就是为你量身定制的!
零门槛入门:无需编程经验,从最基础的SQL查询讲起,手把手带你理解数据操作的核心逻辑。
实战为王:每章附赠真实场景练习题,边学边练,拒绝纸上谈兵。
转行利器:内容直击企业高频需求(数据清洗、分析、可视化),搭配职场避坑指南,助你快速构建“可迁移技能”。
系统进阶:从数据类型到复杂查询,从运算符到执行顺序,层层递进,帮你搭建扎实的大数据地基。
无论你是学生、职场新人,还是想跨界转行的探索者,跟着这份指南,用一杯伯牙绝弦的时间,迈出大数据开发的第一步!
🎉 致亲爱的读者朋友们:
📢 放心追更!本系列文章每日三篇干货更新,助你稳扎稳打!
🎥 配套视频解说正在全力打磨中,即将震撼上线——
🔥 关注收藏不迷路,精彩内容绝不辜负!
目录
-
增量同步概述
-
核心逻辑与实现步骤
-
关键技术:MERGE INTO与存储过程
-
代码示例解析
-
实战练习
-
常见面试题
-
总结与注意事项
1. 增量同步概述
-
定义:仅同步源表新增或修改的数据,保留目标表原有数据。
-
适用场景:
-
数据量大,全量同步成本高。
-
高频更新(如订单状态、库存变动)。
-
-
核心步骤:
-
筛选源表增量数据(如按时间戳、日志)。
-
使用
MERGE INTO
语句更新或插入目标表。
-
2. 核心逻辑与实现步骤
逻辑流程图
复制
源表增量数据 → 按条件筛选 → MERGE INTO目标表 → 存在则更新,不存在则插入
实现步骤
-
筛选增量数据:通过时间戳(如
last_update_date
)或日志标识增量记录。 -
执行MERGE INTO:匹配目标表数据,动态更新或插入。
-
封装存储过程:支持参数化日期或条件,增强复用性。
3. 关键技术
MERGE INTO语句
-
语法结构:
sql
MERGE INTO 目标表 USING (增量数据子查询) ON (匹配条件) WHEN MATCHED THEN UPDATE SET ... WHEN NOT MATCHED THEN INSERT ...;
-
作用:单次操作实现更新与插入,避免多次查询。
存储过程设计
-
优势:
-
参数化日期(如
p_dt
)实现动态同步。 -
事务控制(
COMMIT
/ROLLBACK
)确保数据一致性。 -
异常捕获(
EXCEPTION
)防止同步中断。
-
4. 代码示例解析
基础增量同步
sql
-- 存储过程示例:按日期同步员工数据
CREATE OR REPLACE PROCEDURE p_zengliang(p_dt DATE) IS
BEGIN
MERGE INTO emp_tar a
USING (SELECT * FROM emp_source WHERE last_update_date = p_dt) b
ON (a.empno = b.empno)
WHEN MATCHED THEN
UPDATE SET a.sal = b.sal, a.etl_dt = SYSDATE
WHEN NOT MATCHED THEN
INSERT VALUES (b.empno, b.ename, ..., SYSDATE);
COMMIT;
EXCEPTION
WHEN OTHERS THEN ROLLBACK;
END;
图书增量同步实战
sql
-- 按天同步图书数据
CREATE OR REPLACE PROCEDURE p_bookzl(p_date DATE) IS
BEGIN
MERGE INTO book_target a
USING (SELECT * FROM book_source WHERE TRUNC(last_update_date) = p_date) b
ON (a.bno = b.bno)
WHEN MATCHED THEN
UPDATE SET a.price = b.price, a.etl_date = SYSDATE
WHEN NOT MATCHED THEN
INSERT VALUES (b.bno, b.bname, ..., SYSDATE);
COMMIT;
END;
5. 实战练习
-
基础练习:编写存储过程,将
order_source
表的当日增量数据同步到order_target
表,按order_id
匹配。 -
进阶练习:设计支持多日期范围(如近7天)的增量同步逻辑,避免重复处理。
-
思考题:如果源表没有时间戳字段,如何实现增量同步?
6. 常见面试题
-
MERGE INTO的优缺点:
-
优点:原子性操作,减少网络开销。
-
缺点:复杂条件可能导致性能问题。
-
-
如何选择增量字段?
-
推荐使用时间戳、自增ID或数据库日志(如Oracle Redo Log)。
-
-
处理数据冲突:
-
通过唯一索引或业务逻辑去重(如保留最新记录)。
-
-
增量同步的性能优化:
-
索引优化、分批处理、并行执行。
-
7. 总结与注意事项
-
核心要点:筛选增量 → 匹配更新 → 事务控制 → 异常处理。
-
注意事项:
-
确保增量字段可靠(如避免时间戳篡改)。
-
高频同步需监控性能,避免锁表。
-
测试极端场景(如源表与目标表字段不一致)。
-
-
适用性:适合大数据量、高频更新;不适用无变化追踪的场景。
附录:完整代码与练习答案
全量同步与增量同步的区别:
1 全量同步是同步整张表的数据,增量同步只同步增量数据(比如今天只同步昨天新增的或者修改的数据)
2 全量同步之前要清空目标表的数据,增量同步不用清空表,有则更新,无则插入;
--增量指的是那一天新增的或者发生修改的数据
--- 增量同步
逻辑:用源表的数据 更新 目标表 ,如果这条数据在目标表中存在则更新,数据不存在,则插入。
实现的逻辑:首先判断 目标表中是否有源表中的数据,
如果有 ,则用 源表的数据 更新目标表中对应的数据。
如果没有,则查询源表的记录,直接插入目标表。
把a表数据 增量同步到b表中
来源表:a表
1224:
m f
1 11
2 22
3 33
1225:
m f
1 11aa
2 22
3 33
4 44
5 55
目标表:b表
1224:
m f
1 11
2 22
3 33
1225:
m f
从来源表里面拿到增量数据的查询结果集:
1 11aa
4 44
5 55
********目标表数据和来源表数据保持一致(数据量 数据内容)************
用 merge into 的方式来做增量同步数据
--语法结构
merge into 目标表
using (增量数据的查询结果集) --子查询 查询源表的增量结果集
on (匹配字段)--用来判断增量结果集里的数据到底是更新目标表里的数据还是插入到目标表中
when matched then update set 目标表的字段 = 增量结果集字段 --update和set之间不需要加表名
when not matched then insert(目标表字段) values(增量结果集字段) ; --insert和values之间不需要加 into 表名
示例:
假如在昨天公司里新增一个员工和 7788 这个员工的薪资发生了变化
用存储过程实现,将emp_source表的数据增量同步到emp_tar
select * from emp_tar;
select * from emp_source;
--
--truncate table emp_tar;
--源表发生变化
insert into emp_source
(empno, ename, hiredate, create_date, last_update_date)
values
(2222,
'lisi',
trunc(sysdate) - 1,
trunc(sysdate) - 1,
trunc(sysdate) - 1);
update emp_source
set sal = 1, last_update_date = trunc(sysdate) - 1
where empno = 7499;
--delete from emp_tar where empno =1111;
select * from emp_tar;
select * from emp_source;
--增量同步
create or replace procedure p_zengliang(p_dt date) is
begin
merge into emp_tar a --目标表
using (select * from emp_source where last_update_date = p_dt) b --源表增量结果集
on (a.empno = b.empno)
when matched then
update
set --a.empno=b.empno,
a.ename = b.ename,
a.job = b.job,
a.mgr = b.mgr,
a.hiredate = b.hiredate,
a.sal = b.sal,
a.comm = b.comm,
a.deptno = b.deptno,
a.etl_dt = sysdate
when not matched then
insert
(a.empno,
a.ename,
a.job,
a.mgr,
a.hiredate,
a.sal,
a.comm,
a.deptno,
a.etl_dt)
values
(b.empno,
b.ename,
b.job,
b.mgr,
b.hiredate,
b.sal,
b.comm,
b.deptno,
sysdate);
commit;
exception
when others then
rollback;
end;
begin
p_zengliang(trunc(sysdate)-1);
end;
---增量练习
--书 book_source表
create table book(bno varchar2(20),--图书编号
bname varchar2(50),--图书名称
aid int,--作者
pid int,--出版社
tid varchar2(20),--种类
buy date,--进货日期
price number(7,2),--价格
buynum int); --数量
insert into book values('j0001','计算机基础',2001,1001,'j001',date '2016-1-5',12.5,5);
insert into book values('j0002','oracle从入门到精通',2002,1004,'j001',date '2016-8-8',30,10);
insert into book values('y0001','常见病例及用药',2005,1003,'y001',date '2016-2-4',20,20);
insert into book values('w0001','平凡的世界',2006,1003,'w001',date '2016-5-15',35,30);
insert into book values('w0002','悲惨世界',2007,1004,'w001',date '2016-4-9',31,22);
insert into book values('j0003','sql入门',2001,1004,'j001',date '2016-2-15',32,20);
insert into book values('j0004','sql基础课程',2002,1001,'j001',date '2016-6-6',28,10);
select * from book; --书(主表)
--drop table book_source;
--造数据
create table book_source
as
select t.*
---假如昨天写入的这些数据
,sysdate -1 as create_date
,sysdate -1 as last_update_date
from book t;
---目标表
create table book_target(bno varchar2(20) ,--图书编号
bname varchar2(50),--图书名称
aid int,--作者
pid int,--出版社
tid varchar2(20),--种类
buy date,--进货日期
price number(7,2),--价格
buynum int
,etl_date date);
--1 开发一个增量同步数据的存储过程按天同步,将book_source 的数据同步到 book_target
第一次调用数据同步了昨天的数据之后,将book_source 修改一下,改成今天的数据,再调用
存储过程同步一次今天的数据
create or replace procedure p_bookzl(p_date date) is
begin
merge into book_target a
using (select * from book_source where trunc(last_update_date) = p_date) b
on (a.bno = b.bno)
when matched then
update
set a.bname = b.bname,
a.aid = b.aid,
a.pid = b.pid,
a.tid = b.tid,
a.buy = b.buy,
a.price = b.price,
a.buynum = b.buynum,
a.etl_date = sysdate
when not matched then
insert
(a.bno,
a.bname,
a.aid,
a.pid,
a.tid,
a.buy,
a.price,
a.buynum,
a.etl_date)
values
(b.bno,
b.bname,
b.aid,
b.pid,
b.tid,
b.buy,
b.price,
b.buynum,
sysdate);
commit;
exception
when others then
rollback;
end;
--第一次调用
begin
p_bookzl(trunc(sysdate)-1 );
end;
--来源表数据发生变更
insert into book_source
(bno, bname, pid, create_date, last_update_date)
values
(2222, 'lisi', 1007, trunc(sysdate), trunc(sysdate));
update book_source
set bname = '计算机基础1', last_update_date = trunc(sysdate)
where bno = 'j0004';
select * from book_source;
select * from book_target;
--第二次调用 日期是20241225
begin
p_bookzl(trunc(sysdate)-1 );
end;