--Kiểm tra 10 bảng lớn nhất
SELECT
n.nspname AS schema_name,
c.relname AS table_name,
pg_size_pretty(pg_total_relation_size(c.oid)) AS total_size,
pg_size_pretty(pg_relation_size(c.oid)) AS table_size,
pg_size_pretty(pg_indexes_size(c.oid)) AS index_size,
pg_total_relation_size(c.oid) AS total_size_bytes
FROM pg_class c
JOIN pg_namespace n ON n.oid = c.relnamespace
WHERE c.relkind = 'r'
AND n.nspname NOT IN ('pg_catalog', 'information_schema')
ORDER BY pg_total_relation_size(c.oid) DESC
LIMIT 10;
--Partition: 3 "app_data.request_his" "31 GB" Partition để tránh rủi ro Partition theo ngày created_date và lưu 6 tháng Partition theo ngày created_date và lưu 6 tháng
--Partition: 4 "app_data.request_his_log" "12 GB" Partition để tránh rủi ro Partition theo ngày created_date và lưu 6 tháng Partition theo ngày created_date và lưu 6 tháng
--request_his
--+"2025-06-18 22:29:21.679138+07" "2026-04-06 11:19:15.310644+07"
select min(created_date), max(created_date) from app_data.request_his;
select count(*) from app_data.request_his; --21.829.446
--select min(created_date), max(created_date) from app_data.request_his_log_part;
--select * from app_data.request_his_log_part;
--request_his_log
--+"2024-10-09 05:51:22.99991+07" "2025-01-22 22:33:47.797261+07"
select count(*) from app_data.request_his_log; --7.706.966
--"2024-10-09 05:51:22.99991+07" "2025-01-22 22:33:47.797261+07"
select min(created_date), max(created_date) from app_data.request_his_log;
/***** STEP 1 — Tạo bảng PARTITION *****/
--Bước này chỉ tạo khung, chưa chứa data.
--request_his_NEW
CREATE TABLE app_data.request_his_NEW
(
LIKE app_data.request_his INCLUDING ALL
)
PARTITION BY RANGE (created_date);
--request_his_log_new
CREATE TABLE app_data.request_his_log_NEW
(
LIKE app_data.request_his_log INCLUDING ALL
)
PARTITION BY RANGE (created_date);
/***** STEP 2 — Tạo DAILY PARTITIONS ****/
--request_his_new
--Cach 1:
SELECT format(
'CREATE TABLE IF NOT EXISTS app_data.request_his_NEW_%s
PARTITION OF app_data.request_his_NEW
FOR VALUES FROM (%L) TO (%L);',
to_char(d,'YYYYMMDD'),
d::timestamp,
(d + interval '1 day')::timestamp
)
FROM generate_series(
(SELECT date(min(created_date)) FROM app_data.request_his),
(SELECT date(max(created_date)) + 7 FROM app_data.request_his),
interval '1 day'
) AS d;
--Cach 2:Dưới đây là script sinh partition cho bảng app_data.request_his_new:
--Bắt đầu: 2025-10-01, Kết thúc: 2026-12-31
--Partition theo ngày
--Dùng ranh giới theo giờ Việt Nam Asia/Ho_Chi_Minh
--B1) Script sinh ra các câu lệnh CREATE TABLE
SELECT format(
$fmt$
CREATE TABLE IF NOT EXISTS app_data.request_his_new_%s
PARTITION OF app_data.request_his_new
FOR VALUES FROM (%L) TO (%L);
$fmt$,
to_char(d::date, 'YYYYMMDD'),
(d::date::timestamp AT TIME ZONE 'Asia/Ho_Chi_Minh'),
((d::date + 1)::timestamp AT TIME ZONE 'Asia/Ho_Chi_Minh')
)
FROM generate_series(
date '2025-10-01',
date '2026-12-31',
interval '1 day'
) AS gs(d);
--B2) Nếu muốn chạy tạo partition luôn
--Script này tạo trực tiếp, không cần copy kết quả ra ngoài:
DO $$
DECLARE
d date;
v_sql text;
BEGIN
FOR d IN
SELECT gs::date
FROM generate_series(
date '2025-10-01',
date '2026-12-31',
interval '1 day'
) AS gs
LOOP
v_sql := format(
'CREATE TABLE IF NOT EXISTS app_data.request_his_new_%s
PARTITION OF app_data.request_his_new
FOR VALUES FROM (%L) TO (%L);',
to_char(d, 'YYYYMMDD'),
(d::timestamp AT TIME ZONE 'Asia/Ho_Chi_Minh'),
((d + 1)::timestamp AT TIME ZONE 'Asia/Ho_Chi_Minh')
);
EXECUTE v_sql;
END LOOP;
END
$$;
--B3) Nếu chưa có bảng cha _new
CREATE TABLE IF NOT EXISTS app_data.request_his_new
(
LIKE app_data.request_his
)
PARTITION BY RANGE (created_date);
--B4) Nên tạo thêm default partition
CREATE TABLE IF NOT EXISTS app_data.request_his_new_default
PARTITION OF app_data.request_his_new DEFAULT;
--B5) Kiểm tra nhanh các partition đã tạo
SELECT
c.relname AS partition_name
FROM pg_inherits i
JOIN pg_class c ON c.oid = i.inhrelid
JOIN pg_class p ON p.oid = i.inhparent
JOIN pg_namespace n ON n.oid = c.relnamespace
WHERE n.nspname = 'app_data'
AND p.relname = 'request_his_new'
ORDER BY c.relname;
--Nếu anh muốn, tôi sẽ viết tiếp luôn khối sinh lệnh chuyển dữ liệu từng ngày từ request_his sang request_his_new từ 2025-10-01 đến hết 2026-12-31, mỗi ngày BEGIN/COMMIT riêng.
--2/request_his_log_new
SELECT format(
'CREATE TABLE IF NOT EXISTS app_data.request_his_log_NEW_%s
PARTITION OF app_data.request_his_log_NEW
FOR VALUES FROM (%L) TO (%L);',
to_char(d,'YYYYMMDD'),
d::timestamp,
(d + interval '1 day')::timestamp
)
FROM generate_series(
(SELECT date(min(created_date)) FROM app_data.request_his_log),
(SELECT date(max(created_date)) + 7 FROM app_data.request_his_log),
interval '1 day'
) AS d;
--STEP 3 — Tạo DEFAULT PARTITION: dung de lam gi???
CREATE TABLE app_data.request_his_NEW_default
PARTITION OF app_data.request_his_NEW DEFAULT;
CREATE TABLE app_data.request_his_log_NEW_default
PARTITION OF app_data.request_his_log_NEW DEFAULT;
/***** STEP 4 — Insert TEST *****/
--Test Insert một phần nhỏ dữ liệu:
INSERT INTO app_data.request_his_new
SELECT *
FROM app_data.request_his
WHERE created_date >= TIMESTAMPTZ '2025-10-01 00:00:00+07'
AND created_date < TIMESTAMPTZ '2025-10-02 00:00:00+07';
commit;
select * from app_data.request_his_new;
--93.655
select count(*) from app_data.request_his_new;
SELECT * FROM app_data.request_his_log_new_20251001
LIMIT 100;
truncate
--INSERT INTO app_data.request_his_NEW
--SELECT *
--FROM app_data.request_his
--WHERE created_date >= now() - interval '3 days';
ANALYZE app_data.request_his_NEW;
--Test:
EXPLAIN ANALYZE
SELECT * FROM app_data.request_his_NEW
WHERE created_date = current_date;
--phải thấy Partition Pruning.
/*Xoa du lieu cu*/
truncate table app_data.request_his_new_20251001;
commit;
/**** STEP 5 — Migrate toàn bộ dữ liệu *****/
--KHÔNG insert 1 phát nếu bảng lớn.
--migrate theo batch: Tung ngay
/* Insert request_his_new tung thang thang 10_2.301.663, Tong 6 min 52 secs.*/
SELECT count(*)
FROM app_data.request_his /*10*/
WHERE created_date >= TIMESTAMPTZ '2025-10-01 00:00:00+07'
AND created_date < TIMESTAMPTZ '2025-11-01 00:00:00+07';
INSERT INTO app_data.request_his_new /*10*/
SELECT *
FROM app_data.request_his
WHERE created_date >= TIMESTAMPTZ '2025-10-01 00:00:00+07'
AND created_date < TIMESTAMPTZ '2025-11-01 00:00:00+07';
commit;
--SELECT count(*) FROM app_data.request_his_new_20251001;
--SELECT count(*) FROM app_data.request_his_new_20251002;
--SELECT count(*) FROM app_data.request_his_new_20251003;
--SELECT count(*) FROM app_data.request_his_new;
--select * from app_data.request_his_new LIMIT 100;
--93.655
--select count(*) from app_data.request_his_new;
-- SELECT * FROM app_data.request_his_log_new_20251001
--LIMIT 100;
INSERT INTO app_data.request_his_new /*11*/
SELECT *
FROM app_data.request_his
WHERE created_date >= TIMESTAMPTZ '2025-11-01 00:00:00+07'
AND created_date < TIMESTAMPTZ '2025-12-01 00:00:00+07';
commit;
INSERT INTO app_data.request_his_new /*12*/
SELECT *
FROM app_data.request_his
WHERE created_date >= TIMESTAMPTZ '2025-12-01 00:00:00+07'
AND created_date < TIMESTAMPTZ '2026-01-01 00:00:00+07';
commit;
INSERT INTO app_data.request_his_new /*01/2026*/
SELECT *
FROM app_data.request_his
WHERE created_date >= TIMESTAMPTZ '2026-01-01 00:00:00+07'
AND created_date < TIMESTAMPTZ '2026-02-01 00:00:00+07';
commit;
INSERT INTO app_data.request_his_new /*02/2026*/
SELECT *
FROM app_data.request_his
WHERE created_date >= TIMESTAMPTZ '2026-02-01 00:00:00+07'
AND created_date < TIMESTAMPTZ '2026-03-01 00:00:00+07';
commit;
INSERT INTO app_data.request_his_new /*03/2026*/
SELECT *
FROM app_data.request_his
WHERE created_date >= TIMESTAMPTZ '2026-03-01 00:00:00+07'
AND created_date < TIMESTAMPTZ '2026-04-01 00:00:00+07';
commit;
INSERT INTO app_data.request_his_new /*04/2026*/
SELECT *
FROM app_data.request_his
WHERE created_date >= TIMESTAMPTZ '2026-04-01 00:00:00+07'
AND created_date < TIMESTAMPTZ '2026-05-01 00:00:00+07';
commit;
INSERT INTO app_data.request_his_NEW
SELECT *
FROM app_data.request_his
WHERE created_date >= '2025-10-01'
AND created_date < '2025-10-01';
commit;
select * from app_data.request_his_NEW;
SELECT count(*)
FROM app_data.request_his
WHERE created_date >= '2025-12-01'
AND created_date < '2025-12-01';
commit;
--Check:
SELECT count(*) FROM app_data.request_his_new_20251001;
SELECT count(*) FROM app_data.request_his_new_20251101;
SELECT count(*) FROM app_data.request_his_new_20251201;
SELECT count(*) FROM app_data.request_his_new_20260101;
SELECT count(*) FROM app_data.request_his_new_20260201;
SELECT count(*) FROM app_data.request_his_new_20260301;
SELECT count(*) FROM app_data.request_his_new_20260401;
/* Lamtiep voi request_his_log_new */
INSERT INTO app_data.request_his_log_new /*10*/
SELECT *
FROM app_data.request_his_log
WHERE created_date >= TIMESTAMPTZ '2025-10-01 00:00:00+07'
AND created_date < TIMESTAMPTZ '2025-11-01 00:00:00+07';
commit;
INSERT INTO app_data.request_his_log_new /*11*/
SELECT *
FROM app_data.request_his_log
WHERE created_date >= TIMESTAMPTZ '2025-11-01 00:00:00+07'
AND created_date < TIMESTAMPTZ '2025-12-01 00:00:00+07';
commit;
INSERT INTO app_data.request_his_log_new /*12*/
SELECT *
FROM app_data.request_his_log
WHERE created_date >= TIMESTAMPTZ '2025-12-01 00:00:00+07'
AND created_date < TIMESTAMPTZ '2026-01-01 00:00:00+07';
commit;
INSERT INTO app_data.request_his_log_new /*01/2026*/
SELECT *
FROM app_data.request_his_log
WHERE created_date >= TIMESTAMPTZ '2026-01-01 00:00:00+07'
AND created_date < TIMESTAMPTZ '2026-02-01 00:00:00+07';
commit;
INSERT INTO app_data.request_his_log_new /*02/2026*/
SELECT *
FROM app_data.request_his_log
WHERE created_date >= TIMESTAMPTZ '2026-02-01 00:00:00+07'
AND created_date < TIMESTAMPTZ '2026-03-01 00:00:00+07';
commit;
INSERT INTO app_data.request_his_log_new /*03/2026*/
SELECT *
FROM app_data.request_his_log
WHERE created_date >= TIMESTAMPTZ '2026-03-01 00:00:00+07'
AND created_date < TIMESTAMPTZ '2026-04-01 00:00:00+07';
commit;
INSERT INTO app_data.request_his_log_new /*04/2026*/
SELECT *
FROM app_data.request_his_log
WHERE created_date >= TIMESTAMPTZ '2026-04-01 00:00:00+07'
AND created_date < TIMESTAMPTZ '2026-05-01 00:00:00+07';
commit;
--Check:
SELECT count(*) FROM app_data.request_his_log_new_20251001;
SELECT count(*) FROM app_data.request_his_log_new_20251101;
SELECT count(*) FROM app_data.request_his_log_new_20251201;
SELECT count(*) FROM app_data.request_his_log_new_20260101;
SELECT count(*) FROM app_data.request_his_log_new_20260201;
SELECT count(*) FROM app_data.request_his_log_new_20260301;
SELECT count(*) FROM app_data.request_his_log_new_20260401;
--mau
--INSERT INTO app_data.request_his_log_new
--SELECT *
--FROM app_data.request_his_log
--WHERE created_date >= '2025-10-01'
-- AND created_date < '2025-10-01';
--commit;
select * from app_data.request_his_log_new;
SELECT count(*)
FROM app_data.request_his_log
WHERE created_date >= '2025-12-01'
AND created_date < '2025-12-01';
commit;
--STEP 6 — Update statistics
VACUUM ANALYZE app_data.request_his_NEW;
VACUUM ANALYZE app_data.request_his_log_NEW;
--STEP 7 — VERIFY DATA:Phải bằng nhau.
SELECT count(*) FROM app_data.request_his;
SELECT count(*) FROM app_data.request_his_NEW;
SELECT count(*) FROM app_data.request_his_log;
SELECT count(*) FROM app_data.request_his_log_NEW;
--STEP 8 — CR CUTOVER (BAN ĐÊM)
--ock ngắn --downtime chỉ vài giây.
BEGIN;
ALTER TABLE app_data.request_his
RENAME TO request_his_OLD;
ALTER TABLE app_data.request_his_log
RENAME TO request_his_log_OLD;
--Truncate du lieu ngay 06/04/2026
tuncate table app_data.request_his_NEW_20260406;
tuncate table app_data.request_his_log_NEW_20260406;
-- Insert bu
insert into app_data.request_his_NEW
select * from app_data.request_his_old
WHERE created_date >= TIMESTAMPTZ '2026-04-06 00:00:00+07'
AND created_date < TIMESTAMPTZ '2026-04-07 00:00:00+07';
insert into app_data.request_his_log_NEW
select * from app_data.request_his_log_old
WHERE created_date >= TIMESTAMPTZ '2026-04-06 00:00:00+07'
AND created_date < TIMESTAMPTZ '2026-04-07 00:00:00+07';
COMMIT;
--doi ten bang
ALTER TABLE app_data.request_his_NEW
RENAME TO request_his;
ALTER TABLE app_data.request_his_log_NEW
RENAME TO request_his_log;
--STEP 9 — Cleanup (sau 3-5 ngày)
DROP TABLE app_data.request_his_OLD;
DROP TABLE app_data.request_his_log_OLD;
TƯ VẤN: Click Here hoặc Hotline/Zalo 090.29.12.888
=============================
Website không chứa bất kỳ quảng cáo nào, mọi đóng góp để duy trì phát triển cho website (donation) xin vui lòng gửi về STK 90.2142.8888 - Ngân hàng Vietcombank Thăng Long - TRAN VAN BINH
=============================
Nếu bạn không muốn bị AI thay thế và tiết kiệm 3-5 NĂM trên con đường trở thành DBA chuyên nghiệp hay làm chủ Database thì hãy đăng ký ngay KHOÁ HỌC ORACLE DATABASE A-Z ENTERPRISE, được Coaching trực tiếp từ tôi với toàn bộ bí kíp thực chiến, thủ tục, quy trình của gần 20 năm kinh nghiệm (mà bạn sẽ KHÔNG THỂ tìm kiếm trên Internet/Google) từ đó giúp bạn dễ dàng quản trị mọi hệ thống Core tại Việt Nam và trên thế giới, đỗ OCP.
- CÁCH ĐĂNG KÝ: Gõ (.) hoặc để lại số điện thoại hoặc inbox https://m.me/tranvanbinh.vn hoặc Hotline/Zalo 090.29.12.888
- Chi tiết tham khảo:
https://bit.ly/oaz_w
=============================
2 khóa học online qua video giúp bạn nhanh chóng có những kiến thức nền tảng về Linux, Oracle, học mọi nơi, chỉ cần có Internet/4G:
- Oracle cơ bản: https://bit.ly/admin_1200
- Linux: https://bit.ly/linux_1200
=============================
KẾT NỐI VỚI CHUYÊN GIA TRẦN VĂN BÌNH:
📧 Mail: binhoracle@gmail.com
☎️ Mobile/Zalo: 0902912888
👨 Facebook: https://www.facebook.com/BinhOracleMaster
👨 Inbox Messenger: https://m.me/101036604657441 (profile)
👨 Fanpage: https://www.facebook.com/tranvanbinh.vn
👨 Inbox Fanpage: https://m.me/tranvanbinh.vn
👨👩 Group FB: https://www.facebook.com/groups/DBAVietNam
👨 Website: https://www.tranvanbinh.vn
👨 Blogger: https://tranvanbinhmaster.blogspot.com
🎬 Youtube: https://www.youtube.com/@binhguru
👨 Tiktok: https://www.tiktok.com/@binhguru
👨 Linkin: https://www.linkedin.com/in/binhoracle
👨 Twitter: https://twitter.com/binhguru
👨 Podcast: https://www.podbean.com/pu/pbblog-eskre-5f82d6
👨 Địa chỉ: Tòa nhà Sun Square - 21 Lê Đức Thọ - Phường Mỹ Đình 1 - Quận Nam Từ Liêm - TP.Hà Nội
=============================
cơ sở dữ liệu, cơ sở dữ liệu quốc gia, database, AI, trí tuệ nhân tạo, artificial intelligence, machine learning, deep learning, LLM, ChatGPT, DeepSeek, Grok, oracle tutorial, học oracle database, Tự học Oracle, Tài liệu Oracle 12c tiếng Việt, Hướng dẫn sử dụng Oracle Database, Oracle SQL cơ bản, Oracle SQL là gì, Khóa học Oracle Hà Nội, Học chứng chỉ Oracle ở đầu, Khóa học Oracle online,sql tutorial, khóa học pl/sql tutorial, học dba, học dba ở việt nam, khóa học dba, khóa học dba sql, tài liệu học dba oracle, Khóa học Oracle online, học oracle sql, học oracle ở đâu tphcm, học oracle bắt đầu từ đâu, học oracle ở hà nội, oracle database tutorial, oracle database 12c, oracle database là gì, oracle database 11g, oracle download, oracle database 19c/21c/23c/23ai, oracle dba tutorial, oracle tunning, sql tunning , oracle 12c, oracle multitenant, Container Databases (CDB), Pluggable Databases (PDB), oracle cloud, oracle security, oracle fga, audit_trail,oracle RAC, ASM, oracle dataguard, oracle goldengate, mview, oracle exadata, oracle oca, oracle ocp, oracle ocm , oracle weblogic, postgresql tutorial, mysql tutorial, mariadb tutorial, ms sql server tutorial, nosql, mongodb tutorial, oci, cloud, middleware tutorial, docker, k8s, micro service, hoc solaris tutorial, hoc linux tutorial, hoc aix tutorial, unix tutorial, securecrt, xshell, mobaxterm, putty