數(shù)據(jù)庫批量導(dǎo)入策略調(diào)優(yōu)實(shí)戰(zhàn) #9
高效地加载大量数据对于数据库性能至关重要,尤其是在处理大规模数据集时。本指南介绍了在不同数据库平台上优化数据加载的关键技术。
下面是一些关键的优化技巧 1 事务处理通过将数据打包成一个事务来减少提交次数。
-- 注释:自动提交模式下的低效插入操作
INSERT INTO sales_data VALUES (...);
INSERT INTO sales_data VALUES (...);
-- 优化的(单一事务)
BEGIN;
INSERT INTO sales_data VALUES
(...),
(...);
COMMIT;
2. 批量加载命令
PostgreSQL 数据复制:
COPY sales_data (sale_id, sale_rep_id, sale_date, car_model,
sale_amount, commission_pct, sale_status)
FROM '/path/to/data.csv'
DELIMITER ',' CSV HEADER;
MySQL 的替代选择:
LOAD DATA INFILE '/path/to/data.csv'
INTO TABLE sales_data
FIELDS TERMINATED BY ',';
从 '/path/to/data.csv' 加载数据到 sales_data 表中,字段由逗号分隔。
SQL Server 的替代方案:
BULK INSERT sales_data
FROM 'C:\data.csv'
WITH (FIELDTERMINATOR = ',', ROWTERMINATOR = '\n');
性能提升方法
1. 暂时关闭索引:
-- 在加载数据之前先删除索引
DROP INDEX IF EXISTS idx_sales_car_model;
-- 执行批量加载操作
COPY sales_data FROM '/path/to/data.csv' CSV;-- 重建索引:
CREATE INDEX idx_sales_car_model ON sales_data(car_model);
2. 禁用约束
-- 禁用触发器
ALTER TABLE sales_data DISABLE TRIGGER ALL;
-- 加载数据文件
COPY sales_data FROM '/path/to/data.csv' CSV;-- 启用之前被禁用的约束
ALTER TABLE sales_data ENABLE TRIGGER ALL;
3. 优化设置
-- 提高维护操作所需的内存
SET maintenance_work_mem = '1GB'
-- 增加WAL的大小
SET max_wal_size = '4GB';-- 加载后重置为默认值
SET maintenance_work_mem = '64MB';-- 设置维护工作内存为64MB
4. 使用未注册的表:
-- 创建未记录 的 暂存表
CREATE UNLOGGED TABLE sales_staging (
sale_id SERIAL PRIMARY KEY,
sale_rep_id INTEGER,
sale_amount DECIMAL(10,2)
);
-- 将数据加载到暂存表中.
COPY sales_staging FROM '/path/to/data.csv' CSV;-- 将数据从暂存表转移到永久表.
INSERT INTO sales_data
SELECT * FROM sales_staging;
最好的做法
预加载准备
- 估算数据量
- 规划存储需求
- 准备暂存区
- 备份现有的数据
- 监控系统资源使用情况
- 追踪进度
- 记录错误信息
- 处理重复
- 验证数据的完整性
- 更新统计数据
- 重建索引结构
- 重新启用约束
-- 分析销售数据
ANALYZE sales_data;
-- 加载完大量数据后,运行这个命令来清理数据库:VACUUM ANALYZE sales_data;
VACUUM ANALYZE sales_data;
MySQL(一种开源的关系型数据库管理系统) -- 在加载后优化销售数据表
OPTIMIZE TABLE sales_data;
-- 分析销售数据表
ANALYZE TABLE sales_data;
SQL Server
-- 更新统计数据
UPDATE STATISTICS sales_data
-- 重新构建索引(REBUILD INDEX)
ALTER INDEX ALL ON sales_data REBUILD; -- (重新构建sales_data表上的所有索引)
常见错误
资源限制
- 磁盘空间不足。
- 内存不足。
- 网络连接问题。
- 格式无效
- 缺少值
- 重复记录
- 同时在线用户的影响
- 系统变慢的影响
- 事务日志的增长
-- 检查已加载的行数
SELECT COUNT(*) FROM sales_data
-- 监控空间使用
SELECT pg_size_pretty(pg_total_relation_size('sales_data'));
2. 性能表现
-- 检查加载时间
SELECT current_timestamp, count(*)
FROM sales_data;
-- 检查包含COPY命令的活动查询,
SELECT * FROM pg_stat_activity
WHERE query LIKE '%COPY%';
概要:
高效批量加载的关键要点包括:
- 充分的准备和规划
- 优化的数据库配置
- 选用合适的加载技术
- 仔细监控并验证
- 使用批量加载命令而不是逐一插入
- 在加载过程中禁用不必要的约束和索引
- 优化数据库配置以适应批量操作
- 加载完成后检查数据的完整性
- 加载完成后更新统计信息并重建索引
點(diǎn)擊查看更多內(nèi)容
為 TA 點(diǎn)贊
評(píng)論
評(píng)論
共同學(xué)習(xí),寫下你的評(píng)論
評(píng)論加載中...
作者其他優(yōu)質(zhì)文章
正在加載中
感謝您的支持,我會(huì)繼續(xù)努力的~
掃碼打賞,你說多少就多少
贊賞金額會(huì)直接到老師賬戶
支付方式
打開微信掃一掃,即可進(jìn)行掃碼打賞哦