验证TimesTen统计收集后SQL重新编译
2014-05-25 22:54
405 查看
统计信息收集无论是在Oracle还是在TimesTen中,都是属于例行的工作,为SQL执行能够采用最新的统计信息,采用最优的执行计划,生产系统我们一般都会采用定时统计收集的作业,Oracle比较强大,一般不会出现统计收集获取不到锁而引发问题,顶多就是使用不到最新的执行计划,但是对于TimesTen来说就没那么强大了,很容易由于获取不到锁而引发故障。
术语解释:
SQL command: 每个SQL在编译后,都会被重复使用,如果在一个transaction中执行了这个SQL,那么就会在这个SQL编译好的command上面加一个S(共享锁)。
Invalidate: 统计信息收集之后,所有的SQL都会被标记为invalid,下一次这个SQL被执行的时候就会被重新编译,来使用最新的统计信息。
为了重新编译,必须加一个X(排他)锁,获取不到X锁,将会不断的尝试,阻塞后面的业务。
===》测试:
Command> set autocommit off;
The command succeeded.
Command> Prepare select * from t;
Assigning new prepared command id = 0.
The command succeeded.
Command>
Command> Execute;
Executing prepared command id = 0.
The command succeeded.
===》打开一个新的窗口,查看锁信息。
[timesten@TT11g-03 ~]$ ttxactadmin abm
2013-09-30 15:41:07.462
/ttchk/DataStore/11g/ABM/abmdata
TimesTen Release 11.2.1.9.8
Outstanding locks
PID Context TransID TransStatus Resource ResourceID Mode SqlCmdID Name
Program File Name: ttIsqlCmd
4725 0x1f32a780 1.7 Active Database 0x01312d0001312d00 IX 0
Command 2152156912 S 2152156912
===》这里可以看到有一个Command S锁,下面执行统计收集。
Command> call ttOptEstimateStats('TIMESTEN.T',1,'51 PERCENT');
The command succeeded.
===》统计信息收集完成后,在一个新的窗口(当前窗口也可以,只要与第一个回话相异),就可以看到请求锁超时,也就是说在之前的回话没有结束前,其他使用该SQL的新回话都会超时退出。
Command> set autocommit off;
The command succeeded.
Command> Prepare select * from t;
Assigning new prepared command id = 0.
Source File: cmdutil.c on line number 1497
SQL State: S1T00
Native Error Code: 6003
Error Message: [TimesTen][TimesTen 11.2.1.9.8 ODBC Driver][TimesTen]TT6003: Lock request denied because of time-out
Details: Tran 3.2 (pid 4752) wants X lock on command 2152156912. But tran 1.7 (pid 4725) has it in S (request was S). Holder SQL (select * from t) -- file "cmdComp.c", lineno 2829, procedure "sbSqlCmdRecompile"
The command failed.
Command> exit
问题:为什么统计信息收集完成后会造成锁等待?
答:1、每个SQL在编译后,都会被重复使用,如果在一个事务中执行了这个SQL,那么就会在上面加一个S(共享锁),直到事务提交完成。
2、在统计收集完成后,所有的SQL都会被标记为invalid,这样,统计收集后的第一次执行这个SQL被执行的时候就会被重新编译,来使用最新的统计信息,往后都会被重复使用。 为了重新编译,必须加一个X(排他)锁,如果在获取X锁的时候,因为有些事务还没有结束,那么这个SQL的S锁还存在, 那么X锁就无法获得。
-----------------End------------------------------------------
术语解释:
SQL command: 每个SQL在编译后,都会被重复使用,如果在一个transaction中执行了这个SQL,那么就会在这个SQL编译好的command上面加一个S(共享锁)。
Invalidate: 统计信息收集之后,所有的SQL都会被标记为invalid,下一次这个SQL被执行的时候就会被重新编译,来使用最新的统计信息。
为了重新编译,必须加一个X(排他)锁,获取不到X锁,将会不断的尝试,阻塞后面的业务。
===》测试:
Command> set autocommit off;
The command succeeded.
Command> Prepare select * from t;
Assigning new prepared command id = 0.
The command succeeded.
Command>
Command> Execute;
Executing prepared command id = 0.
The command succeeded.
===》打开一个新的窗口,查看锁信息。
[timesten@TT11g-03 ~]$ ttxactadmin abm
2013-09-30 15:41:07.462
/ttchk/DataStore/11g/ABM/abmdata
TimesTen Release 11.2.1.9.8
Outstanding locks
PID Context TransID TransStatus Resource ResourceID Mode SqlCmdID Name
Program File Name: ttIsqlCmd
4725 0x1f32a780 1.7 Active Database 0x01312d0001312d00 IX 0
Command 2152156912 S 2152156912
===》这里可以看到有一个Command S锁,下面执行统计收集。
Command> call ttOptEstimateStats('TIMESTEN.T',1,'51 PERCENT');
The command succeeded.
===》统计信息收集完成后,在一个新的窗口(当前窗口也可以,只要与第一个回话相异),就可以看到请求锁超时,也就是说在之前的回话没有结束前,其他使用该SQL的新回话都会超时退出。
Command> set autocommit off;
The command succeeded.
Command> Prepare select * from t;
Assigning new prepared command id = 0.
Source File: cmdutil.c on line number 1497
SQL State: S1T00
Native Error Code: 6003
Error Message: [TimesTen][TimesTen 11.2.1.9.8 ODBC Driver][TimesTen]TT6003: Lock request denied because of time-out
Details: Tran 3.2 (pid 4752) wants X lock on command 2152156912. But tran 1.7 (pid 4725) has it in S (request was S). Holder SQL (select * from t) -- file "cmdComp.c", lineno 2829, procedure "sbSqlCmdRecompile"
The command failed.
Command> exit
问题:为什么统计信息收集完成后会造成锁等待?
答:1、每个SQL在编译后,都会被重复使用,如果在一个事务中执行了这个SQL,那么就会在上面加一个S(共享锁),直到事务提交完成。
2、在统计收集完成后,所有的SQL都会被标记为invalid,这样,统计收集后的第一次执行这个SQL被执行的时候就会被重新编译,来使用最新的统计信息,往后都会被重复使用。 为了重新编译,必须加一个X(排他)锁,如果在获取X锁的时候,因为有些事务还没有结束,那么这个SQL的S锁还存在, 那么X锁就无法获得。
-----------------End------------------------------------------
相关文章推荐
- 在SQL分组统计中怎么求出:A列最大值(MAX)对应行B列的值 未验证
- 【原】SQL存储过程调用慢,但是重新编译一下存储过程就很快
- 查看Oracle数据库中表的历次统计信息收集的sql
- 重新编译所有无效的PL/SQL模块(对象)
- 不重新编译PHP为PHP安装zlib扩展-学习收集
- Oracle触发器编译错误之ORA-04098: 触发器 无效且未通过重新验证
- SQL当修改表的时候,必须重新编译与之相关联的视图。
- T-SQL性能调整(一)--编译和重新编译
- PL/SQL重新编译包无反应案例2
- 收集SQL语句统计每天、每月、每年的数据
- SQL调优之收集统计信息,重建索引 .
- Scripts:重新编译失效对象的脚本(生产环境慎用)dba_recompile_invalid_objects.sql
- PL/SQL之触发器重新编译和删除,禁止和开启
- Oracle 统计信息过期的表重新收集统计信息
- 不重新编译PHP为PHP安装zlib扩展-学习收集
- pl/sql developer 存储过程编译后,重新打开 中文显示乱码
- PL/SQL重新编译包无反应
- 【原】SQL存储过程调用慢,但是重新编译一下存储过程就很快
- 从一个SQL使用了不理想的执行计划说开,浅谈执行计划如何估算cache信息的影响及系统统计信息的收集等(2010-10-15)