通过shell脚本生成查询表数据的sql

在工作中我们需要查询表的数据条数,一般来说就是使用select count(1)或者select count(*)之类的语句。
当然了对于不同的表来说,应该还是可以做一些细分,能够最大程度的提高效率,比如表中含有主键列,尝试走索引扫面可能会被全表扫描效率要高。如果表中的数据太多,而且没有一些相关的约束,可以考虑使用并行来提高等等。
以下就是使用shell脚本所做的查询数据条数的一个例子,看起来有些太不值得了,但是如果数据量很大的情况下这些分析就格外有用了。

比如表customer,数据量不是很大,可以直接走索引来做。

> ksh get_tab_cnt.sh prdappo customer
 
 
************************************************

CUSTOMER               .859375

CUSTOMER

select  /*+ index_ffs(CUSTOMER,CUSTOMER_pk ) parallel_index(CUSTOMER,CUSTOMER_pk,1) */  'CUSTOMER,', count(*) from CUSTOMER  ;

如果表比较大,可以同时开启并行。

 
************************************************

GREEMENT            10.359375

GREEMENT

select  /*+ index_ffs(GREEMENT,GREEMENT_pk ) parallel_index(GREEMENT,GREEMENT_pk,4) */  'GREEMENT,', count(*) from GREEMENT  ;

对应的脚本如下:

#!/bin/ksh
#get_tab_cnt_sql
DATE=`/bin/date '+%y%m%d_%H%M%S'`

constr1=$DB_CONN_STR@$SH_DB_SID
constr1=`echo ${constr1} | tr '[:lower:]' '[:upper:]'`
timestamp=$3
time_vs=""
if [ "${timestamp}" = "" ]
then
        echo " "
        echo " "
else
        if [ "${timestamp2}" = "" ]
        then
                exit;
        else
                time_vs=" As of timestamp to_date('${timestamp}','mm/dd/yyyy hh24:mi:ss') "
                time_vt=" As of timestamp to_date('${timestamp2}','mm/dd/yyyy hh24:mi:ss') "
        fi
fi

user1=`echo $constr1 | awk -F "/" '{print $1}'`
inst1=`echo $constr1 | awk -F "@" '{print $2}'`

if [[ -z ${inst1} ]];then
inst1=$ORACLE_SID
constr1=${constr1}@${inst1}
fi

function check_connectivity
{
  Num=`echo show user | $ORACLE_HOME/bin/sqlplus -s $1| grep -i 'USER ' | wc -l`
  if [ $Num -gt 0 ]
        then
                ## ok - instance is accessible
               echo '************************************************'
        else
                ## inst is Inaccessible
                echo Connection Details: `echo $1 ` is Inaccessible...
                echo '************************************************'
                exit;
        fi
}

check_connectivity $constr1
sleep 1;

sleep 1;

mkdir `pwd`/Get_tab_cnt_${user1}_${inst1}_${DATE}
mkdir `pwd`/Get_tab_cnt_${user1}_${inst1}_${DATE}/List

small2='1'
small='10'
medium='30'
big_par=8
medium_par=4
small_par=2
small2_par=1

COUNT_DIR=`pwd`/Get_tab_cnt_${user1}_${inst1}_${DATE}

 

exclude_tab=x
sqlplus -s ${constr1}
set head off
set line 100
set pages 50000
set long 10000
col segment_name for a40
spool ${COUNT_DIR}/List/${user1}_${inst1}_all_tab_size_temp.lst
select distinct segment_name,to_number(to_char(sum(bytes/1024/1024/1024))) from dba_segments
where owner=upper('$1') and segment_name =upper('$2')  group by segment_name order by 2 desc;
spool off;
spool ${COUNT_DIR}/List/${user1}_${inst1}_all_tab_with_pk.lst
select table_name  from dba_tables where owner=upper('$1')  and table_name in ( select table_name from dba_constraints  where owner=upper('$1')  and table_name =upper('$2')
and constraint_type='P');
spool off;

EOF

################## Getting Big Tables ######################

sed  '/^$/d' ${COUNT_DIR}/List/${user1}_${inst1}_all_tab_size_temp.lst | grep -v SQL | grep -v select | grep -v ERROR | grep -v ORA- | grep -v '*' > ${COUNT_DIR}/List/${user1}_${inst1}_all_tab_size.lst

echo ${medium} | awk -v medium=${medium} ' $2 > medium { print $1 } ' ${COUNT_DIR}/List/${user1}_${inst1}_all_tab_size.lst > ${COUNT_DIR}/List/${user1}_${inst1}_big_tab.lst
echo ${medium} | echo ${small} | awk -v medium=${medium} -v small=${small} ' $2 small  { print $1 } ' ${COUNT_DIR}/List/${user1}_${inst1}_all_tab_size.lst > ${COUNT_DIR}/List/${user1}_${inst1}_medium_tab.lst
echo ${small} | echo ${small2} | awk -v small=${small} -v small2=${small2} ' $2 small2 { print $1 } ' ${COUNT_DIR}/List/${user1}_${inst1}_all_tab_size.lst > ${COUNT_DIR}/List/${user1}_${inst1}_small_tab.lst
echo ${small2} | awk -v  small2=${small2} ' $2 ${COUNT_DIR}/List/${user1}_${inst1}_small2_tab.lst

