大记录集驱动hash join导致额外物理读

Monday, May 26th, 2008

以前对hash join时应该用大记录集做驱动表还是用小记录集做驱动表一直存在疑虑, 直到最近做了一个实验, 才真正体会到其间的差别.实验过程如下.
用大记录集做驱动的执行计划如下:

———————————————————————————————————————————————————
| Id  | Operation              |  Name                | Rows  | Bytes |TempSpc| Cost  |
———————————————————————————————————————————————————
|   0 | SELECT STATEMENT       |                      |     1 |    12 |       |  1784 |
|   1 |  SORT AGGREGATE        |                      |     1 |    12 |       |       |
|*  2 |   HASH JOIN            |                      |  1820K|    20M|    31M|  1784 |
|   3 |    INDEX [...]

记一次BT的数据订正

Monday, May 26th, 2008

最近业务部门提出一个需求, 数据库里有些字段中保存的信息里全角和半角字符参杂, 影响市容, 要求做数据订正, 全部统一.
其中英文/数字/英文标点符号 都统一用半角字符, 而日文字符都统一用全角字符. 而且提出订正的字段中还包含一些clob字段.
 
那就函数+游标, 慢慢订正吧, 分析了一下, 要写四个函数:
1. varchar2数据类型的, 全角英文变半角.
2. clob数据类型的, 全角英文变半角.
3. varchar2数据类型的, 半角日文变全角.
4. clob数据类型的, 半角日文变全角.
 
开工:
第一个, 还好, 有现成函数: to_single_byte.
TO_SINGLE_BYTE returns char with all of its multibyte characters converted to their corresponding single-byte characters. char can be of datatype CHAR, VARCHAR2, NCHAR, or NVARCHAR2. The value returned is in the same datatype as [...]

一条Mysql上的Sql优化经历

Saturday, May 24th, 2008

