Monthly Archives: September 2011

set unused然后drop和直接drop的性能对比

oracle网站上对set unsed使用的说明: SET UNUSED Clause Specify SET UNUSED to mark one or more columns as unused. Specifying this clause does not actually remove the target columns from each row in the table. That is, it does not restore the disk space used by these columns. Therefore, the response time is faster than when you execute [...]

[转]Bloom Filter概念和原理

原文地址: Bloom Filter概念和原理 bloom filter 原理介绍2 bloom filter 原理介绍3 Bloom Filter概念和原理 Bloom Filter是一种空间效率很高的随机数据结构,它利用位数组很简洁地表示一个集合,并能判断一个元素是否属于这个集合。Bloom Filter的这种高效是有一定代价的:在判断一个元素是否属于某个集合时,有可能会把不属于这个集合的元素误认为属于这个集合(false positive)。因此,Bloom Filter不适合那些“零错误”的应用场合。而在能容忍低错误率的应用场合下,Bloom Filter通过极少的错误换取了存储空间的极大节省。 集合表示和元素查询 下面我们具体来看Bloom Filter是如何用位数组表示集合的。初始状态时,Bloom Filter是一个包含m位的位数组,每一位都置为0。 为了表达S={x1, x2,…,xn}这样一个n个元素的集合,Bloom Filter使用k个相互独立的哈希函数(Hash Function),它们分别将集合中的每个元素映射到{1,…,m}的范围中。对任意一个元素x,第i个哈希函数映射的位置hi(x)就会被置为1(1≤i≤k)。注意,如果一个位置多次被置为1,那么只有第一次会起作用,后面几次将没有任何效果。在下图中,k=3,且有两个哈希函数选中同一个位置(从左边数第五位)。 在判断y是否属于这个集合时,我们对y应用k次哈希函数,如果所有hi(y)的位置都是1(1≤i≤k),那么我们就认为y是集合中的元素,否则就认为y不是集合中的元素。下图中y1就不是集合中的元素。y2或者属于这个集合,或者刚好是一个false positive。 错误率估计 前面我们已经提到了,Bloom Filter在判断一个元素是否属于它表示的集合时会有一定的错误率(false positive rate),下面我们就来估计错误率的大小。在估计之前为了简化模型,我们假设kn 其中1/m表示任意一个哈希函数选中这一位的概率(前提是哈希函数是完全随机的),(1-1/m)表示哈希一次没有选中这一位的概率。要把S完全映射到位数组中,需要做kn次哈希。某一位还是0意味着kn次哈希都没有选中它,因此这个概率就是(1-1/m)的kn次方。令p = e-kn/m是为了简化运算,这里用到了计算e时常用的近似: 令ρ为位数组中0的比例,则ρ的数学期望E(ρ)= p’。在ρ已知的情况下,要求的错误率(false positive rate)为: (1-ρ)为位数组中1的比例,(1-ρ)k就表示k次哈希都刚好选中1的区域,即false positive rate。上式中第二步近似在前面已经提到了,现在来看第一步近似。p’只是ρ的数学期望,在实际中ρ的值有可能偏离它的数学期望值。M. Mitzenmacher已经证明[2] ,位数组中0的比例非常集中地分布在它的数学期望值的附近。因此,第一步的近似得以成立。分别将p和p’代入上式中,得: 相比p’和f’,使用p和f通常在分析中更为方便。 最优的哈希函数个数 既然Bloom Filter要靠多个哈希函数将集合映射到位数组中,那么应该选择几个哈希函数才能使元素查询时的错误率降到最低呢?这里有两个互斥的理由:如果哈希函数的个数多,那么在对一个不属于集合的元素进行查询时得到0的概率就大;但另一方面,如果哈希函数的个数少,那么位数组中的0就多。为了得到最优的哈希函数个数,我们需要根据上一小节中的错误率公式进行计算。 先用p和f进行计算。注意到f = exp(k ln(1 − e−kn/m)),我们令g = [...]

SQLPLUS使用技巧总结2

忽略sql语句中的空白行 SET SQLBLANKLINES ON –默认情况下,空白行输入表示语句结束,当粘贴从其它地方复制过来的语句就不方便了。 SYS@orcl>set sqlblanklines on SYS@orcl>select * 2 from adam.persons 3 4 where id = 1; ID NAME ———- ——————– 1 adam.xing.new 注意上面的第三行是空行,但是还可以继续输入 不显示脚本中的替代变量输出 SET VERIFY OFF SYS@orcl>set verify on SYS@orcl>select * from adam.persons where id = &1; Enter value for 1: 1 old 1: select * from adam.persons where id = [...]

