V4.x OceanBase 大表创建索引最佳实践步骤

V4.x OceanBase 大表创建索引最佳实践步骤

最佳实践操作步骤

为了确保在 OceanBase 中成功创建大表索引,以下是一些最佳实践的操作步骤,您可根据您实际业务情况选择最优方式进行操作:

  1. 评估表的现有统计信息:运行 SQL 查询以获取表的行数和平均行长,确保获取最新的统计信息。
-- 获取表级统计信息
SELECT NUM_ROWS, AVG_ROW_LEN
FROM ALL_TAB_STATISTICS
WHERE OWNER = 'xxx' AND TABLE_NAME = 'xxx' AND OBJECT_TYPE = 'TABLE';
  1. 临时空间计算:使用统计信息或内部表进行索引空间的估算,确保预留足够的临时空间。
  • 公式:index_size = data_size * (avg_column_length / avg_row_length)
-- 获取列级统计信息
SELECT TABLE_NAME, COLUMN_NAME, AVG_COL_LEN
FROM ALL_TAB_COL_STATISTICS
WHERE TABLE_NAME = 'xxx' AND OWNER = 'xxx';
  • 内部表估算
SELECT SUM(original_size)
FROM __all_virtual_tablet_sstable_macro_info
WHERE tablet_id IN (SELECT tablet_id FROM __all_virtual_tablet_to_table_history WHERE table_id = xxx);
  1. 资源规划:根据预估的空间和内存需求,调整 ObServer 的内存设置。确保 CPU 和 IO 资源可以满足并行度的需求。计算内存需求:
  • 临时文件元数据内存Memory = Temporary Space (GB) * 3.75MB
  • Channel 的 Range 信息Memory = Parallelism * Partition_Count * 1.5KB
  • DTL 缓冲区Memory = Parallelism * Parallelism * 64KB * 3临时文件压缩配置:如果您使用的 OceanBase 数据库是 V4.2.3 及以上,那么您如果执行创建索引的并行度大于等于 8,系统默认会对创建索引过程中产生的临时文件进行压缩。 如果并行度小于 8,且磁盘空间不足时,可以使用以下命令开启压缩以减少磁盘空间占用:
-- 开启压缩并使用指定的压缩算法
ALTER SYSTEM SET _ob_ddl_temp_file_compress_func = 'ZSTD'; -- 或者 'LZ4'

-- 关闭压缩
ALTER SYSTEM SET _ob_ddl_temp_file_compress_func = 'NONE';

-- 根据并行度(大于等于8开启压缩)判断是否开启压缩,压缩算法使用主表压缩算法
ALTER SYSTEM SET _ob_ddl_temp_file_compress_func = 'AUTO';
  1. 配置参数:根据需求设置并行度,确保在租户 CPU 的限制之内。
-- 对于 MySQL 模式
SET SESSION _FORCE_PARALLEL_DDL_DOP = 8;

-- 对于 Oracle 模式
ALTER SESSION FORCE PARALLEL DDL PARALLEL 8;

-- 从 V4.3.0 版本后设置 DDL 操作的并行度
ALTER /*+ PARALLEL(2) */ TABLE xxx;
  1. 关闭合并:在创建索引前调整合并相关参数,确保主表空间不会因快照点保留而放大。
ALTER SYSTEM SET minor_freeze_times = 500;
ALTER SYSTEM SET major_freeze_duty_time = 'disable';

验证结果

  • 执行查询:确认索引已经建立,并检查查询性能是否有显著提升。
  • 监控资源使用:确保磁盘、CPU 和内存资源使用正常,无过载情况。
  • 检查日志:确认无错误或警告信息,任务顺利完成。

参考官方文档: 大表创建索引的最佳实践-OceanBase 最佳实践文档-分布式数据库使用文档

4 个赞

友情推荐,索引空间分析有简单的方式,用obdiag诊断工具:https://www.oceanbase.com/docs/common-obdiag-cn-1000000001491173

2 个赞

欢迎实践及分享