前段时间一位同事收到某开发部门一位同事求助,希望帮忙优化一条Mysql的sql语句,大体如下:
select n.id ,nc.content
from news n force index (category1_status,category2_status,category3_status),news_content nc
where n.id=nc.id
and n.status=2 and (n.category_id_1 in (5003107,5003108)
or n.category_id_2 in (5003107,5003108)
or n.category_id_3 in (5003107,5003108)
调试的时候发现怎么都不能走index_merge的执行计划(我们所期望的),后来临时给他们一个union的解决方案。后来下班吃完晚饭后一起找问题,发现即使只有单个表,也没办法走到index_merge的执行计划,不管是加提示还是不加提示,调试过程如下:
mysql> explain select n.id ,nc.content
-> from news n force index (category1_status,category2_status,category3_status),news_content nc
-> where n.id=nc.id
-> [...]

test 代码高亮

Friday, May 23rd, 2008

select * from test where id=1005;
declare
begin
for c in ( select * from test) loop
dbms_output.put_line(’test’);
end loop;
end;
/
function test(){  alert(’test javascript code’);}

用法是在要格式化的文本中前后分别加入<coolcode lang=”"> 和</coolcode>
只要你在输入了脚本后选中脚本区域,在编辑器的html输入模式中按c-code按钮会自动生成
lang支持的格式有:
cpp
CSS
diff
DTD
HTML
java
javascript
mysql
perl
PHP
python
ruby
SQL
XML

表空间管理

Monday, April 21st, 2008

上周有个测试告诉我,发生了这么一件事:
ORA-01653: unable to extend table ZEUS.ALI_ZEUS_ADVERTISE_PUBLISH_LOG by 8192 in tablespace ZEUSDATA
我当时上库上查了下,其实这个TBS上还有200多M剩余。想不通,为什么会这样。
现在回头想想,和我EXTENT的扩展方式是SYSTEM有关。
因为SYSTEM的话,很有可能这次是1M,下次是2M,下次是4M,下次是8M,2的N次方。
因此,我这个TBS很大了,几十G了。经过N次扩展了。下次扩展需要200M以上了,报了上面那个错误。
 现在新建的表空间,都采用uniform size了。
希望大家拍砖!!

V$UNDOSTAT

Thursday, April 17th, 2008

很多人一直很困惑,如何去设置UNDO Retention和UNDO TBS的大小,其实可以根据v$undostat来做判断。
特别是UNDO TBS的大小,很大一部分取决于DBA对系统的熟悉程度(虽然算UNDO的公式很多),见过很多人,为了防止出错,把UNDO TBS设置的其大,包括UNDO Retention。
今天看文档,文档上说:
UNDO最大可以设置为:undo maximum value is 2的32次方 seconds (more than 187 years).
这下可以放心了,尽管设吧!!

RAC安装之数据库创建

Saturday, April 12th, 2008

手工创建RAC数据库其实和普通数据库没有太大区别,需要注意几点:
1.需要为各个接点额外创建undo tablespace,redo group
2.需要为各个接点激活日志thread
3.create database的时候cluster_database参数设置为false,创建成功后在改为true,让各个接点mount
–创建数据库
SQL> CREATE DATABASE asmrac
  2     USER SYS IDENTIFIED BY a35baba
  3     USER SYSTEM IDENTIFIED BY a35baba
  4     controlfile reuse
  5     LOGFILE
  6     GROUP 1 (’+DATATOMB/redo_1_1_1.log’,’+DATATOMB/redo_1_2_1.log’) SIZE 512M REUSE,
  7     GROUP 2 (’+DATATOMB/redo_2_1_1.log’,’+DATATOMB/redo_2_2_1.log’) SIZE 512M REUSE,
  8     GROUP 3 (’+DATATOMB/redo_3_1_1.log’,’+DATATOMB/redo_3_2_1.log’) SIZE 512M REUSE,
  9     GROUP 4 (’+DATATOMB/redo_4_1_1.log’,’+DATATOMB/redo_4_2_1.log’) SIZE 512M REUSE
 10     MAXLOGFILES 64
 11     MAXLOGMEMBERS [...]

RAC安装之创建ASM

Saturday, April 12th, 2008

–编辑ASM的init.ora
myasm1.instance_number=1
myasm2.instance_number=2
myasm3.instance_number=3
myasm4.instance_number=4
myasm1.instance_name=myasm1
myasm2.instance_name=myasm2
myasm3.instance_name=myasm3
myasm4.instance_name=myasm4
instance_type=asm
cluster_database=true
asm_diskgroups=’datatomb’
asm_diskstring=’/opt/oracle/oradata/asmrac/disk*’
processes=200
large_pool_size=12M
remote_login_passwordfile=exclusive
core_dump_dest=/opt/oracle/admin/myasm/cdump
user_dump_dest=/opt/oracle/admin/myasm/udump
background_dump_dest=/opt/oracle/admin/myasm/bdump
export ORACLE_SID=myasm3
SQL> startup nomount;
ASM instance started
Total System Global Area  130023424 bytes
Fixed Size                  2019032 bytes
Variable Size             102838568 bytes
ASM Cache                  25165824 bytes
–ASM已经discover了指定的磁盘,状态为CANDIDATE
SQL> select header_status, path from v$asm_disk;
HEADER_ST PATH
——— ————————————————–
CANDIDATE    /opt/oracle/oradata/asmrac/disk2
CANDIDATE    /opt/oracle/oradata/asmrac/disk1
–创建磁盘组datatomb,不使用镜像
SQL> create diskgroup datatomb
  2  external redundancy disk
  3  ‘/opt/oracle/oradata/asmrac/disk1′,
  4  ‘/opt/oracle/oradata/asmrac/disk2′;
Diskgroup created.
–disk状态已经是member
SQL> select header_status, path from v$asm_disk;
HEADER_ST PATH
——— ————————————————–
MEMBER    /opt/oracle/oradata/asmrac/disk2
MEMBER    /opt/oracle/oradata/asmrac/disk1
–1T的空间
SQL> select TOTAL_MB,free_mb from v$asm_diskgroup;
  TOTAL_MB    [...]

DBA