[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> @ver
BANNER
--------------------------------------------------------------------------------
Oracle Database 11g Enterprise Edition Release 11.2.0.3.0 - 64bit Production

SYS@test> select sysdate from dual;
SYSDATE
-------------------
2013-12-18 10:03:56

SYS@test> @dpc '' ''
PLAN_TABLE_OUTPUT
-------------------------------------
SQL_ID  7h35uxf5uhmm1, child number 0
-------------------------------------
select sysdate from dual

Plan hash value: 1388734953

-------------------------------------------------------
| Id  | Operation        | Name | E-Rows | Cost (%CPU)|
-------------------------------------------------------
|   0 | SELECT STATEMENT |      |        |     2 (100)|
|   1 |  FAST DUAL       |      |      1 |     2   (0)|
-------------------------------------------------------
-- sql_id='7h35uxf5uhmm1'.

SYS@test> select sql_id,hash_value from v$sql where sql_id='7h35uxf5uhmm1';
SQL_ID               HASH_VALUE
-------------------- ----------
7h35uxf5uhmm1        2343063137

SYS@test> select dbms_sqltune_util0.sqltext_to_sqlid('select sysdate from dual'||chr(0)) sql_id from dual;
SQL_ID
--------------------
7h35uxf5uhmm1

SYS@test> select dbms_utility.sqlid_to_sqlhash('7h35uxf5uhmm1') from dual;
DBMS_UTILITY.SQLID_TO_SQLHASH('7H35UXF5UHMM1')
----------------------------------------------
                                    2343063137

--sql语句后面要补充1个chr(0).正好对上.

在12c上:

SYS@ztest> @ver
BANNER                                                                               CON_ID
-------------------------------------------------------------------------------- ----------
Oracle Database 12c Enterprise Edition Release 12.1.0.1.0 - 64bit Production              0

SYS@ztest> select dbms_sql_translator.sql_id ('select sysdate from dual') sql_id, dbms_sql_translator.sql_hash ('select sysdate from dual') hash_value  from dual;
SQL_ID               HASH_VALUE
-------------------- ----------
7h35uxf5uhmm1        2343063137

SYS@ztest> define s='select sysdate from dual';
SYS@ztest> select dbms_sql_translator.sql_id ('&s') sql_id, dbms_sql_translator.sql_hash ('&s') hash_value  from dual;
old   1: select dbms_sql_translator.sql_id ('&s') sql_id, dbms_sql_translator.sql_hash ('&s') hash_value  from dual
new   1: select dbms_sql_translator.sql_id ('select sysdate from dual') sql_id, dbms_sql_translator.sql_hash ('select sysdate from dual') hash_value  from dual
SQL_ID               HASH_VALUE
-------------------- ----------
7h35uxf5uhmm1        2343063137

时间: 2024-10-23 18:20:58

[20131217]从sql语句计算sql_id.txt的相关文章

[20171110]sql语句相同sql_id可以不同吗

[20171110]sql语句相同sql_id可以不同吗.txt --//提一个问题,就是sql语句相同sql_id可以不同吗? --//使用dbms_shared_pool.markhot就可以做到. 1.环境: SCOTT@book> @ &r/ver1 PORT_STRING                    VERSION        BANNER ------------------------------ -------------- -------------------

[20150715]一条sql语句的优化.txt

[20150715]一条sql语句的优化.txt --生产系统发现一条语句. update presc_check t set t.diagnosis=replace(t.diagnosis,',慢性病drugs','') --第1眼看到的感觉真的很想骂人,什么能没有where条件呢? --我把这个表拷贝过来.这个表占用1G多1点,在测试环境执行看看: -- copy from system/xxxx@ip:1521/tyt create presc_check using select * f

[20130319]一条sql语句的优化.txt

[20130319]一条sql语句的优化.txt 生产系统,遇到这样一条语句:SELECT MAX (LENGTH (pe_id)) FROM pe_master_index WHERE SUBSTR (pe_id, 1, 2) = 'TJ'; --真不知道开发人员如何想的,写出这样的语句.字段pe_id是主键.--数据库版本 SQL> select * from v$version where rownum BANNER                                     

[20131025]一条sql语句的优化.txt

[20131025]一条sql语句的优化.txt 最近在优化一条sql语句,做一个测试例子测试看看.遇到一些问题记录一下: 1.建立环境: SCOTT@test> @ver BANNER -------------------------------------------------------------------------------- Oracle Database 11g Enterprise Edition Release 11.2.0.3.0 - 64bit Productio

SQL语句计算两个日期之间有多少个工作日的方法_MsSql

/* 因为工作中一个奇怪的需求,要用SQL语言计算两个日期间有多少个工作日. 设定是一个星期有5个工作日,从星期一到星期五 说明:   第一个星期的工作日数:DATEPART(dw, @begdt)-DATEPART(dw, @begdt),最少0天   末一个星期的工作日数:DATEPART(dw, @enddt),最多5天 计算方法:   如果两个日期处在同一个星期内,直接计算"第一个星期的工作日数"   否则按下面的公式计算     (两个日期间的总天数 - 第一个星期的天数 -

[20120319]一条sql语句的优化.txt

前天检查数据库,发现一天sql语句执行如下:SELECT MAX (undrug_code)   FROM undrug_info  WHERE SUBSTR (undrug_code, 1, 1) = 'F'; undrug_code是表undrug_info的主键.开始看见这个语句,感觉这样写不好,我想像的执行计划,全扫描索引,然后sort aggregate,找到最大值. 不如这样写:SELECT MAX (undrug_code)   FROM undrug_info  WHERE un

SQL语句计算两个日期之间有多少个工作日的方法

/* 因为工作中一个奇怪的需求,要用SQL语言计算两个日期间有多少个工作日. 设定是一个星期有5个工作日,从星期一到星期五 说明:   第一个星期的工作日数:DATEPART(dw, @begdt)-DATEPART(dw, @begdt),最少0天   末一个星期的工作日数:DATEPART(dw, @enddt),最多5天 计算方法:   如果两个日期处在同一个星期内,直接计算"第一个星期的工作日数"   否则按下面的公式计算     (两个日期间的总天数 - 第一个星期的天数 -

[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

0624使用10035事件跟踪无法执行的sql语句

[20160624]使用10035事件跟踪无法执行的sql语句.txt --昨天看一份awr报表,链接如下: http://www.itpub.net/thread-2061952-1-1.html --摘要如下: Top 10 Foreground Events by Total Wait Time Event                              Waits     Total Wait Time (sec)    Wait Avg(ms)  % DB time    W