2010年11月26日星期五

ORACLE里面的统计行数

ORACLE里面有很多统计用的函数,比如COUNT, SUM, MAX, LAST_VALUE, FIRST_VALUE。
乍一看可能觉得很好理解,没什么复杂的。
但是如果一个窗口的概念不弄明白的话,你会觉得很复杂,很难用,然后怀疑这些个函数都不好用了。

比方说你想一张薪水的历史记录表,
salary_history
emp_id,
salary,
update_date

你想找出每个人最新的薪水的值
select last_value(salary) over (partition by emp_id order by update_date rows between unbounded preceding and unbounded following) from salary_history;

其中 rows between unbounded preceding and unbounded following 就是指定了窗口:所有的数据。
如果不指定的话,默认的窗口是 range between unbounded preceding and current row,也就是当前记录为止的所有记录。

这个默认窗口只是对有order by的数据才有效, 而max, count函数如果不指定order by, 那么他的对象就是所有的数据。这点在ORACLE的文档里并没有提及的。

2010年11月9日星期二

通过表移动来提高Oracle表的空间利用率

表经过多次的插入,更新,删除之后,会存在断片化的问题。表空间的使用率降低,而且影响性能。
可以用以下的方法来改善。

alter table tab1 move;
alter index tab1_ind1 rebuild;
alter index tab1_ind2 rebuild;

表的移动,内部动作是把表数据拷贝到临时表空间,复制处理结束后,切换掉旧的表空间,所以需要有空余的表空间才能支持这个操作。
索引重建是因为旧的ROWID发生变化,导致无效

2010年11月8日星期一

oracle v$session v$process

v$session 里面有关于进程process的信息,那个客户端的信息, 而v$process里面的spid是oracle服务进程的ID,不要搞混了。

v$session里面的process列里面有的时候显示 196:1148, 2段信息是客户端自己的序列号

这两个视图由以下相连接

v$session.paddr = v$process.addr

2010年11月4日星期四

/proc/cpuinfoの見方

# cat /proc/cpuinfo |egrep 'physical id|core' |sort

1个物理CPU,4个Core,单线程

core id         : 0
core id         : 1
core id         : 2
core id         : 3
cpu cores       : 4
cpu cores       : 4
cpu cores       : 4
cpu cores       : 4
physical id     : 0
physical id     : 0
physical id     : 0
physical id     : 0


2个物理CPU,2core,2线程

core id         : 0
core id         : 0
core id         : 1
core id         : 1
core id         : 2
core id         : 2
core id         : 3
core id         : 3
cpu cores       : 4
cpu cores       : 4
cpu cores       : 4
cpu cores       : 4
cpu cores       : 4
cpu cores       : 4
cpu cores       : 4
cpu cores       : 4
physical id     : 0
physical id     : 0
physical id     : 0
physical id     : 0
physical id     : 1
physical id     : 1
physical id     : 1
physical id     : 1