###############################( Generating Count Files ( Big ) #############################################
while read table
do
        is_pk=`grep -i ${table} ${COUNT_DIR}/List/${user1}_${inst1}_all_tab_with_pk.lst | wc -l `
        is_pk=`echo $is_pk`
        if [ is_pk -ne 0 ]
        then
                echo "select  /*+ index_ffs(${table},${table}_pk ) parallel_index(${table},${table}_pk,${big_par}) */  '${table},', count(*) from ${table} ${time_vs} ;"  >> ${COUNT_DIR}/sqls/${user1}_${inst1}_${table}_tab_count.sql
        else
                echo "select  /*+ PARALLEL(${table},${big_par}) */ '${table} ,' , count (1) from  ${table} ${time_vs} ;" >> ${COUNT_DIR}/sqls/${user1}_${inst1}_${table}_tab_count.sql
        fi
done

################################ Generating Count Files ( Medium ) #############################################

while read table
do
        #echo " Table Name is : $table "
        is_pk=`grep -i ${table} ${COUNT_DIR}/List/${user1}_${inst1}_all_tab_with_pk.lst | wc -l `
        is_pk=`echo $is_pk`
        if [ is_pk -ne 0 ]
        then
                echo "select  /*+ index_ffs(${table},${table}_pk ) parallel_index(${table},${table}_pk,${medium_par}) */  '${table},', count(*) from ${table} ${time_vt} ;"  >> ${COUNT_DIR}/List/${user1}_${inst1}_medium_tab_count.lst
        else
                echo "select   /*+ PARALLEL(${table},${medium_par}) */ '${table} ,' , count (1) from  ${table} ${time_vs} ;" >> ${COUNT_DIR}/List/${user1}_${inst1}_medium_tab_count.lst
        fi

done

################################ Generating Count Files ( Small ) #############################################

while read table
do
        #echo " Table Name is : $table "
        is_pk=`grep -i ${table} ${COUNT_DIR}/List/${user1}_${inst1}_all_tab_with_pk.lst | wc -l `
        is_pk=`echo $is_pk`
        if [ is_pk -ne 0 ]
        then
                echo "select  /*+ index_ffs(${table},${table}_pk ) parallel_index(${table},${table}_pk,${small_par}) */  '${table},', count(*) from ${table} ${time_vs} ;"  >> ${COUNT_DIR}/List/${user1}_${inst1}_small_tab_count.lst
        else
                echo "select   /*+ PARALLEL(${table},${small_par}) */ '${table} ,' , count (1) from  ${table} ${time_vs} ;" >> ${COUNT_DIR}/List/${user1}_${inst1}_small_tab_count.lst
        fi
done

################################ Generating Count Files (Very Small ) #############################################

while read table
do
        #echo " Table Name is : $table "
        is_pk=`grep -i ${table} ${COUNT_DIR}/List/${user1}_${inst1}_all_tab_with_pk.lst | wc -l `
        is_pk=`echo $is_pk`
        if [ is_pk -ne 0 ]
        then
                echo "select  /*+ index_ffs(${table},${table}_pk ) parallel_index(${table},${table}_pk,${small2_par}) */  '${table},', count(*) from ${table} ${time_vs} ;"  >> ${COUNT_DIR}/List/${user1}_${inst1}_small2_tab_count.lst
        else
                echo "select   /*+ PARALLEL(${table},${small2_par}) */ '${table} ,' , count (1) from  ${table} ${time_vs} ;" >> ${COUNT_DIR}/List/${user1}_${inst1}_small2_tab_count.lst
        fi
done

 

 

