KingbaseES 数据库创建索引慢的可能原因
1.表大小
如果表太大,数据很多,索引创建的时候,会导致创建索引的时间很慢。
如果表很大,可以考虑重新设计表结构或拆分表。还可以考虑使用分区表,使子分区的数据减少,创建分区表也可以使索引变小,增加索引创建速度,有助于查询效率。
2.索引类型
不同类型的索引建立的速度可能会有所不同,因为存储的结构不一样。例如,B-tree索引通常比GiST索引建立得更快。
不同的索引策略适用于不同的场景,选择合适的索引策略可以提高建索引的速度和效率。
3.查看服务器负载
检查系统是否存在其他进程占用了大量的系统资源,如CPU、内存和磁盘IO等。可以使用top和vmstat,iostat等命令查看。
4.磁盘空间
如果磁盘空间不足,可能会导致索引建立速度变慢。
5.检查并发连接数
如果并发连接数过高,可能会导致建索引的速度变慢。可以调整数据库的最大并发连接数参数。
6.禁用触发器和约束
在建立索引时,可以考虑禁用触发器和约束,以避免对建立索引的影响。完成索引建立后,再重新启用触发器和约束。
禁用触发器
ALTER TABLE TABLE_NAME DISABLE TRIGGER trigger_name;
开启触发器
ALTER TABLE TABLE_NAME ENABLE TRIGGER trigger_name;
禁用/开启一张表上所有触发器
ALTER TABLE table_name DISABLE TRIGGER all;
ALTER TABLE table_name ENABLE TRIGGER all;
7.通过调整参数来使用更多的内存创建索引
maintenance_work_mem参数:
maintenance_work_mem默认值(64MB)是很低的,它是用于维护任务的内存设置,会影响如命令:VACUUM,RESTORE,CREATE INDEX,ADD FOREIGN KEY和ALTER TABLE等操作的性能。使用更多的内存空间时创建索引的速度提升会非常明显。
在创建索引的时候,它控制构建索引时使用的最大内存量。我们知道,构建B树索引时,必须对数据排序,如果要排序的数据在maintenance_work_mem内存中放置不下,它将会溢出到磁盘中。
因此在执行CREATE INDEX命令之前,可以在本地会话中使用SET命令临时增加该值。
shared_buffers和work_mem参数:
shared_buffers决定了Kingbase在内存中数据页缓冲区的大小,
work_mem参数决定了其内存中执行sort和hash操作所能使用的内存大小。 如果这两个参数设置不合理,也可能导致创建索引变慢。
8.Kingbase支持并行创建索引
在建立索引时可以使用并行创建索引,以提高创建索引的速度。
并行进程数设置分为两类,第一类是并行查询,并行查询的并行度由 max_parallel_workers_per_gather参数控制。
第二类是维护命令(例如 CREATE INDEX),维护命令的并行度由 max_parallel_maintenance_workers 参数控制。
并行创建索引时,使cpu核数和该参数相匹配,max_parallel_maintenance_workers的参数设置不要超过cpu的逻辑核心数。
可通过 ALTER TABLE 方式禁止表上的并行创建索引,如下禁止表t1上的所有并行创建索引
ALTER TABLE t1 SET (parallel_workers=0);
如果想恢复指定表上的parallel_workers参数设置,可采用如下方式
ALTER TABLE t1 RESET(parallel_workers);
9.使用SSD等高性能磁盘
SSD硬盘相比传统的机械硬盘具有更快的读写速度,可以显著提高创建索引的速度。
10.检查锁情况
锁等待可能导致索引创建速度变慢。可以通过sys_locks视图检查是否有锁阻塞。
可参考文章:https://www.cnblogs.com/kingbase/p/16228466.html
11.使用数据预热
使用sys_prewarm插件使数据预加载进shared_buffer,创建索引时,可提高创建索引的速度。
12.使用Partial Index(部分索引)
可以针对列的部分数据建立索引,减小索引的大小,从而加快创建索引的速率。
在建索引时可以设置过滤条件,只对符合条件的数据建立索引。这样可以减少索引的大小和建立索引的时间,从而提高索引建立的速度。当然要符合实际业务场景。
13.避免使用大事务
建索引时,尽量避免使用大事务。大事务会占用大量的系统资源,可能会导致创建索引速度变慢。可以拆分成多个小事务来处理,从而提高创建索引的速度和效率。
14.避免同时创建多个索引
同时创建多个索引会增加系统负担,可能会导致索引建立速度变慢。
可以通过合并索引来优化建索引的速度和效率。
因为Kingbase数据库可以在同一列上建立多个索引。这些索引仅名字不一样,然而为了维护索引,dml语句会变慢。所以,不要忽视这个关键点。