postgresql脚本
A. Postgresql DBA(13) - 自顶往下的方法阅读执行计划
一般来说,阅读执行计划通常采用自底往上的方法,这好比从树的某片叶埋链族子出发然后再到树枝再到树干、树根这么一种方法来了解一颗树,这种方法存在的问题是如果这颗树很大,那么就可能出现“只见叶子不见树干”难以把握整体的情况。这时候可以结合自顶往下的方法进行阅读,从而在整体把握整个执行计划。
为了更好的理解和使用自顶往下的阅读方法,需要预先掌握一些基础知识.
计划节点类型
为了方便起见,在此基础上进行推广,设置规则:如控制节点/物化节点的子节点为连接节点,则视为连接节点,否则视为非连接节点.
根据这条规则,可以把所有的节点分为两类,即 连接节点 和 非连接节点 .
自顶往下的方法,顾名思义,从执行计划的最顶端/最外层进行阅读.
1.识别节点类型(非连接节点 vs 连接节点)
2.如唤锋为非连接节点,则识别该节点的具体类型(数据表扫描...),该分支结束
3.如为连接节点,则识别连接的outer端和inner端
3.1 对outer端递归应用1/2/3步骤
3.2 对inner端递归应用1/2/3步骤
下面举例说明,SQL脚本如下:
1.识别节点类型: Nested Loop -> 连接节点
3.连接节点:识别outer端弯弊,即通常所说的驱动表(这里是Nested Loop)和inner端(Index Scan).
3.1 outer端为连接节点,类型为Nested Loop
递归应用1/2/3步骤,解析该Nested Loop
3.1.1 outer端为Index Scan on t_dwxx
3.1.2 inner端为Index Scan on t_grxx
3.2 inner端,递归应用1/2/3步骤,即Index Scan on t_jfxx
采用自顶往下的方法,可以从"大局"上对执行计划上进行把握,避免一开始就进入繁杂的细节之中.
PgSQL · 最佳实践 · EXPLAIN 使用浅析
跟我一起读postgresql源码(九)
B. postgresql 有没有定时清空数据表的脚本
没有,PostgreSQL自身不兆猜脊带JOB功兆铅能,有脚族渗本也无法定时执行。
可以写一个清空脚本,用操作系统的定时任务完成。
C. postgresql怎么写脚本
主要就是把除了template0和template1外的数据库全部mp到指定目录并打包
使用前把BACKUPDIR修改至你自己的备份目录
一般来说你不用修改DUMPCMD,除非你的PostgreSQL安装时的prefix指定到了其他地方,又或者你想加上其他的pg_mp参数
可以放在crontab里每天定时执行
可以考虑root来执行,因为一般root可以不通过密码验证直接使用数据库pgsql用户mp数据,一切都取决于你的pg_hba.conf和postgresql.conf设置,碰到问题自行判断
想在Windows上运行需要自行稍微修改
#! /bin/sh
DATE=`date +%Y%m%d%H`
BACKUPDIR=/path/to/backup
DUMPCMD='/usr/local/bin/pg_mp -U pgsql -O -x'
if [ ! -d $BACKUPDIR ]; then
mkdir $BACKUPDIR
fi
for DB in `/usr/local/bin/psql -U pgsql -d template1 -c '\l' -q -t | /usr/bin/awk '{print $1}'`
do
FILENAME=${DATE}_${DB}
if [ $DB != 'template0' ] && [ $DB != 'template1' ]; then
echo "Backup $DB ..."
$DUMPCMD -f $BACKUPDIR/$FILENAME.sql $DB
/usr/bin/tar -C $BACKUPDIR -c -j -f $BACKUPDIR/$FILENAME.tar.bz2 $FILENAME.sql \
&& rm -f $BACKUPDIR/$FILENAME.sql
fi
done
sync
D. postgresql建表脚本,某字段带双引号,为什么
该字段名是数中茄据库的保留关键字。
比如 你建立了一个芦迹表 table(date timestamp);
为了区陪培并别字段名与关键字,所以就会将date加双引号区别开。
E. postgresql数据库用什么命令执行脚本文件
命令行执行:psql -d 库名 -f 文件名;
直接sql脚本加:psql 库名 (-U 用户名)<<!
直接运行脚本sh 或脊缺槐直接赋予执行权限
trampwind(随风) 于 2005-3-10 11:42:27
psql交互界面直接用: i 文件名;
执行SQL脚本
先要执行命令放 .sql 格式文樱友扮余件 比 gcz_test.sql
执行 ./gcz_test.sql
F. postgreSql数据库的sql脚本中,为什么用\connect XXX;开头,意义是什么
\connect 后面依次跟 数据库名 角色名 主机地址 端口号
用于在postgresql服务客户端连接另一个唯一确定的陆燃postgresql数据库,铅悉芹其中数据库名为槐毕必填
G. Linux下如何运行sql脚本
Linux运行sql脚本的具体操作步骤如下:
1、使用shell工具登陆到安装postgresql的服务器,切换到postgres用户,postgresql默认的操作用户,命令是:su - postgres,查看当前路径是/var/lib/psql,创建一个test.sql脚本文件,命令是:vim test.sql。
H. shell怎么连接postgresql(shell怎么连接服务器)
bash脚本里有三种方式访问PostgreSQL数据库
但前提是要设置密码文件。当然对于有系统对应账户的数据库角色可以绕过密码登录环节,如
1
$sudo-upostgrespsql
或
1
2
$sudosu-postgres
$psql
但是对于没有系统账户对应的数据库角色,如要使用脚本登录则必须使用PostgreSQL密码文件
heredoc方式
heredoc是一种很常用的方式,在bash环境下还可以使用变量替换,用法示例
1
2
3
psql-U${role}-h${host}-dmydb< CREATESCHEMA${role}; EOF 也可以在循环语句中,向数据库批量插入数据,类似 1 2 3 4 5 6 for... do psql-U${role}-h${host}-dmydb< INSERTINTO${table}VALUES(${value1},${value2},...); EOF done 但这种方式,每次插入一条语句都重新登录一次数据库,效率肯定不咋地。 UPDATE(05/05/2014):既然可并数哗以使用变量替换,可以将所有插入语句组合到一个变量中,然后就可以在一次登录中批量插入数据了。 还可以用以下方式来获取查询结果 result=`psql-Urole-hlocalhost-dmydb< SELECT*FROMprocts; EOF` echo${result} 使用psql命令行选项-f执行sql脚本文件 1 psql-U${role}-h${host}-dmydb-f${scriptname} 使用psql命令行选项-c执行SQL语句或psql命令 psql的-c选项可以指定SQL语句或者psql命令,但二者不能混合,除非使用管道。如果命令参数中有多条SQL语句,则它毕雀们在一个事务里执行,除非使用BEGIN/COMMIT明确的指定事务。这与交互式使用psql终端不同,如果不明确指定事务,则每条SQL属于一个单独的事务并自动提交。只有最后一条绝行SQL语句的结果被返回。 I. postgresql数据库用什么命令执行脚本文件
在命令行下执行:psql -d 库名 -f 文件名; J. postgresql的"函数"怎么导出脚本
两种方法:
也可直接在sql脚本开头加:psql 库名 (-U 用户名)<<!
然后睁猛档就可以直接运行这个脚本,sh 之或直接赋予可执行权限。
trampwind(随风) 于 2005-3-10 11:42:27
在psql交互界面中可以直接用: i 文件名;
来执行SQL脚本
先把要执知毁行的命令放到 .sql 格式的文件悉乱中 ,比如 gcz_test.sql
然后执行 ./gcz_test.sql。
方法一:查询pg_proc:
osdba=# select prosrc from pg_proc where proname='get_username';
prosrc
--------------------------------------------------------
declare
ret text;
begin
SELECT name into ret from tang01 where id=userid;
return ret;
end;
(1 row)
方法二:调用pg_catalog.pg_get_functiondef函数:
osdba=# select pg_get_functiondef('get_username'::regproc);
pg_get_functiondef
----------------------------------------------------------------
CREATE OR REPLACE FUNCTION public.get_username(userid integer)
RETURNS text
LANGUAGE plpgsql
AS $function$
declare
ret text;
begin
SELECT name into ret from tang01 where id=userid;
return ret;
end;
$function$