您的位置:首页 > 数据库

验证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------------------------------------------
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息