验证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------------------------------------------
0 0
原创粉丝点击