oracle的merge语句测试

Merge,顾名思义就是合并两个表的数据,其语法是: 下面是一个具体的例子: –准备数据,从new_persons表合并到persons表 ADAM@orcl>create table persons(id number, name varchar2(20)); Table created. ADAM@orcl>insert into persons values(1,’adam’); 1 row created. ADAM@orcl>insert into persons values(2,’jack’); 1 row created. ADAM@orcl>create table new_persons as select * from persons where 1= 0; Table created. ADAM@orcl>insert into new_persons values (1, ‘adam.xing’); 1 row created. ADAM@orcl>insert into new_persons values (3, ‘brouce’); 1 row [...]

测试oracle的hanganalyze功能

测试场景: sid 153, pid 19执行语句: update t set c = ‘a’ where n = 0; sid 149, pid 22执行语句: update t set c = ‘a’ where n = 0; 在sid 153的session提交前,sid 149将处于等待行级TX锁状态,trace文件分析结果中的红色字体部分也表现出了这一点 产生trace文件: SYS@orcl>oradebug setmypid Statement processed. SYS@orcl>oradebug unlimit; Statement processed. SYS@orcl>oradebug hanganalyze 3 Hang Analysis in /opt/ora10g/oracle/product/10.2.0/db_1/admin/orcl/udump/orcl_ora_8529.trc trace文件内容如下: oracle@adam-desktop:~$ more /opt/ora10g/oracle/product/10.2.0/db_1/admin/orcl/udump/orcl_ora_8529.trc /opt/ora10g/oracle/product/10.2.0/db_1/admin/orcl/udump/orcl_ora_8529.trc Oracle Database [...]

分析oracle的systemstate dump文件

dump systemstate产生的跟踪文件是从dump那一刻开始到dump任务完成之间一段事件内的系统内所有进程的信息。用来辅助分析系统很慢或HANG的原因。 产生systemsate dump的trace文件 方法1: 使用oradebug SYS@orcl>oradebug setmypid Statement processed. SYS@orcl>oradebug unlimit; Statement processed. SYS@orcl>oradebug dump systemstate 10 Statement processed. 注:如果无法正常登录,尝试使用sqlplus -prelim进行登录 方法2: linux使用gdb,当数据库hang住无法登录的时候使用,红色部分为在gdb中输入的命令 oracle@adam-desktop:~$ gdb $ORACLE_HOME/bin/oracle 8429 GNU gdb (GDB) 7.0-ubuntu Copyright (C) 2009 Free Software Foundation, Inc. License GPLv3+: GNU GPL version 3 or later This is free software: you are free to [...]

观察oracle进程占用内存

Background进程占用的内存: oracle@adam-desktop:/home/adam$ ps aux | head -1; ps aux | grep ora_ | grep -v grep USER       PID %CPU %MEM    VSZ   RSS TTY      STAT START   TIME COMMAND oracle    4315  0.0  0.7 508120 12684 ?        Ss   09:42   0:03 ora_pmon_orcl oracle    4317  0.0  0.6 507484 10880 ?        Ss   09:42   0:00 ora_psp0_orcl oracle    4319  0.0  1.2 507484 21908 [...]

oracle数组接口性能测试

测试场景和结果: 向没有索引的表中插入20万条数据 PL/SQL测试结果:插入20万条记录,花费时间500ms左右 Jdbc批量操作(每50条一个batch)测试结果:插入20万条记录,花费时间1200ms左右。 表结构如下: CREATE TABLE INSERT_TEST( F1 NUMBER, F2 VARCHAR2(10), F3 VARCHAR2(10), F4 VARCHAR2(10), F5 VARCHAR2(10), F6 NUMBER, F7 NUMBER, F8 NUMBER, F9 NUMBER, F10 NUMBER ) 测试环境: AMD Athlon(tm) II X2 240 Processor 2G内存 单块7200rpm SATA硬盘 Linux 2.6.31-14-generic i686 Oracle Database 10g Enterprise Edition Release 10.2.0.1.0 – Prod SYS@orcl>show parameter log_buffer NAME    [...]