[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        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

SCOTT@test> select 1 from dual;
         1
----------
         1

SCOTT@test> @dpc '' ''
PLAN_TABLE_OUTPUT
-------------------------------------
SQL_ID  520mkxqpf15q8, child number 0
-------------------------------------
select 1 from dual
Plan hash value: 1388734953
-------------------------------------------------------
| Id  | Operation        | Name | E-Rows | Cost (%CPU)|
-------------------------------------------------------
|   0 | SELECT STATEMENT |      |        |     2 (100)|
|   1 |  FAST DUAL       |      |      1 |     2   (0)|
-------------------------------------------------------
SCOTT@test> select sql_text,sql_id,hash_value,executions from v$sql where sql_id='520mkxqpf15q8';
SQL_TEXT                                                     SQL_ID        HASH_VALUE EXECUTIONS
------------------------------------------------------------ ------------- ---------- ----------
select 1 from dual                                           520mkxqpf15q8 2866845384          1

--sql_id=520mkxqpf15q8,HASH_VALUE=2866845384.

--通过另外的视图可以获得full_hash_value。

SCOTT@test> select hash_value, to_char(hash_value,'xxxxxxxx') hex_hash_value, full_hash_value,substr(full_hash_value,-8) hash_x
            from GV$DB_OBJECT_CACHE where name='select 1 from dual';
HASH_VALUE HEX_HASH_ FULL_HASH_VALUE                  HASH_X
----------- --------- -------------------------------- ----------------
2866845384  aae096c8 7d4dc9b423f0bcfb510272edaae096c8 aae096c8
2866845384  aae096c8 7d4dc9b423f0bcfb510272edaae096c8 aae096c8

--sql_id的计算是使用MD5算法进行哈希,生成一个128位的Hash Value,其中低32位作为HASH VALUE显示,SQL_ID则取了后64位。
--低3位对应16进制就是取8个字符,对比上面的输出hex_hash_value结果与是正确的。按照这样讲510272edaae096c8 (FULL_HASH_VALUE的后16位
--就是sql_id),问的问题是为什么不等于sql_id.

--实际上sql_id是使用32进制,而FULL_HASH_VALUE使用的16进制,要做一个进制转换就可以得出结论。

--先转换为10进制。
SCOTT@test> set numw 20
SCOTT@test> select to_number(substr(full_hash_value,-16),'xxxxxxxxxxxxxxxxxxxx') sql_id10, full_hash_value
from GV$DB_OBJECT_CACHE where name='select 1 from dual' and rownum            SQL_ID10 FULL_HASH_VALUE
-------------------- --------------------------------
5837354432125245128 7d4dc9b423f0bcfb510272edaae096c8

--10进制如何转32进制,sql语句不好写。写一个递归看看(11G才支持这种功能)。

SELECT SUBSTR ('0123456789abcdfghjkmnpqrstuvwxyz', a + 1, 1) c,rownum
  FROM (WITH data (a, b)
             AS (SELECT MOD (&1, 32) a, TRUNC (&1 / 32) b FROM DUAL
                 UNION ALL
                 SELECT MOD (b, 32) a, TRUNC (b / 32) b
                   FROM data
                  WHERE b 0)
        SELECT a
          FROM data);

Enter value for 1: 5837354432125245128
Enter value for 1: 5837354432125245128
old   3:              AS (SELECT MOD (&1, 32) a, TRUNC (&1 / 32) b FROM DUAL
new   3:              AS (SELECT MOD (5837354432125245128, 32) a, TRUNC (5837354432125245128 / 32) b FROM DUAL

C      ROWNUM
-- ----------
8           1
q           2
5           3
1           4
f           5
p           6
q           7
x           8
k           9
m          10
0          11
2          12
5          13

13 rows selected.

--从下往上看,与sql_id=520mkxqpf15q8正好对上。完善一下,使用wmsys.wm_concat(注:使用它不是很好,只要我太懒)
--[141204]11G关于使用wmsys.wm_concat的问题  http://blog.itpub.net/267265/viewspace-1356256/

select replace(wmsys.wm_concat(c),',') from (
select c from (
SELECT SUBSTR ('0123456789abcdfghjkmnpqrstuvwxyz', a + 1, 1) c,rownum rn
  FROM (WITH data (a, b)
             AS (SELECT MOD (&1, 32) a, TRUNC (&1 / 32) b FROM DUAL
                 UNION ALL
                 SELECT MOD (b, 32) a, TRUNC (b / 32) b
                   FROM data
                  WHERE b !=0
                  )
        SELECT a
          FROM data)) order by rn desc);

REPLACE(WMSYS.WM_CONCAT(C),',')
--------------------------------
520mkxqpf15q8

--正好对上。为什么sql_id使用32进制,不使用16进制,这个我就不知道了。

时间: 2024-09-20 20:39:09

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

[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

[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-1220

[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

[20141212]ORA-01722.txt

[20141212]ORA-01722.txt --昨天做优化,遇到一个奇怪的问题,记录一下. SCOTT@test> @ver1 PORT_STRING                    VERSION        BANNER ------------------------------ -------------- -------------------------------------------------------------------------------- x86_

[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 ------------------------------ -------------- -------------------