在Oracle 10g之后版本中提供了一个新的伪列,ORA_ROWSCN,该伪列用来显示行级的SCN。 注意:只有在create table时加上ROWDEPENDENCIES关键字,才可以启动行级SCN的记录,否则ORA_ROWSCN只会显示该行所在的block头部记录的SCN。ROWDEPENDENCIES关键字只有在创建表的时候可以使用,表一旦被创建该属性则无法变更。 SQL> select ora_rowscn,a.* from dept a; ORA_ROWSCN DEPTNO DNAME LOC ———- —— ————– ————- 1514356 10 ACCOUNTING NEW YORK 1514356 20 RESEARCH DALLAS 1514356 30 SALES CHICAGO 1514356 40 OPERATIONS BOSTON 怎么使用ORA_ROWSCN则需要发挥大家智慧。下面是两则有趣的例子。 1. 如何使用ORA_ROWSCN来避免更新在选取了之后又被其它会话更新过的记录,从而避免使用select … for update来锁定数据行。 ORA_ROWSCN: The pseudo Column 2. 如何在不开启Audit的情况下,估算某表被最新改动的时间(不是DDL改动,而是DML改动)。 When was a table last changed? 在你们的应用中使用到这个伪列了吗?
Tag: Oracle10g
CBO need more human brains?
从Oracle8中引入的CBO和统计信息收集功能在8i,9i,10g,11g中一直在发展,CBO的设计理想是美好的,但是一直以来也受到用户的质疑,CBO的不够智能,或者说某些时候过于笨,有些时候又过于自作聪明,引发了很多问题。 11g推出之后,Oracle在完善CBO自身功能的同时,又添加了很多允许用户参与的功能,也许言下之意是,CBO的完善还有很长的路要走,但是面对各种现实问题,还是先允许更加聪明的人类用户来参与影响SQL的执行计划吧。 看看新提供的DBMS_STATS.COPY_TABLE_STATS功能,该功能可以改善对于使用range方式来分区的大分区表的统计信息生成方式,这种表往往统计信息更新赶不上数据更新。通过copy statistics可以将一个已经存在的分区统计信息复制到新生成的分区中,该方法基于的理念是每个业务分区的统计信息在数据条数,数据分布,NDV值等等方面都是基本相同的。 再加上之前介绍的SPM功能,也同样是允许用户来决定最终使用哪个执行计划的举措。 数据库管理越来越智能,并不意味着数据库管理员的工作越来越少了。
Automatic tuning of db_file_multiblock_read_count
db_file_multiblock_read_count曾经是一个经过热烈讨论的初始化参数。该参数只有在对表或者索引进行Full Scan的时候才起作用。 在Oracle10gR2以前的版本中,DBA必须根据db_block_size参数,以及应用系统的特性,来调整db_file_multiblock_read_count参数。该参数值将影响CBO在该产生何种SQL执行计划上的判断。 我们知道如下的公式,其中max I/O chunk size跟操作系统有关,但是Oracle文档中也指出大多数操作系统上该值为1M。 db_file_multiblock_read_count = max I/O chunk size / db_block_size 在Oracle10gR2之后的版本(10gR2和11g)中,Oracle数据库已经可以根据系统的IO能力以及Buffer Cache的大小来动态调整该参数值,Oracle建议不要显式设置该参数值。但是根据Oracle官方文档对于此参数的解释: Note that if the number of sessions is extremely large the multiblock read count value is decreased to avoid the buffer cache getting flooded with too many table scan buffers. Even though the default value may be a…