合 【并发运行SQL语句】若所有索引都在同一个SQL文件中,那么如何并发的创建索引?(分解 拆分 并发操作)
问题
如果有一个sql文件,假设里边包含100条create index语句,一条SQL占用一行,现在我想用psql开10个job并行的跑这一个sql文件,该如何实现呢?
方法1:拆分小文件并执行
- 将 SQL 文件拆分为多个小文件
将包含 100 条 CREATE INDEX
语句的 SQL 文件拆分为 10 个小文件,每个文件包含 10 条语句。
使用 split
命令拆分文件
假设你的 SQL 文件名为 indexes.sql
,可以使用以下命令将其拆分为 10 个文件:
1 | split -l 10 indexes.sql index_part_ |
-l 10
:每 10 行拆分为一个文件。index_part_
:生成的文件名前缀(例如index_part_aa
,index_part_ab
等)。
- 并发执行拆分后的文件
使用 xargs
或 GNU Parallel
并发执行这些拆分后的文件。
方法 1:使用 xargs
1 | ls index_part_* | xargs -n 1 -P 10 -I {} psql -U your_user -d your_db -f {} |
-n 1
:每次处理一个文件。-P 10
:同时运行 10 个并发任务。-I {}
:将文件名传递给psql
。
方法 2:使用 GNU Parallel
1 | parallel -j 10 psql -U your_user -d your_db -f {} ::: index_part_* |
-j 10
:同时运行 10 个并发任务。:::
:指定输入文件列表。
方法2:直接并发执行单文件中的语句(无需拆分)
如果你不想拆分文件,可以通过以下方式直接从单文件中并发执行 SQL 语句。
方法 1:使用 xargs
和 psql
的 -c
选项