0. 前言
1. 执行不带变量的SQL脚本
1.1 准备一个测试用的SQL脚本(不含变量)
cat > sess.sql <1<1EOFselect pid,usename,application_name,xact_start,query_start,waiting,statefrom pg_stat_activitywhere state = 'active';EOF
1.2 在gsql里面调用SQL脚本:\i 脚本文件名
gsql -r\i sess.sql
pid | usename | application_name | xact_start | query_start | waiting | state----------------+---------+------------------+-------------------------------+-------------------------------+---------+-------- 22872621315840 | tpcc | gsql | 2024-07-10 15:40:21.179175+08 | 2024-07-10 15:40:21.179175+08 | f | active 22846861993728 | tpcc | JobScheduler | | | f | active
1.3 在Shell环境执行gsql + SQL脚本
gsql -f sess.sql
pid | usename | application_name | xact_start | query_start | waiting | state----------------+---------+------------------+-------------------------------+-------------------------------+---------+-------- 22873709213440 | tpcc | gsql | 2024-07-10 15:49:29.524565+08 | 2024-07-10 15:49:29.524565+08 | f | active 22846861993728 | tpcc | JobScheduler | | | f | active
gsql <1 sess.sql
pid | usename | application_name | xact_start | query_start | waiting | state----------------+---------+------------------+-------------------------------+-------------------------------+---------+-------- 22873349551872 | tpcc | gsql | 2024-07-10 15:56:06.868991+08 | 2024-07-10 15:56:06.868991+08 | f | active 22846861993728 | tpcc | JobScheduler | | | f | active
gsql -c "\i sess.sql"
pid | usename | application_name | xact_start | query_start | waiting | state----------------+---------+------------------+-------------------------------+-------------------------------+---------+-------- 22872307726080 | tpcc | gsql | 2024-07-10 16:00:04.077213+08 | 2024-07-10 16:00:04.077213+08 | f | active 22846861993728 | tpcc | JobScheduler | | | f | active
2. 执行带变量的SQL脚本
2.1 gsql中的变量使用
2.2 gsql中的数字类型变量使用
cat > relsize.sql <1<1EOFselect relname,relpages*8192/1024/1024 relsizefrom pg_class where relpages * 8192/1024/1024 > :sizeorder by relsize desc;EOF
gsql -v size=10 -f relsize.sql
relname | relsize-----------------------------------------+------------ snap_global_stat_all_indexes | 45.5546875 snap_global_statio_all_indexes | 41.8125 snap_class_vital_info | 40.25 snap_global_config_settings | 35.65625 snap_global_stat_all_tables | 33.25 snap_summary_stat_all_indexes | 32.4453125 snap_summary_statio_all_indexes | 31.7265625 snap_global_statio_all_tables | 26.1953125 snap_summary_stat_all_tables | 21.34375 snap_summary_statio_all_tables | 17.9921875 snap_summary_transactions_running_xacts | 16.5703125 snap_global_transactions_running_xacts | 16.4921875 snap_global_thread_wait_status | 16.3828125 pg_toast_2618 | 13.6875 snap_global_os_threads | 11.3359375(15 rows)
gsql -f relsize.sql -v size=30
relname | relsize---------------------------------+------------ snap_global_stat_all_indexes | 45.5546875 snap_global_statio_all_indexes | 41.8125 snap_class_vital_info | 40.25 snap_global_config_settings | 35.65625 snap_global_stat_all_tables | 33.25 snap_summary_stat_all_indexes | 32.4453125 snap_summary_statio_all_indexes | 31.7265625
gsql \set size 10\i relsize.sql
relname | relsize-----------------------------------------+------------ snap_global_stat_all_indexes | 45.5546875 snap_global_statio_all_indexes | 41.8125 snap_class_vital_info | 40.25 snap_global_config_settings | 35.65625 snap_global_stat_all_tables | 33.25 snap_summary_stat_all_indexes | 32.4453125 snap_summary_statio_all_indexes | 31.7265625 snap_global_statio_all_tables | 26.1953125 snap_summary_stat_all_tables | 21.34375 snap_summary_statio_all_tables | 17.9921875 snap_summary_transactions_running_xacts | 16.5703125 snap_global_transactions_running_xacts | 16.4921875 snap_global_thread_wait_status | 16.3828125 pg_toast_2618 | 13.6875 snap_global_os_threads | 11.3359375(15 rows)
gsql \prompt size30\i relsize.sql
relname | relsize---------------------------------+------------ snap_global_stat_all_indexes | 45.5546875 snap_global_statio_all_indexes | 41.8125 snap_class_vital_info | 40.25 snap_global_config_settings | 35.65625 snap_global_stat_all_tables | 33.25 snap_summary_stat_all_indexes | 32.4453125 snap_summary_statio_all_indexes | 31.7265625(7 rows)
cat > relsize_p.sql <1<1EOF\echo Please input value of size:\prompt sizeselect relname,relpages*8192/1024/1024 relsizefrom pg_class where relpages * 8192/1024/1024 > :sizeorder by relsize desc;EOF
gsql -f relsize_p.sqlPlease input value of size:40 relname | relsize--------------------------------+------------ snap_global_stat_all_indexes | 45.5546875 snap_global_statio_all_indexes | 41.8125 snap_class_vital_info | 40.25(3 rows)
gsql\i relsize_p.sqlMogDB=# \i relsize_p.sqlPlease input value of size:41 relname | relsize--------------------------------+------------ snap_global_stat_all_indexes | 45.5546875 snap_global_statio_all_indexes | 41.8125(2 rows)
2.3 gsql中的字符串类型变量使用
select name,setting from pg_settings where name ~ '参数名称'order by name;
select name,setting from pg_settings where name ~ ':name'order by name;
gsql -r\set name indexselect name,setting from pg_settings where name ~ ':name'order by name;
name | setting------+---------(0 rows)
gsql -r\set name 'index'\echo :nameselect name,setting from pg_settings where name ~ :nameorder by name;
MogDB=# \set name 'index'MogDB=# \echo :nameindexMogDB=# select name,settingMogDB-# from pg_settingsMogDB-# where name ~ :nameMogDB-# order by name;ERROR: column "index" does not existLINE 3: where name ~ index
\set name '''index'''
\set name '''index'''\echo :nameselect name,setting from pg_settings where name ~ :nameorder by name;
MogDB=# \set name '''index'''MogDB=# \echo :name'index'MogDB=# select name,settingMogDB-# from pg_settingsMogDB-# where name ~ :nameMogDB-# order by name; name | setting----------------------------------+--------- cost_weight_index | 1 cpu_index_tuple_cost | 0.005 enable_default_index_compression | off enable_hypo_index | off enable_index_nestloop | on enable_indexonlyscan | on enable_indexscan | on enable_indexscan_optimization | off ignore_system_indexes | off max_index_keys | 32(10 rows)
\prompt name 'index'select name,setting from pg_settings where name ~ :nameorder by name;
name | setting----------------------------------+--------- cost_weight_index | 1 cpu_index_tuple_cost | 0.005 enable_default_index_compression | off enable_hypo_index | off enable_index_nestloop | on enable_indexonlyscan | on enable_indexscan | on enable_indexscan_optimization | off ignore_system_indexes | off max_index_keys | 32(10 rows)
cat > para.sql <1<1EOFselect name,settingfrom pg_settingswhere name ~ :nameorder by name;EOF
gsql -v name=\'index\' -f para.sql name | setting----------------------------------+--------- cost_weight_index | 1 cpu_index_tuple_cost | 0.005 enable_default_index_compression | off enable_hypo_index | off enable_index_nestloop | on enable_indexonlyscan | on enable_indexscan | on enable_indexscan_optimization | off ignore_system_indexes | off max_index_keys | 32(10 rows)
gsql -v name=\'ind ex\' -f para.sqlgsql: FATAL: database "ex'" does not exist
gsql -v name="'index'" -f para.sql name | setting----------------------------------+--------- cost_weight_index | 1 cpu_index_tuple_cost | 0.005 enable_default_index_compression | off enable_hypo_index | off enable_index_nestloop | on enable_indexonlyscan | on enable_indexscan | on enable_indexscan_optimization | off ignore_system_indexes | off max_index_keys | 32(10 rows)
3. 总结
关于作者
罗海雄,云和恩墨数据库研发架构师,性能优化专家。他拥有超十年企业级系统设计与优化经验,对SQL优化理解尤其深入,曾服务于甲骨文公司。
来自 “ ITPUB博客 ” ,链接:https://blog.itpub.net/29715045/viewspace-3024795/ ,如需转载,请注明出处,否则将追究法律责任。