[20150616]关于sql_id.txt

[20150616]关于sql_id.txt

--我曾经提到PLSQL中使用绑定变量,oracle会格式化处理,转化为特定的格式。可以参考我以前的例子:
--[20121102]PLSQL中的绑定变量.txt
--http://blog.itpub.net/267265/viewspace-748190/

--我也曾经写过一篇exact_matching_signature,force_matching。
--http://blog.itpub.net/267265/viewspace-1220996/
--计算exact_matching_signature,force_matching时也经过了"格式化"处理。

--今天讲一下sql语句,我记得以前讲sql关于绑定变量时,要求开发写sql语句遵循一定的规范,比如select,where等关键字大写,字段小写等等。
--实际上现在想想意义不大,国内大部分应用都没有使用绑定变量.要求这些规范没用。

1.看看sql语句。

SCOTT@test> @ver1

PORT_STRING          VERSION        BANNER
-------------------- -------------- --------------------------------------------------------------------------------
x86_64/Linux 2.4.xx  11.2.0.3.0     Oracle Database 11g Enterprise Edition Release 11.2.0.3.0 - 64bit Production

$ cat -eT a1.sql
select *$
from dept$
where deptno=10;$
--这样可以看出文件的一些特殊符号。

$ cp a1.sql a2.sql

SCOTT@test> alter system flush shared_pool;
System altered.

SCOTT@test> @a1
    DEPTNO DNAME          LOC
---------- -------------- -------------
        10 ACCOUNTING     NEW YORK

SCOTT@test> @dpc '' ''
PLAN_TABLE_OUTPUT
--------------------------------------------
SQL_ID  cv9sf48f5ka60, child number 0
-------------------------------------
select * from dept where deptno=10

--sql_id=cv9sf48f5ka60.

2.使用unix2dos转换a2.sql
$ unix2dos a2.sql
unix2dos: converting file a2.sql to DOS format ...

$ file a1.sql  a2.sql
a1.sql: ASCII text
a2.sql: ASCII text, with CRLF line terminators

SCOTT@test> @a2
    DEPTNO DNAME          LOC
---------- -------------- -------------
        10 ACCOUNTING     NEW YORK

SCOTT@test> select length ( SQL_FULLTEXT),sql_fulltext c40 ,executions , sys.dbms_sqltune_util0.sqltext_to_sqlid(sql_fulltext||chr(0)) c20 from v$sql where sql_id='cv9sf48f5ka60';
LENGTH(SQL_FULLTEXT) C40                                      EXECUTIONS C20
-------------------- ---------------------------------------- ---------- --------------------
                  34 select *                                          2 cv9sf48f5ka60
                     from dept
                     where deptno=10

--执行了2次。说明a2.sql执行的sql_id 与执行a1.sql的sql_id一样。

$ ls -l a1.sql
-rw-r--r--  1 oracle11g oinstall 36 2015-06-16 22:53:14 a1.sql

$ xxd -c 16 a1.sql
0000000: 7365 6c65 6374 202a 0a66 726f 6d20 6465  select *.from de
0000010: 7074 0a77 6865 7265 2064 6570 746e 6f3d  pt.where deptno=
0000020: 3130 3b0a                                10;.

--a1.sql文件大小36,扣除最后的分号以及0x0a,长度正好是34.

3.修改a2.sql文件,在后面加入一些tab或者空格:

$ cat -eT a2.sql
select *      ^I^I^M$
from dept ^I^I    ^M$
where deptno=10;^M$

$ ls -l a2.sql
-rw-r--r--  1 oracle11g oinstall 54 2015-06-16 23:02:24 a2.sql

--^I 表示tab。a2.sql文件长度变成了54.

SCOTT@test> @a2
    DEPTNO DNAME          LOC
---------- -------------- -------------
        10 ACCOUNTING     NEW YORK

SCOTT@test> select length ( SQL_FULLTEXT),sql_fulltext c40 ,executions , sys.dbms_sqltune_util0.sqltext_to_sqlid(sql_fulltext||chr(0)) c20 from v$sql where sql_id='cv9sf48f5ka60';
LENGTH(SQL_FULLTEXT) C40                                      EXECUTIONS C20
-------------------- ---------------------------------------- ---------- --------------------
                  34 select *                                          3 cv9sf48f5ka60
                     from dept
                     where deptno=10

--a2.sql执行后sql_id依旧没有变化。
--说明:执行的sql语句计算sql_id实际上还是经历了一个"格式化"的过程。

4.覆盖a2.sql:
$ cp a1.sql a2.sql

--再修改如下:
$ cat -eT a2.sql
select *    ^M       $
from dept$
where deptno=10;$
--^M表示回车0x0d。

SCOTT@test> @a2
    DEPTNO DNAME          LOC
---------- -------------- -------------
        10 ACCOUNTING     NEW YORK

SCOTT@test> select length ( SQL_FULLTEXT),sql_fulltext c40 ,executions , sys.dbms_sqltune_util0.sqltext_to_sqlid(sql_fulltext||chr(0)) c20 from v$sql where sql_id='cv9sf48f5ka60';
LENGTH(SQL_FULLTEXT) C40                                      EXECUTIONS C20
-------------------- ---------------------------------------- ---------- --------------------
                  34 select *                                          4 cv9sf48f5ka60
                     from dept
                     where deptno=10

--执行次数加1.如果在select前面加入空格sql_id会变(这个测试不做了).

5.做1次刷新:
SCOTT@test> alter system flush shared_pool;
System altered.

SCOTT@test> @a2
    DEPTNO DNAME          LOC
