夏令时与Oracle PatchSet 10.2.0.4

夏令时与Oracle PatchSet 10.2.0.4

Oracle10.2.0.4发布有一段时间了,在Metailink上搜索Patch Number:6810189,即可获得下载,目前已经发布了Linux X86/Linux X86_64/windows(32)三个版本,据说Solaris版本也已经发布,但是到今天Metalink上还是没有看到。

10.2.0.4中包含了DSTv4(Daylight Saving Time,也就是所谓的夏令时)的更新,所以如果你原有的系统中有使用Time Zone相关数据类型的(主要是TIMESTAMP WITH LOCAL TIME ZONE (TSLTZ)和TIMESTAMP WITH TIME ZONE (TSTZ)两种),升级之前需要检查系统的DST版本,然后做出相应的处理。

执行以下SQL,看数据库中是否使用了受影响的数据类型:

select c.owner || '.' || c.table_name || '(' || c.column_name || ') -' || c.data_type || ' ' col
  from dba_tab_cols c, dba_objects o
 where c.data_type like '%TIME ZONE'
    and c.owner=o.owner
   and c.table_name = o.object_name
   and o.object_type = 'TABLE'
order by col
/

如果没有,恭喜你,不用管啥DST了。如果有记录,那么根据现有的DST和Oracle版本的不同,需要做不同的处理。具体请参考Metalink(Note:553812.1)

如果是10g,可以通过如下SQL查询目前的DST版本:

select * from v$timezone_file;

如果是9i,是没有视图可以直接查的,Metalink上提供了一个utltzver.sql的脚本可以查询。

关于夏令时和Oracle,还可以参考Fenng的文章

使用_px_trace跟踪分析并行执行的情况

并行在系统资源充足的情况下,可以极大的加快操作的速度,在数据仓库环境中应用较多。而在OLTP环境中,由于并发较大,开启并行可能瞬间导致资源耗尽,所以一般只有在业务低估期间执行一些诸如创建索引等维护操作时才会考虑开启并行,并且在执行完成后去掉对象的并行度,否则可能后果很严重。

由于并行涉及到多个进程间分配协调任务,往往比较容易出现各种各样的问题,而且从数据字典中比较难以定位到具体的原因。Oracle提供了一些event来trace并行过程,如10384,10390,10399等等,但是这些event往往无法trace整个的并行过程,有时候需要设置多个event才能trace到我们需要的内容。而_px_trace则提供了一个统一的trace入口,并且有些信息还是event无法trace到的。

语法如下:

alter session set "_px_trace"=[[Verbosity,]area],[[Verbosity,]area],..,[time];
SQL> alter session set "_px_trace"="compilation","execution","messaging","time";

会话已更改。

SQL> select count(*) from test;

  COUNT(*)
----------
     11846

SQL> alter session set "_px_trace"="none";

会话已更改。

生成的trace文件比较多,qc和slave进程都会生成相应的trace文件。具体的trace信息分析我这里就不写了,有兴趣的可以参考Metalink(Note:444164.1)

Oracle一个典型行列转换的几种实现方法

假如有如下表,其中各个i值对应的行数是不定的

SQL> select * from t;

         I A          D
---------- ---------- -------------------
         1 b          2008-03-27 10:55:42
         1 a          2008-03-27 10:55:46
         1 d          2008-03-27 10:55:30
         2 z          2008-03-27 10:55:55
         2 t          2008-03-27 10:55:59

要获得如下结果,注意字符串需要按照D列的时间排序:

1  d,b,a
2  z,t

这是一个比较典型的行列转换,有好几种实现方法

[继续阅读全文]

MySQL InnoDB存储引擎的事务隔离级别

我们知道,在关系数据库标准中有四个事务隔离级别:

查看InnoDB系统级别的事务隔离级别:

mysql> SELECT @@global.tx_isolation;
+-----------------------+
| @@global.tx_isolation |
+-----------------------+
| REPEATABLE-READ       |
+-----------------------+
1 row in set (0.00 sec)

查看InnoDB会话级别的事务隔离级别:

mysql> SELECT @@tx_isolation;
+-----------------+
| @@tx_isolation  |
+-----------------+
| REPEATABLE-READ |
+-----------------+
1 row in set (0.00 sec)

修改事务隔离级别:

mysql> set global transaction isolation level read committed;
Query OK, 0 rows affected (0.00 sec)

mysql> set session transaction isolation level read committed;
Query OK, 0 rows affected (0.00 sec)

[继续阅读全文]