[20200211]使用dbms_shared_pool.markhot与sql_id的计算.txt
–//以前写的,使用dbms_shared_pool.markhot标记热的sql_id,这样相同的sql语句使用不同的sql_id.
–//链接:http://blog.itpub.net/267265/viewspace-2147197/ => [20171110]sql语句相同sql_id可以不同吗.
–//好奇心想知道,oracle这种情况下如何计算的sql_id的。
–//更正:sql语句使用使用dbms_shared_pool.markhot标记热的sql_id时,full_hash_value和sql_id的计算,就是在原来sql语句的基础
–//上加上 . mod(sid,cpu_count/2)+1数字的字符串。
–//如果设置隐含参数_kgl_hot_object_copies,变为加上 . mod(sid,_kgl_hot_object_copies)+1数字的字符串。
1.环境:
scott@book> @ &r/ver1
port_string version banner
—————————— ————– ——————————————————————————–
x86_64/linux 2.4.xx 11.2.0.4.0 oracle database 11g enterprise edition release 11.2.0.4.0 – 64bit production
scott@book> select * from dept where deptno=10;
deptno dname loc
———- ————– ————-
10 accounting new york
–//sql_id=’4xamnunv51w9j’,可以执行多次,避免sql语句退出共享池.
select name
,hash_value
,full_hash_value
,namespace
,child_latch
,property hot_flag
,executions
,invalidations
from v$db_object_cache
where name = ‘select * from dept where deptno=10’;
name hash_value full_hash_value namespace child_latch hot_flag executions invalidations
—————————————- ———- ——————————– ———- ———– ———- ———- ————-
select * from dept where deptno=10 911274289 1431c45dbddbb9e74eaa74d53650f131 sql area 0 8 0
select * from dept where deptno=10 911274289 1431c45dbddbb9e74eaa74d53650f131 sql area 61745 8 0
–//确定full_hash_value=’1431c45dbddbb9e74eaa74d53650f131′.
$ echo -e -n ‘select * from dept where deptno=10\0’ | md5sum | sed ‘s/ -//’ | xxd -r -p | od -t x4 | sed -n -e ‘s/^0000000 //’ -e ‘s/ //gp’
1431c45dbddbb9e74eaa74d53650f131
–//对比完全能对上。
2.建立gdb脚本:
–//参考链接:http://blog.itpub.net/267265/viewspace-2665902/=>[20191127]表 full hash value的计算.txt
$ cat md5.gdb
set pagination off
break kggmd5update
commands
printf “length: %d\n”,$rdx
x/40xc $rsi
c
end
break kglcomputehash
commands
c
end
break kggmd5process
commands
c
end
break kggmd5finish
commands
c
end
3.测试分析:
–//首先使用dbms_shared_pool.markhot标记。
sys@book> exec dbms_shared_pool.markhot( hash=>’1431c45dbddbb9e74eaa74d53650f131′, namespace=>0, global=>true);
pl/sql procedure successfully completed.
–//以scott登录
–//session 1:
scott@book> @ spid
sid serial# process server spid pid p_serial# c50
———- ———- ———————— ——— —— ——- ———- ————————————————–
58 49 54621 dedicated 54622 28 23 alter system kill session ‘58,49’ immediate;
–//spid=54622
–//session 2:
$ gdb -p 54622 -x md5.gdb
–//session 1:
–//测试前可以先执行select * from dept where deptno=10;注意s大写sql语句与原来不同。
select * from dept where deptno=10
scott@book> select * from dept where deptno=10;
deptno dname loc
———- ————– ————-
10 accounting new york
@ dpc ” ”
–//输出略,查询sql_id=’7sqgfqarnwk8h’,与原来的完成不同。
4.观察gdb的输出:
–//session 3:
sys@book> select sql_id,sql_text,executions,length(sql_text),ora_hash(sql_text) from v$sqlarea where sql_text = ‘select * from dept where deptno=10’ ;
sql_id sql_text executions length(sql_text) ora_hash(sql_text)
————- ———————————– ———- —————- ——————
7sqgfqarnwk8h select * from dept where deptno=10 3 34 156172166
4xamnunv51w9j select * from dept where deptno=10 8 34 156172166
–//sql_id=7sqgfqarnwk8h.
select name
,hash_value
,full_hash_value
,namespace
,child_latch
,property hot_flag
,executions
,invalidations
from v$db_object_cache
where name = ‘select * from dept where deptno=10’;
name hash_value full_hash_value namespace child_latch hot_flag executions invalidations
—————————————- ———- ——————————– ———- ———– ———- ———- ————-
select * from dept where deptno=10 2941143312 5196d0b7fe72e5ea7c59eeb2af4e4910 sql area 0 hotcopy11 3 0
select * from dept where deptno=10 2941143312 5196d0b7fe72e5ea7c59eeb2af4e4910 sql area 18704 hotcopy11 3 0
select * from dept where deptno=10 911274289 1431c45dbddbb9e74eaa74d53650f131 sql area 0 hot 8 0
select * from dept where deptno=10 911274289 1431c45dbddbb9e74eaa74d53650f131 sql area 61745 hot 8 0
–//可以发现新建立的sql语句full_hash_value=5196d0b7fe72e5ea7c59eeb2af4e4910,注意后面的hot_flag=’hotcopy11′.
–//0x4910 = 18704
–//session 2:
(gdb) c
continuing.
breakpoint 1, 0x00000000097f09a8 in kggmd5update ()
length: 35
0x7fffff1de9d8: 115 ‘s’ 101 ‘e’ 108 ‘l’ 101 ‘e’ 99 ‘c’ 116 ‘t’ 32 ‘ ‘ 42 ‘*’
0x7fffff1de9e0: 32 ‘ ‘ 102 ‘f’ 114 ‘r’ 111 ‘o’ 109 ‘m’ 32 ‘ ‘ 100 ‘d’ 101 ‘e’
0x7fffff1de9e8: 112 ‘p’ 116 ‘t’ 32 ‘ ‘ 119 ‘w’ 104 ‘h’ 101 ‘e’ 114 ‘r’ 101 ‘e’
0x7fffff1de9f0: 32 ‘ ‘ 100 ‘d’ 101 ‘e’ 112 ‘p’ 116 ‘t’ 110 ‘n’ 111 ‘o’ 61 ‘=’
0x7fffff1de9f8: 49 ‘1’ 48 ‘0’ 0 ‘\000’ -13 ‘? 108 ‘l’ 92 ‘\\’ 107 ‘k’ -64 ‘?
–//拼接起来就是 select * from dept where deptno=10\0;
breakpoint 4, 0x00000000097f0830 in kggmd5finish ()
breakpoint 1, 0x00000000097f09a8 in kggmd5update ()
length: 21
0xbefbe20 <kggmd5padding.0>: -128 ‘\200’ 0 ‘\000’ 0 ‘\000’ 0 ‘\000’ 0 ‘\000’ 0 ‘\000’ 0 ‘\000’ 0 ‘\000’
0xbefbe28 <kggmd5padding.0+8>: 0 ‘\000’ 0 ‘\000’ 0 ‘\000’ 0 ‘\000’ 0 ‘\000’ 0 ‘\000’ 0 ‘\000’ 0 ‘\000’
0xbefbe30 <kggmd5padding.0+16>: 0 ‘\000’ 0 ‘\000’ 0 ‘\000’ 0 ‘\000’ 0 ‘\000’ 0 ‘\000’ 0 ‘\000’ 0 ‘\000’
0xbefbe38 <kggmd5padding.0+24>: 0 ‘\000’ 0 ‘\000’ 0 ‘\000’ 0 ‘\000’ 0 ‘\000’ 0 ‘\000’ 0 ‘\000’ 0 ‘\000’
0xbefbe40 <kggmd5padding.0+32>: 0 ‘\000’ 0 ‘\000’ 0 ‘\000’ 0 ‘\000’ 0 ‘\000’ 0 ‘\000’ 0 ‘\000’ 0 ‘\000’
breakpoint 1, 0x00000000097f09a8 in kggmd5update ()
length: 8
0x7fffff1dc910: 24 ‘\030’ 1 ‘\001’ 0 ‘\000’ 0 ‘\000’ 0 ‘\000’ 0 ‘\000’ 0 ‘\000’ 0 ‘\000’
0x7fffff1dc918: -40 ‘? -23 ‘? 29 ‘\035’ -1 ‘’ -1 ‘’ 127 ‘\177’ 0 ‘\000’ 0 ‘\000’
0x7fffff1dc920: 32 ‘ ‘ -51 ‘? 29 ‘\035’ -1 ‘’ -1 ‘’ 127 ‘\177’ 0 ‘\000’ 0 ‘\000’
0x7fffff1dc928: -40 ‘? -23 ‘? 29 ‘\035’ -1 ‘’ -1 ‘’ 127 ‘\177’ 0 ‘\000’ 0 ‘\000’
0x7fffff1dc930: -64 ‘? -55 ‘? 29 ‘\035’ -1 ‘’ -1 ‘’ 127 ‘\177’ 0 ‘\000’ 0 ‘\000’
breakpoint 2, 0x000000000984457c in kglcomputehash ()
breakpoint 1, 0x00000000097f09a8 in kggmd5update ()
length: 35
0x7fffff1de9d8: 115 ‘s’ 101 ‘e’ 108 ‘l’ 101 ‘e’ 99 ‘c’ 116 ‘t’ 32 ‘ ‘ 42 ‘*’
0x7fffff1de9e0: 32 ‘ ‘ 102 ‘f’ 114 ‘r’ 111 ‘o’ 109 ‘m’ 32 ‘ ‘ 100 ‘d’ 101 ‘e’
0x7fffff1de9e8: 112 ‘p’ 116 ‘t’ 32 ‘ ‘ 119 ‘w’ 104 ‘h’ 101 ‘e’ 114 ‘r’ 101 ‘e’
0x7fffff1de9f0: 32 ‘ ‘ 100 ‘d’ 101 ‘e’ 112 ‘p’ 116 ‘t’ 110 ‘n’ 111 ‘o’ 61 ‘=’
0x7fffff1de9f8: 49 ‘1’ 48 ‘0’ 0 ‘\000’ -13 ‘? 108 ‘l’ 92 ‘\\’ 107 ‘k’ -64 ‘?
–//拼接起来就是 select * from dept where deptno=10\0;
breakpoint 1, 0x00000000097f09a8 in kggmd5update ()
length: 1
0x9e79fec <_2__string.98.0>: 46 ‘.’ 0 ‘\000’ 0 ‘\000’ 0 ‘\000’ 107 ‘k’ 116 ‘t’ 99 ‘c’ 110 ‘n’
0x9e79ff4 <_2__string.377.0+4>: 46 ‘.’ 99 ‘c’ 64 ‘@’ 49 ‘1’ 50 ‘2’ 54 ‘6’ 49 ‘1’ 55 ‘7’
0x9e79ffc <_2__string.377.0+12>: 0 ‘\000’ 0 ‘\000’ 0 ‘\000’ 0 ‘\000’ 37 ‘%’ 42 ‘*’ 115 ‘s’ 102 ‘f’
0x9e7a004 <_2__string.366.0+4>: 108 ‘l’ 103 ‘g’ 115 ‘s’ 58 ‘:’ 32 ‘ ‘ 48 ‘0’ 120 ‘x’ 37 ‘%’
0x9e7a00c <_2__string.366.0+12>: 48 ‘0’ 56 ‘8’ 120 ‘x’ 32 ‘ ‘ 0 ‘\000’ 0 ‘\000’ 0 ‘\000’ 0 ‘\000’
–//length=1 对应’.’
breakpoint 1, 0x00000000097f09a8 in kggmd5update ()
length: 2
0x7fffff1dc460: 49 ‘1’ 49 ‘1’ 0 ‘\000’ 0 ‘\000’ 0 ‘\000’ 0 ‘\000’ 0 ‘\000’ 0 ‘\000’
0x7fffff1dc468: 0 ‘\000’ 0 ‘\000’ 0 ‘\000’ 0 ‘\000’ 0 ‘\000’ 0 ‘\000’ 0 ‘\000’ 0 ‘\000’
0x7fffff1dc470: -128 ‘\200’ -57 ‘? 29 ‘\035’ -1 ‘’ -1 ‘’ 127 ‘\177’ 0 ‘\000’ 0 ‘\000’
0x7fffff1dc478: 49 ‘1’ 41 ‘)’ -125 ‘\203’ 9 ‘\t’ 0 ‘\000’ 0 ‘\000’ 0 ‘\000’ 0 ‘\000’
0x7fffff1dc480: -80 ‘? -55 ‘? 29 ‘\035’ -1 ‘’ -1 ‘’ 127 ‘\177’ 0 ‘\000’ 0 ‘\000’
–//注意看这里,length: 2,字符正好是’11’.
breakpoint 4, 0x00000000097f0830 in kggmd5finish ()
breakpoint 1, 0x00000000097f09a8 in kggmd5update ()
length: 18
0xbefbe20 <kggmd5padding.0>: -128 ‘\200’ 0 ‘\000’ 0 ‘\000’ 0 ‘\000’ 0 ‘\000’ 0 ‘\000’ 0 ‘\000’ 0 ‘\000’
0xbefbe28 <kggmd5padding.0+8>: 0 ‘\000’ 0 ‘\000’ 0 ‘\000’ 0 ‘\000’ 0 ‘\000’ 0 ‘\000’ 0 ‘\000’ 0 ‘\000’
0xbefbe30 <kggmd5padding.0+16>: 0 ‘\000’ 0 ‘\000’ 0 ‘\000’ 0 ‘\000’ 0 ‘\000’ 0 ‘\000’ 0 ‘\000’ 0 ‘\000’
0xbefbe38 <kggmd5padding.0+24>: 0 ‘\000’ 0 ‘\000’ 0 ‘\000’ 0 ‘\000’ 0 ‘\000’ 0 ‘\000’ 0 ‘\000’ 0 ‘\000’
0xbefbe40 <kggmd5padding.0+32>: 0 ‘\000’ 0 ‘\000’ 0 ‘\000’ 0 ‘\000’ 0 ‘\000’ 0 ‘\000’ 0 ‘\000’ 0 ‘\000’
breakpoint 1, 0x00000000097f09a8 in kggmd5update ()
length: 8
0x7fffff1dc2a0: 48 ‘0’ 1 ‘\001’ 0 ‘\000’ 0 ‘\000’ 0 ‘\000’ 0 ‘\000’ 0 ‘\000’ 0 ‘\000’
0x7fffff1dc2a8: 0 ‘\000’ 0 ‘\000’ 0 ‘\000’ 0 ‘\000’ 0 ‘\000’ 0 ‘\000’ 0 ‘\000’ 0 ‘\000’
0x7fffff1dc2b0: 32 ‘ ‘ -53 ‘? 29 ‘\035’ -1 ‘’ -1 ‘’ 127 ‘\177’ 0 ‘\000’ 0 ‘\000’
0x7fffff1dc2b8: 0 ‘\000’ 0 ‘\000’ 0 ‘\000’ 0 ‘\000’ 0 ‘\000’ 0 ‘\000’ 0 ‘\000’ 0 ‘\000’
0x7fffff1dc2c0: 96 ‘`’ -61 ‘? 29 ‘\035’ -1 ‘’ -1 ‘’ 127 ‘\177’ 0 ‘\000’ 0 ‘\000’
$ echo -e -n ‘select * from dept where deptno=10\0.11’ | md5sum | sed ‘s/ -//’ | xxd -r -p | od -t x4 | sed -n -e ‘s/^0000000 //’ -e ‘s/ //gp’
5196d0b7fe72e5ea7c59eeb2af4e4910
–//^_^,正好对上。
select name
,hash_value
,full_hash_value
,namespace
,child_latch
,property hot_flag
,executions
,invalidations
from v$db_object_cache
where name = ‘select * from dept where deptno=10’;
name hash_value full_hash_value namespace child_latch hot_flag executions invalidations
—————————————- ———- ——————————– ———- ———– ———- ———- ————-
select * from dept where deptno=10 2941143312 5196d0b7fe72e5ea7c59eeb2af4e4910 sql area 0 hotcopy11 3 0
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
select * from dept where deptno=10 2941143312 5196d0b7fe72e5ea7c59eeb2af4e4910 sql area 18704 hotcopy11 3 0
select * from dept where deptno=10 911274289 1431c45dbddbb9e74eaa74d53650f131 sql area 0 hot 8 0
select * from dept where deptno=10 911274289 1431c45dbddbb9e74eaa74d53650f131 sql area 61745 hot 8 0
–//也就是语句生成full_hash_value计算是原来sql语句(注意oracle会做一些格式化操作),后面加上\0 . v$db_object_cache.hot_flag字段后面的数字。
–//讲的再通俗一点就是在原来基础上加入 . v$db_object_cache.hot_flag字段后面的数字。
–//使用我写的脚本测试(注意要安装zsh):
$ ./sql_id.zsh ‘select * from dept where deptno=10\0.11’
sql_text = select * from dept where deptno=10.11
full_hash_value(16) = 5196d0b7fe72e5ea7c59eeb2af4e4910
hash_value(10) = 2941143312
sql_id(32) = 7sqgfqarnwk8h
sql_id(32) = 7sqgfqarnwk8h
–//sql_id=7sqgfqarnwk8h,也与前面查询v$sqlarea视图的结果一致。
4.继续探究,至于后面为什么加入11,估计与会话sid之类有关(猜测)。
–//退出gbd程序,继续分析。
–//首先我尝试退出再登录,我的测试环境sid会保持不变,serial#会发生变化。我执行select * from dept where deptno=10,查询
–//v$db_object_cache并没有生成新的sql_id.
scott@book> @ spid
sid serial# process server spid pid p_serial# c50
———- ———- ———————— ——— —— ——- ———- ————————————————–
58 49 54621 dedicated 54622 28 23 alter system kill session ‘58,49’ immediate;
scott@book> show parameter cpu_count
name type value
——— ——- —–
cpu_count integer 24
scott@book> select mod(58,24),mod(58,16) from dual ;
mod(58,24) mod(58,16)
———- ———-
10 10
–//是否就是这个sid与某个参数取模 10+1,因为没有见过hot_flag=’hotcopy0’的情况.至少我没有见过。
–//建立新的会话:
–//session 4:
scott@book> @ spid
sid serial# process server spid pid p_serial# c50
———- ———- ———————— ——— —— ——- ———- ————————————————–
30 115 55199 dedicated 55200 26 44 alter system kill session ‘30,115’ immediate;
scott@book> select mod(30,24),mod(30,16) from dual ;
mod(30,24) mod(30,16)
———- ———-
6 14
scott@book> select * from dept where deptno=10;
deptno dname loc
———- ————– ————-
10 accounting new york
–//session 3:
select name
,hash_value
,full_hash_value
,namespace
,child_latch
,property hot_flag
,executions
,invalidations
from v$db_object_cache
where name = ‘select * from dept where deptno=10’;
sys@book> /
name hash_value full_hash_value namespace child_latch hot_flag executions invalidations
—————————————- ———- ——————————– ———- ———– ———- ———- ————-
select * from dept where deptno=10 2941143312 5196d0b7fe72e5ea7c59eeb2af4e4910 sql area 0 hotcopy11 3 0
select * from dept where deptno=10 2941143312 5196d0b7fe72e5ea7c59eeb2af4e4910 sql area 18704 hotcopy11 3 0
select * from dept where deptno=10 911274289 1431c45dbddbb9e74eaa74d53650f131 sql area 0 hot 8 0
select * from dept where deptno=10 911274289 1431c45dbddbb9e74eaa74d53650f131 sql area 61745 hot 8 0
select * from dept where deptno=10 3106222595 642c74f9bf38538acec7e363b9253203 sql area 0 hotcopy7 1 0
select * from dept where deptno=10 3106222595 642c74f9bf38538acec7e363b9253203 sql area 78339 hotcopy7 1 0
6 rows selected.
–//生成新的hot_flag=hotcopy7.正好等于是mod(sid,cpu_count)+1.
sys@book> select sql_id,sql_text,executions,length(sql_text),ora_hash(sql_text) from v$sqlarea where sql_text = ‘select * from dept where deptno=10’ ;
sql_id sql_text executions length(sql_text) ora_hash(sql_text)
————- ———————————————————— ———- —————- ——————
7sqgfqarnwk8h select * from dept where deptno=10 3 34 156172166
4xamnunv51w9j select * from dept where deptno=10 8 34 156172166
cxjz3cfwkach3 select * from dept where deptno=10 1 34 156172166
~~~~~~~~~~~~~
–//sql_id=cxjz3cfwkach3,hot_flag=’hotcopy7′
$ echo -e -n ‘select * from dept where deptno=10\0.7’ | md5sum | sed ‘s/ -//’ | xxd -r -p | od -t x4 | sed -n -e ‘s/^0000000 //’ -e ‘s/ //gp’
642c74f9bf38538acec7e363b9253203
$ ./sql_id.zsh ‘select * from dept where deptno=10\0.7’
v1=642c74f9bf38538acec7e363b9253203 v2=cec7e363b9253203 v3=3106222595
sql_text = select * from dept where deptno=10.7
full_hash_value(16) = 642c74f9bf38538acec7e363b9253203
hash_value(10) = 3106222595
./sql_id.zsh:1: number truncated after 15 digits: cec7e363b9253203
sql_id(32) = 0tv3y6sxt4nt0
sql_id(32) = tv3y6sxt4nt0
–//脚本有错,先放一放.好像是v2变量里面第1个字符c不是数字,我记忆里好像是我使用服务器这个zsh版本的bug,晚上在家里测试看看。
–//使用另外的sql_id.sh脚本测试:
$ ./sql_id.sh ‘select * from dept where deptno=10\0.7’
v1=642c74f9bf38538acec7e363b9253203 v2=cec7e363b9253203 v3=b9253203
sql_text = select * from dept where deptno=10\0.7
full_hash_value(16) = 642c74f9bf38538acec7e363b9253203
hash_value(10) = 3106222595
sql_id(32) = cxjz3cfwkach3
sql_id(32) = cxjz3cfwkach3
sql_id(32) = cxjz3cfwkach3
–//正好对上。大家可以再打开新的会话测试,可以确定sql语句就是在原来基础上加入. mod(sid,cpu_count)+1数字的字符串。
总结:
–//上班太安静,无聊探究这个问题。
–//sql语句使用使用dbms_shared_pool.markhot标记热的sql_id时,full_hash_value和sql_id的计算,就是在原来sql语句的基础上加上
–// . mod(sid,cpu_count)+1数字的字符串。
–//使用dbms_shared_pool.markhot 标记热的sql语句,实际上就是使用空间换时间的做法,打散开来。但是我上午的测试可能存在太多争用
–//反而使用它更慢,有机会测试更多会话的情况。
–//也许因为加入运算的字符串采用 . mod(sid,cpu_count)+1数字的字符串,也许存在太多的冲突,反而更慢。
–//附上sql_id.sh脚本,里面包含几个从full_hash_value计算sql_id的方法:
$ cat sql_id.sh
#! /bin/bash
# calcucate sql_text of full_hash_value(16),hash_value(10),sql_id(32).
odebug=${odebug:-0}
#sql_text=${1}’\0′
sql_text=${1}
v1=$(echo -e -n “$sql_text” | md5sum | sed ‘s/ -//’ | xxd -r -p | od -t x4 | sed -n -e ‘s/^0\+ //’ -e ‘s/ //gp’ | tr ‘a-z’ ‘a-z’)
v2=${v1:(-16):16}
v3=${v2:(-8):8}
# v2=$(echo “obase=16;ibase=16; $v1 % 10000000000000000” | bc| tr -d ‘\\\r\n’)
# v3=$(echo “obase=10;ibase=16; $v1 % 100000000” | bc| tr -d ‘\\\r\n’)
if [ $odebug -eq 1 ] ; then
echo v1=$v1 v2=$v2 v3=$v3
fi
echo “sql_text = $sql_text”
echo “full_hash_value(16) = $v1 “
echo “hash_value(10) = $(( 16#$v3 )) “
base32=($(echo {0..9} {a..z} | tr -d ‘eilo’))
res=”
for i in $(echo “obase=32;ibase=16; $v2” | bc| tr -d ‘\\\r\n’)
do
res=${res}${base32[$(( 10#$i ))]}
done
echo “sql_id(32) = $(printf “%13s” $res | tr ‘ ‘ ‘0’)”
echo “sql_id(32) = $(printf “%013s” $res)”
res1=$(eval $(echo “obase=32;ibase=16; $v2″ | bc| tr -d ‘\\\r\n’ | awk ‘begin{rs=” +”; printf “echo ” }/./{printf “${base32[$(( 10#%02d))]} “, $1}’ ))
res1=$(tr -d ” ” <<< $res1)
echo “sql_id(32) = $(printf “%013s” $res1)”