---------- -------------- -------------
        10 ACCOUNTING     NEW YORK

SCOTT@test> select length ( SQL_FULLTEXT),sql_fulltext c40 ,executions , sys.dbms_sqltune_util0.sqltext_to_sqlid(sql_fulltext||chr(0)) c20 from v$sql where sql_id='cv9sf48f5ka60';
LENGTH(SQL_FULLTEXT) C40                                      EXECUTIONS C20
-------------------- ---------------------------------------- ---------- --------------------
                  34 select *                                          1 cv9sf48f5ka60
                     from dept
                     where deptno=10

总结:

--sql语句计算sql_id也是经历"格式化"过程,删除0x0d以及每行结尾的tab空格(除了分号这行)。是否有其它情况不得而知。

--补充测试,如果在分号前加入空格:

SCOTT@test> select sql_text,length ( SQL_FULLTEXT),sql_fulltext c40 ,executions , sys.dbms_sqltune_util0.sqltext_to_sqlid(sql_fulltext||chr(0)) c20 from v$sql where sql_id='1p8afzt6x1mhd';
SQL_TEXT                                                     LENGTH(SQL_FULLTEXT) C40                                      EXECUTIONS C20
------------------------------------------------------------ -------------------- ---------------------------------------- ---------- --------------------
select * from dept where deptno=10                                             35 select *                                          1 1p8afzt6x1mhd
                                                                                  from dept
                                                                                  where deptno=10

--长度变了,sql_id也与前面不同。

时间: 2024-07-29 11:49:53

[20150616]关于sql_id.txt的相关文章

[20141212]关于sql_id.txt

[20141212]关于sql_id.txt http://blog.itpub.net/267265/viewspace-1357292/ http://blog.itpub.net/267265/viewspace-1220996/ --昨天别人问一些sql_id计算的问题,实际上我也不懂具体的算法,我给他看了上面的链接. --他问的问题,还是通过例子来说明: SCOTT@test> @ver1 PORT_STRING                    VERSION        BA

[20141205]关于sql_id.txt

[20141205]关于sql_id.txt --昨天跟别人聊天,讲sql_id字串里面没有字符'o'.实际上他在学习sql_id与hash_value转换时copy 和 paste少粘贴1位,手工输入时以 --为是--字母'o',实际上是数字'0'. --顺便找一个sql_id,把最后以为换成o,看看结果: SYS@test> select dbms_utility.SQLID_TO_SQLHASH('f7nhbjdn5rx9o') from dual ; select dbms_utilit

[20131217]从sql语句计算sql_id.txt

[20131217]从sql语句计算sql_id.txt 这个方面的内容从网上能找到许多,从sql语句可以检查出sql_id的值以及HASH_VALUE的值. http://www.johnnydb.com/2012/03/sql_id-vs-hash_value/www.dbthink.com/?p=321 自己做一些测试以及总结,记录一些简单的方法在11G下: SYS@test> @verBANNER----------------------------------------------

[20160323]关于FULL_HASH_VALUE2.txt

[20160323]关于FULL_HASH_VALUE2.txt --前一阵子firefox遇到问题,测试插件Calculate Hash.链接: http://blog.itpub.net/267265/viewspace-2023144/ --实际上许多工具命令是相同的,linux下也有一个命令md5sum也可以拿来计算FULL_HASH_VALUE.测试看看: 1.环境: SCOTT@book> @ &r/ver1 PORT_STRING                    VERS

[20170724]关于sql_id那些事.txt

[20170724]关于sql_id那些事.txt --//昨天别人问的问题,我以前也写过许多blog,做一些总结: http://blog.itpub.net/267265/viewspace-1357292/ http://blog.itpub.net/267265/viewspace-1365382/ http://blog.itpub.net/267265/viewspace-1701985/ 1.环境: SCOTT@book> @ &r/ver1 PORT_STRING      

[20150803]无法通过sql_id找到sql语句3.txt

[20150803]无法通过sql_id找到sql语句3.txt --前一阵子,在做优化时遇到1个无法通过sql_id找到sql语句的情况: http://blog.itpub.net/267265/viewspace-1749265/ --就是因为共享池太小,执行次数少,没到取样时间,已经从共享池清除. --今天自己google,想想看看还有那种情况会出现呢?如果1条语句执行错误,会记录sql_id,当时查询v$sql视图应该也不能找到. --自己直接那生产系统看看: 1.建立测试环境: --

[20140807]hash_value sql_id冲突.txt

[20140807]hash_value sql_id冲突.txt --9i下使用v$sql仅仅有hash_value值,sql_id是到10g下才出现. --理论讲hash_values是sql_id的子集,发生冲突的可能性比使用sql_id,看了链接重复测试: http://externaltable.blogspot.com/2012/06/hash-collisions-sql-signatures-and.html SCOTT@test> @ver BANNER -----------

[20171031]markhot.txt

[20171031]markhot.txt --//昨天看了https://jonathanlewis.wordpress.com/2017/10/02/markhot/,测试看看这样时候可以减少争用. 1.环境: SCOTT@book> @ &r/ver1 PORT_STRING                    VERSION        BANNER ------------------------------ -------------- -------------------

[20171019]绑定变量的分配长度7.txt

[20171019]绑定变量的分配长度7.txt --//如果绑定变量中字符串分配占用空间的长度变化,oracle会建立子光标. --//参考连接: http://blog.itpub.net/267265/viewspace-1993495/ --//oracle 可以通过一个10503事件设置大的缓存,测试看看: $ oerr ora 10503 10503, 00000, "enable user-specified graduated bind lengths" // *Cau