【发布时间】:2021-01-09 00:13:30
【问题描述】:
我有一个非常大的 bash 脚本,我在其中进行了数千个 psql 查询,我怀疑这会减慢它的速度。我创建了这个 MWE,它证明了我的理论。我假设这种减速是因为必须反复连接到数据库。有没有办法在 bash 中保持与 psql 的连接?
#!/bin/bash
DB_NAME=testdb
DB_USER=user1 #UPDATE THIS
#DROP DB
SQL_QUERY="DROP DATABASE IF EXISTS $DB_NAME;"
echo $SQL_QUERY | sudo -u $DB_USER psql >/dev/null
#CREATE DB
SQL_QUERY="CREATE DATABASE $DB_NAME;"
echo $SQL_QUERY | sudo -u $DB_USER psql >/dev/null
#CREATE TABLE
SQL_QUERY="CREATE TABLE foo
(
id BIGSERIAL PRIMARY KEY,
problems INTEGER
);"
echo $SQL_QUERY | sudo -u $DB_USER psql -d $DB_NAME >/dev/null
TARGET_ITERATIONS=1000
#MULTIPLE DB CALLS
SQL_QUERY="INSERT INTO foo
(
problems
)
VALUES
(
99
);"
START_TIME=$(date +%s)
for ITERATION in $(seq $TARGET_ITERATIONS)
do
echo $SQL_QUERY | sudo -u $DB_USER psql -d $DB_NAME >/dev/null
done
STOP_TIME=$(date +%s)
echo "Multiple Call Duration (s): $((STOP_TIME-START_TIME))"
#Single db call
SQL_QUERY=""
for ITERATION in $(seq $TARGET_ITERATIONS)
do
SQL_QUERY+="INSERT INTO foo
(
problems
)
VALUES
(
99
);"
done
START_TIME=$(date +%s)
echo $SQL_QUERY | sudo -u postgres psql -d $DB_NAME >/dev/null
STOP_TIME=$(date +%s)
echo "Single Call Duration (s): $((STOP_TIME-START_TIME))"
输出:
$ ./test_psql.sh
Multiple Call Duration (s): 64
Single Call Duration (s): 12
【问题讨论】:
-
制作一个独特的文件而不是` echo |连接`;做一个
connection filename.sql我想你会做出相当好的结果;如果效率不高,您可以查看parallel命令以打开与核心一样多的 sql 会话,例如 -
使用
mkfifo /tmp/mypipe创建一个命名管道,使用chmod a+r /tmp/mypipe使其对世界可读。运行cat > /tmp/mypipe &之类的进程以使其保持打开状态。使用sudo -u $DB_USER psql -f /tmp/mypipe连接一次到psql。使用echo $SQL_QUERY > /tmp/mypipe。完成后确保发送\q并清理cat命令。如果安全是一个问题,那么您将需要弄清楚如何使用mktemp在/tmp中创建一个目录,您可以在其中创建fifo。 -
您也可以考虑使用协同进程。
-
@MikeOrganek 您能否提供 MWE 作为答案。我似乎无法让您的建议发挥作用
标签: database bash postgresql psql