rm  ${COUNT_DIR}/List/*temp.lst

#################### get table list from schemas ##########################
touch ${COUNT_DIR}/${user1}_${inst1}_final_tab_cnt_stats.sql
schema_con=${user1}_${inst1}
function get_final_tab_cnt_stats
{
schema_type=$1
if [ -s  ${COUNT_DIR}/List/${schema_con}_big_tab_count.lst ];then
cat ${COUNT_DIR}/List/${schema_con}_big_tab_count.lst >> ${COUNT_DIR}/${schema_con}_final_tab_cnt_stats.sql
fi
if  [ -s ${COUNT_DIR}/List/${schema_con}_medium_tab_count.lst ];then
cat ${COUNT_DIR}/List/${schema_con}_medium_tab_count.lst >> ${COUNT_DIR}/${schema_con}_final_tab_cnt_stats.sql
fi
if [ -s ${COUNT_DIR}/List/${schema_con}_small2_tab_count.lst ];then
cat ${COUNT_DIR}/List/${schema_con}_small2_tab_count.lst >> ${COUNT_DIR}/${schema_con}_final_tab_cnt_stats.sql
fi
if [ -s ${COUNT_DIR}/List/${schema_con}_small_tab_count.lst ];then
cat ${COUNT_DIR}/List/${schema_con}_small_tab_count.lst >> ${COUNT_DIR}/${schema_con}_final_tab_cnt_stats.sql
fi
}

get_final_tab_cnt_stats $schema_con

cat ${COUNT_DIR}/${schema_con}_final_tab_cnt_stats.sql
rm -rf ${COUNT_DIR}

 

时间: 2024-10-23 08:53:20

通过shell脚本生成查询表数据的sql的相关文章

使用shell脚本生成只读权限的sql脚本

目前做数据迁移,有8套不同的环境,为了保护环境,每个环境中的表,视图等开发都不能修改,只能通过连接用户去查询. 每个环境中可能含有表,索引,序列,存储过程,函数等,所以一个一个写是不现实的,写了下面的动态脚本来自动生成相应的权限,然后创建对应的同义词. 脚本会生成两个sql脚本,一个是owner用户赋予权限使用的,另外一个脚本是connect用户使用的,创建了对应的同义词. source_schema=$1 conn_schema=$2 sqlplus -s xxx/xx   set feedb

如何通过shell脚本生成服务器密码

写了一个可以生成随机密码的脚本,如果想要纯数字或才字母或者大小写,都可以自定,我这里写了全元素. #!/bin/bash # author: honway.liu # date: 2013-07-19 # concate: gm100861@gmail.com len=90 str=(a b c d e f g h i j k l m n o p q r s t u v w x y z A B C D E F G H I J K L M N O P Q R S T U V W X Y Z 1 2

想用shell脚本远程dump数据,数据格式有要求

问题描述 想用shell脚本远程dump数据,数据格式有要求 想用shell脚本远程dump数据,数据格式有要求,如下: 1.只有数据,没有别的乱七八遭的东西 2.字段间用tab分割 我自己使用了网上说的--tab --fields-terminated,但是--tab只能用在本地,并不能远程dump 想问下这种情况应该怎么半 解决方案 http://outofmemory.cn/code-snippet/2133/mysqldump-database-single-table-single-f

shell脚本中的数据传递方式

shell中支持的数据传递方式 主要有那么几种: 变量.管道.结果引用.重定向+文件.以及xargs.   变量方式:  1. 定义变量: 变量名=值  2. 使用变量: $变量名   管道方式: 统计当前文件夹下的文件数量: find . | awk {print NR} #打印99乘法表 seq 9 | sed 'H;g' | awk -v RS='' '{for(i=1;i<=NF;i++)printf("%dx%d=%d%s", i, NR, i*NR, i==NR?&q

通过shell脚本生成数据统计信息的报表

对于统计信息的收集,不同的环境中使用的策略也会有很大的不同,有的按照一定的时间频率来收集,有的比较稳定的系统根据数据的增长频率来收集,用户比较稳定的系统,甚至都不再收集统计信息. 以下是使用shell生成的统计信息报表效果,可以在备份库中进行这些信息的收集,可以看到哪些表的查询耗费的时间较多,当前数据条数和统计信息中的数据条数. #############################################################################     ta

利用shell脚本生成动态sql

在一些分布式环境中,可能涉及到的数据库有很多,相关的数据库用户也不少,有些看似简单的变更可能需要在不同的库,不同的用户间要进行复杂的操作. 现在我们有3套环境,一套是测试环境test,一套是准生产环境xprd,一套是生产环境prod, 比如在prod上有5个库一共20个用户,某一个变更可能在这20个用户里面要进行一些的操作.xprd里面和生产环境类似,也有数据库用户,test环境中有10个用户,需要在这10个用户中进行相应的操作. 最开始的时候,使用sqlplus和shell脚本,如下 sqlp

自动生成insert数据的SQL脚本

判断当表存在标识列的时候就要允许将显式值插入表的标识列中,设置: Set Identity_insert TableName Off 判断数据类型: 如,varchar,char,datetime,nvarchar,nchar,uniqueidentifier时候,在insert字段中就要增加双引号,否则就不加. Use TestGoDeclare @Table1 nvarchar(128), @Table2 nvarchar(128), @Sql1 nvarchar(4000), @Sql2

巧用shell脚本生成快捷脚本

在升级的过程中,可能需要准备一些额外的脚本,比如说做数据迁移的时候为了考虑性能,需要做如下的额外工作: 1.将部分表置为nologging 2.将部分index置为nologging 3.将部分foreign key constraint置为disable 4.将部分trigger 置为disable 在完成数据升级后,再置为logging,enable状态. 但是在准备脚本的过程中,总是为这些小脚本而头疼,可能在升级前临时增加了一些表或者取消了部分表.或者有了其他的变更,维护这些脚本就显得有些

Shell脚本生成网页版相册浏览器

今天学到了一招,那就是使用脚本制作一款网页版相册浏览器.先上图吧. 必备基础 操作系统: 以linux为内核的操作系统都行 编程语言:Shell(bash)脚本,相关基础知识即可 下载工具:wget 图片处理工具: ImageMagicK, 解压缩工具 : rar ,bzip都行 额外技能:一些基本的Linux操作命令,如此即可. 软件安装 这里说的软件安装主要是指解压缩工具和图片下载工具的使用.因为我的linux是在虚拟机里,而且没有安装文件共享增强(如果安装了增强的话,就不必安装解压缩工具了