我在红移中有超过 300 多个表。
数据每天都在更新,基本只是想知道我可以在 redshift 中创建一个 udf 来自动化 vaccum 过程。
我发现了一个使用 python 自动链接的链接,但不是我正在寻找 sql 脚本中的解决方案的那个伟大的 python 编码器。
我在红移中有超过 300 多个表。
数据每天都在更新,基本只是想知道我可以在 redshift 中创建一个 udf 来自动化 vaccum 过程。
我发现了一个使用 python 自动链接的链接,但不是我正在寻找 sql 脚本中的解决方案的那个伟大的 python 编码器。
不幸的是,您不能将 udf 用于这样的事情,udf 是用于查询的简单输入/输出函数。
您最好的选择是使用 AWS 实验室的这个开源工具:VaccumAnalyzeUtility。使用这个工具的好处是它非常聪明,只VACUUM
在需要它们的表上运行,它也将ANALYZE
在需要它的表上运行。
设置为 cron 作业非常容易。这是如何完成的示例:
在 git 中拉取 amazon-redshift-utils 存储库:
git clone https://github.com/awslabs/amazon-redshift-utils
cd amazon-redshift-utils
创建一个可以由 cron 运行的脚本。在您的文本编辑器中创建一个名为run_vacuum_analyze.sh
以下内容的文件,并为您的环境填写值:
export REDSHIFT_USER=<your db user name>
export REDSHIFT_PASSWORD=<your db password>
export REDSHIFT_DB=<your db>
export REDSHIFT_HOST=<your redshift host>
export REDSHIFT_PORT=<your redshift port>
export WORKSPACE=$PWD/src/AnalyzeVacuumUtility
#
# VIRTUALENV
#
rm -rf $WORKSPACE/ve1
virtualenv -p python2.6 "$WORKSPACE/ve1"
# enter virutalenv
source $WORKSPACE/ve1/bin/activate
#
# DEPENDENCIES
#
pip install PyGreSQL
cd $WORKSPACE/run
#
# RUN IT
#
python analyze-vacuum-schema.py --db $REDSHIFT_DB --db-user $REDSHIFT_USER --db-pwd $REDSHIFT_PASSWORD --db-port $REDSHIFT_PORT --db-host $REDSHIFT_HOST
然后创建一个将运行此脚本的 cron 作业(在此示例中,我每天凌晨 2:30 运行它)
chmod +x run_vacuum_analyze.sh
crontab -e
添加以下条目:
30 2 * * * <path-to-the-cloned-repo>/run_vacuum_analyze.sh
现在您可以使用 auto vaccum ,Redshift 现在提供此选项
这是我的 shell 脚本实用程序,可通过更好地控制表过滤器来自动执行此操作。
https://thedataguy.in/automate-redshift-vacuum-analyze-using-shell-script-utility/
对所有表运行真空和分析。
./vacuum-analyze-utility.sh -h endpoint -u bhuvi -d dev
对模式 sc1、sc2 运行真空和分析。
./vacuum-analyze-utility.sh -h endpoint -u bhuvi -d dev -s 'sc1,sc2'
在除模式 sc1 之外的所有模式中的所有表上运行 Vacuum FULL。但不想分析
./vacuum-analyze-utility.sh -h endpoint -u bhuvi -d dev -k sc1 -o FULL -a 0 -v 1
or
./vacuum-analyze-utility.sh -h endpoint -u bhuvi -d dev -k sc1 -o FULL -a 0
仅对除表 tb1、tbl3 之外的所有表运行分析。
./vacuum-analyze-utility.sh -h endpoint -u bhuvi -d dev -b 'tbl1,tbl3' -a 1 -v 0
or
./vacuum-analyze-utility.sh -h endpoint -u bhuvi -d dev -b 'tbl1,tbl3' -v 0
在命令行上使用密码。
./vacuum-analyze-utility.sh -h endpoint -u bhuvi -d dev -P bhuvipassword
对未排序行大于 10% 的表运行真空和分析。
./vacuum-analyze-utility.sh -h endpoint -u bhuvi -d dev -v 1 -a 1 -x 10
or
./vacuum-analyze-utility.sh -h endpoint -u bhuvi -d dev -x 10
对模式 sc1 中 stats_off 大于 5 的所有表运行分析。
./vacuum-analyze-utility.sh -h endpoint -u bhuvi -d dev -v 0 -a 1 -f 5
仅在模式 sc1 中的表 tbl1 上运行真空,真空阈值为 90%。
./vacuum-analyze-utility.sh -h endpoint -u bhuvi -d dev -s sc1 -t tbl1 -a 0 -c 90
仅运行模式 sc1 分析,但设置 analyze_threshold_percent=0.01
./vacuum-analyze-utility.sh -h endpoint -u bhuvi -d dev -s sc1 -t tbl1 -a 1 -v 0 -r 0.01
进行一次试运行(生成 SQL 查询)以分析模式 sc2 上的所有表。
./vacuum-analyze-utility.sh -h endpoint -u bhuvi -d dev -s sc2 -z 1
You CANNOT use a UDF for this, UDFs cannot run command that update data.