验证TimesTen统计收集后SQL重新编译
来源:互联网 发布:手机怎么进淘宝直通车 编辑:程序博客网 时间:2024/05/17 21:28
统计信息收集无论是在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------------------------------------------
0 0
- 验证TimesTen统计收集后SQL重新编译
- TimeSten相关收集
- ORA-04045:在重新编译/重新验证时出错
- VMWare 更新至 Hardy 后重新编译
- [delphi]修改indy源码后重新编译
- 添加更改文件后重新编译androidstudio
- caffe + anaconda2 重新编译后出现问题
- caffe 改动后的重新编译
- caffe 改动后的重新编译
- sql行列统计后,行列转换显示
- js实现按钮点击60秒后重新启用(重新发送验证码)
- asterisk 卸载后,重新编译安装的脚本
- freeBSD重新编译内核后Mysql,Squid无法启动
- C#中修改Dll文件 (反编译后重新编译)
- DLL导出接口累,避免修改后重新编译
- 关于flexpaper源码重新编译后样式丢失的问题
- 关于重新编译内核后VirtualBox不能使用的问题
- 升级内核版本后,需要重新编译一下网卡驱动
- Android 软件盘 弹出和隐藏的处理
- MySQL 不支持 top n,改用 limit
- hdu 1421 搬寝室 (DP)
- C#中as是什么含义?is是什么含义?
- android 浏览器插件开发 - Log
- 验证TimesTen统计收集后SQL重新编译
- HDU 4823 &&HDU 4826 百度之星资格赛的两道简单题。。。
- c++ 虚函数的实现机制
- 《Java NIO》读书笔记
- 一个冒泡排序
- android 浏览器插件开发 - 流程(1)
- Lucene.net实现搜索
- LINUX C++ 数据库连接池
- Android开发者将越来越有前途