??xml version="1.0" encoding="utf-8" standalone="yes"?>亚洲成av人片在线天堂无,亚洲综合久久综合激情久久,亚洲欧洲精品成人久久曰http://www.tkk7.com/Vencent/category/7760.html<font color='orange'>本博客仅为收集所用。在此对原作者表C感谢?lt;/font> <div class="custom"> <script type="text/javascript"><!-- google_ad_client = "pub-6256612161572960"; google_ad_width = 728; google_ad_height = 90; google_ad_format = "728x90_as"; google_ad_type = "text"; google_ad_channel =""; google_page_url = document.location; google_color_border = ["FFDDAA","FFDDAA","FFDDAA","FFDDAA"]; google_color_bg = ["FFDDAA","FFDDAA","FFDDAA","FFDDAA"]; google_color_link = ["FFDDAA","0033FF","00008B","99CC33"]; google_color_url = ["999999","0033FF","00008B","FFCC00"]; google_color_text = ["0033FF","AA9999","0033FF","AA9999"]; //--></script> <script type="text/javascript" src="http://pagead2.googlesyndication.com/pagead/show_ads.js"> </script></div>zh-cnFri, 02 Mar 2007 06:49:24 GMTFri, 02 Mar 2007 06:49:24 GMT60Oracle中按拼音排序http://www.tkk7.com/Vencent/articles/57576.htmlVincent ChenVincent ChenMon, 10 Jul 2006 16:00:00 GMThttp://www.tkk7.com/Vencent/articles/57576.htmlhttp://www.tkk7.com/Vencent/comments/57576.htmlhttp://www.tkk7.com/Vencent/articles/57576.html#Feedback0http://www.tkk7.com/Vencent/comments/commentRss/57576.htmlhttp://www.tkk7.com/Vencent/services/trackbacks/57576.html

Vincent Chen 2006-07-11 00:00 发表评论
]]>
Mysql 集群介和配置http://www.tkk7.com/Vencent/articles/55644.htmlVincent ChenVincent ChenWed, 28 Jun 2006 15:45:00 GMThttp://www.tkk7.com/Vencent/articles/55644.htmlhttp://www.tkk7.com/Vencent/comments/55644.htmlhttp://www.tkk7.com/Vencent/articles/55644.html#Feedback0http://www.tkk7.com/Vencent/comments/commentRss/55644.htmlhttp://www.tkk7.com/Vencent/services/trackbacks/55644.html 1Q?span style="font-family: 'Times New Roman'; font-style: normal; font-variant: normal; font-weight: normal; font-size: 7pt; line-height: normal; font-size-adjust: none; font-stretch: normal;">  先了解一下你是否应该?/span> mysql 集群?/span>

减少数据中心l点压力和大数据量处理,采用?/span> mysql 分布Q一个或多个 application 对应一?/span> mysql 数据库。把几个 mysql 数据库公用的数据做出׃n数据Q例如购物RQ用户对象等{,存在数据l点里面。其他不׃n的数据还l持在各自分布的 mysql 数据库本w中?/span>

 

MySQL Cluster Components

 

 

2Q?span style="font-family: 'Times New Roman'; font-style: normal; font-variant: normal; font-weight: normal; font-size: 7pt; line-height: normal; font-size-adjust: none; font-stretch: normal;">  集群 Mysql 中名U概?/span> .( 如上?/span> )

1 Q?/span> Sql l点Q?/span> SQL node-- 上图对应?/span> mysqld Q?/span> : 分布式数据库。包括自w数据和查询中心l点数据 .

2 Q数据结?/span> (Data node -- ndbd): 集群׃n数据 ( 内存?/span> ).

3 Q管理服务器 (Management Server ?ndb_mgmd): 集群理 SQL node,Data node.

 

3 Q配|?/span>

       mysql-max 版本Q当然现?/span> mysql 集群pȝ windonws q_上面不被支持 .

       安装 mysql ׃多说了,|上一打堆Q简明扼要?/span>

       A:192.168.1.251 ?Data node ?/span> Management Server.

       B:192.168.1.254 ?SQL node.

当然Q你也可以让一个机器同时ؓ(f) 3 者?/span>

A,B my.inf 加上Q?/span>

      

[MYSQLD]                       

ndbcluster                      # run NDB engine

ndb-connectstring=192.168.1.251  # location of MGM node

 

# Options for ndbd process:

[MYSQL_CLUSTER]                

ndb-connectstring=192.168.1.251  # location of MGM node

 

A: /var/lib/mysql-cluster/config.ini

[NDBD DEFAULT]   

NoOfReplicas=1    # Number of replicas

DataMemory=80M    # How much memory to allocate for data storage

IndexMemory=18M   # How much memory to allocate for index storage

                  # For DataMemory and IndexMemory, we have used the

                  # default values. Since the "world" database takes up

                  # only about 500KB, this should be more than enough for

                  # this example Cluster setup.

# TCP/IP options:

[TCP DEFAULT]    

portnumber=2202   # This the default; however, you can use any

                  # port that is free for all the hosts in cluster

                  # Note: It is recommended beginning with MySQL 5.0 that

                  # you do not specify the portnumber at all and simply allow

                  # the default value to be used instead

# Management process options:

[NDB_MGMD]                     

hostname=192.168.1.251           # Hostname or IP address of MGM node

datadir=/var/lib/mysql-cluster  # Directory for MGM node logfiles

# Options for data node "A":

[NDBD]                          

                                # (one [NDBD] section per data node)

hostname=192.168.1.251           # Hostname or IP address

datadir=/usr/local/mysql/data   # Directory for this data node's datafiles

# SQL node options:

[MYSQLD]

hostname=192.168.1.254

#[MYSQLD] # q个相当?/span> 192.168.1.251

 

 

4.       启动试

 

·         在管理服务器上面(q里?code>192.168.1.251):

				
						
·               


shell> ndb_mgmd -f /var/lib/mysql-cluster/config.ini

 

·         在数据结Ҏ(gu)务器上面(依然?code>192.168.1.251 and more):

				
						
·               


shell> ndbd --initial (

W一ơ时?--initial 参数)






 

·         SQL l点服务器上?span lang="EN">(192.168.1.254):

				
						
·               


shell> mysqld &

 

?/span> 251 上面察看

 

./ndb_mgm

-- NDB Cluster -- Management Client --

ndb_mgm> show

Connected to Management Server at: 192.168.1.251:1186

Cluster Configuration

---------------------

[ndbd(NDB)]     1 node(s)

id=2    @192.168.1.251  (Version: 5.0.22, Nodegroup: 0, Master)

 

[ndb_mgmd(MGM)] 1 node(s)

id=1    @192.168.1.251  (Version: 5.0.22)

 

[mysqld(API)]   1 node(s)

id=3    @192.168.1.254  (Version: 5.0.22)

 

ok

关闭集群Q?/span>

shell> ndb_mgm -e shutdown

 

 

5 Q基本的集群说明

1 Q在mysql 集群?span lang="EN">.?span lang="EN">table引擎?span lang="EN">NDBCLUSTER时才做集,其他?span lang="EN">NDBCLUSTER表和一?span lang="EN">mysql数据库表一P不会(x)׃n数据. NDBCLUSTER 表数据存储在Data node服务?b>内存?/b>Q?span lang="EN">Data Node可以?span lang="EN">1台或多台服务器,它们之间存放׃n数据?span lang="EN">Data Node服务器可以分l数?span lang="EN">copy?span lang="EN">

例如Q?span lang="EN">2,3,4,5 为四?span lang="EN">Data Node服务?span lang="EN">ID. 2,3为组0?span lang="EN">  4Q?span lang="EN">5为组1?span lang="EN">  2Q?span lang="EN">3l持数据相同Q?span lang="EN"> 4Q?span lang="EN">5l持数据相同?l?span lang="EN">0和组1l持数据不同?span lang="EN">

    2 Q?span lang="EN"> sql node 服务器中Q非NDBCLUSTER数据存在本n数据库中Q?span lang="EN">table引擎?span lang="EN">NDBCLUSTERӞ数据存储?span lang="EN">Data Node 中。当查询NDBCLUSTER表时Q它?x)?span lang="EN">Data node集群中提h?span lang="EN">.

    3)Manager server

    SQl node ?span lang="EN">Data node 状态?span lang="EN">

 

 

6 深入了解

http://dev.mysql.com/doc/refman/5.0/en/ndbcluster.html

Vincent Chen 2006-06-28 23:45 发表评论
]]>
Oracle理?qing)常用基脚本http://www.tkk7.com/Vencent/articles/44204.htmlVincent ChenVincent ChenSun, 30 Apr 2006 07:28:00 GMThttp://www.tkk7.com/Vencent/articles/44204.htmlhttp://www.tkk7.com/Vencent/comments/44204.htmlhttp://www.tkk7.com/Vencent/articles/44204.html#Feedback0http://www.tkk7.com/Vencent/comments/commentRss/44204.htmlhttp://www.tkk7.com/Vencent/services/trackbacks/44204.html阅读全文

Vincent Chen 2006-04-30 15:28 发表评论
]]>
Oracle database link http://www.tkk7.com/Vencent/articles/43150.htmlVincent ChenVincent ChenTue, 25 Apr 2006 15:27:00 GMThttp://www.tkk7.com/Vencent/articles/43150.htmlhttp://www.tkk7.com/Vencent/comments/43150.htmlhttp://www.tkk7.com/Vencent/articles/43150.html#Feedback0http://www.tkk7.com/Vencent/comments/commentRss/43150.htmlhttp://www.tkk7.com/Vencent/services/trackbacks/43150.htmltnsnames.ora下徏一条记?br />
链接字符串的讄

?      ?/strong>

tobeijing=(description=database link名称Qtobeijing
(address=(protocol=tcp)采用tcp/ip协议
(host=www.bj.col.com.cn)Ʋ链接主机名U或IP地址
(port=1521))|络端口1521
(connect_data=(sid=oracle7)))安装ORACLE采用的sid

1.Create DB Link:
CREATE [PUBLIC] DATABASE LINK <link_name>
CONNECT TO <user_name>
IDENTIFIED BY <password>
USING '<service_name>';//q里?font face="System" size="3">tobeijing

2.Drop DB Link:
DROP [PUBLIC] DATABASE LINK <link_name>;
3.Query DB Link:
SELECT db_link, owner, host, username
FROM dba_db_links
ORDER BY db_link;
4.Use DB Link for SELECT:
SELECT * FROM <schema_name>.<table_name>@<link_name>;

Vincent Chen 2006-04-25 23:27 发表评论
]]>
Oracle内存分配http://www.tkk7.com/Vencent/articles/41000.htmlVincent ChenVincent ChenThu, 13 Apr 2006 15:56:00 GMThttp://www.tkk7.com/Vencent/articles/41000.htmlhttp://www.tkk7.com/Vencent/comments/41000.htmlhttp://www.tkk7.com/Vencent/articles/41000.html#Feedback0http://www.tkk7.com/Vencent/comments/commentRss/41000.htmlhttp://www.tkk7.com/Vencent/services/trackbacks/41000.htmldb_name = orcl
db_files = 1020
control_files = ("C:\orant\database\ctl1orcl.ora", "C:\orant\database\ctl2orcl.ora")
db_file_multiblock_read_count = 16
db_block_buffers = 1000
shared_pool_size = 40000000
log_checkpoint_interval = 8000
processes = 100
dml_locks = 200
log_buffer = 32768
sequence_cache_entries = 30
sequence_cache_hash_buckets = 23
#audit_trail = true
#timed_statistics = true
background_dump_dest = C:\orant\rdbms80\trace
user_dump_dest = C:\orant\rdbms80\trace
db_block_size =8192
compatible = 8.0.5.0.0
sort_area_size = 65536
log_checkpoint_timeout = 0
remote_login_passwordfile = shared
max_dump_file_size = 10240


调整q两就行了:
db_block_buffers = 1000
shared_pool_size = 40000000


上个月听q一下,g是这L(fng)Q?br />׃n池是shared_pool_size/1024/1024=100M
数据池好象是 db_block_size*db_block_buffers*1024*1024=200MQdb_block_size是徏库时指定的,好象不能改,只有改db_block_buffers了)(j)?br />



ORACLE SGA 的分?br />ORACLE 8.0.X 版本
SGA=((db_block_buffers * block size)+(shared_pool_size+large_pool_size+log_buffers)+1MB
ORACLE 8.1.X 版本
SGA=((db_block_buffers * block size)+(shared_pool_size+large_pool_size+java_pool_size+log_buffers)+1MB
理论上SGA可占OSpȝ物理内存?/2—?/3Q我们可以根据需求调?br />我推荐SGA=0.45*(OS RAM)
假设服务器运行ORACLE 8.1.X 版本, OSpȝ内存?G MEM, db_block_size ?192 bytes,
除了q行ORACLE数据库外, 没有其它的应用程序或服务器Y?
q样SGA合计Uؓ(f)921M ( 0.45*2048M ),
设shared_pool_size 250M (250*1024*1024 bytes)
设database buffer cache 620M (79360*8192 bytes)
initorasid.ora文g里具体各参数如下:
shared_pool_size = 262144000
# 250 M
db_block_buffers = 79360
# 620 M
log_buffer = 524288
# 512k (128K*CPU个数)
large_pool_size = 31457280
# 30 M
java_pool_size = 20971520
# 20 M
sort_area_size = 524288
# 512k (65k--2M)
sort_area_retained_size = 524288
# MTS ?sort_area_retained_size = sort_area_size
SUN Solaris?etc/system文g里的几个参数同样跟内存分配有?br />ORACLE安装时缺省的讄: 修改的设|?
set shmsys:shminfo_shmmax=4294967295
set shmsys:shminfo_shmmin=1
set shmsys:shminfo_shmmni=100
set shmsys:shminfo_shmseg=15
set semsys:seminfo_semmns=200
set semsys:seminfo_semmni=70
set ulimit=3000000
set semsys:seminfo_semmni=315
set semsys:seminfo_semmsl=300
set semsys:seminfo_semmns=630
set semsys:seminfo_semopm=315
set semsys:seminfo_semvmx=32767
set shmsys:shminfo_shmmax=4294967295
set shmsys:shminfo_shmmni=315
set shmsys:shminfo_shmseg=10
set shmsys:shminfo_shmmin=1
其中q些参数的含?br />shmmax - ׃n内存D,讑֤点, 辑ֈ最大SGA
shmmin - 最的׃n内存D?
shmmni - ׃n内存标志W的数量.
shmseg - 一个进E可分配的最大内存段?
shmall - 最大可允许的内存数Q比SGAq要?
semmns - 信号灯,跟ORACLE的PROCESS数有?
semmsl - 一个信L(fng)中最大的信号灯数.


db_block_buffers * block size : shared_pool_size = 2.5:1

Vincent Chen 2006-04-13 23:56 发表评论
]]>
Solaris10 x86 u1 下安?Oracle 10g Release 2http://www.tkk7.com/Vencent/articles/39121.htmlVincent ChenVincent ChenTue, 04 Apr 2006 04:35:00 GMThttp://www.tkk7.com/Vencent/articles/39121.htmlhttp://www.tkk7.com/Vencent/comments/39121.htmlhttp://www.tkk7.com/Vencent/articles/39121.html#Feedback0http://www.tkk7.com/Vencent/comments/commentRss/39121.htmlhttp://www.tkk7.com/Vencent/services/trackbacks/39121.htmlSolaris10 x86 u1 下安?Oracle 10g Release 2

关键?br />
Solaris、Oracle

操作环境

Dell 2850
Solaris 10 x86 u1
Oracle 10g Release 2
Bash shell

l合知识

Solaris 10 x86 u1?x)在Dell 2850下以64位模式运行?br />Oracle 10g Release 2是64位架?br />
参考资?br />安装文g10201_database_solx86_64.zip内的帮助文档
http://www.dbspecialists.com/presentations/oracle10gsolaris.html
http://download-west.oracle.com/docs/html/B13972_01/toc.htm

下蝲文g
http://www.oracle.com/technology/software/products/database/oracle10g/index.html
注册后点?br />Oracle Database 10g Release 2 (10.2.0.1.0) for Solaris Operating System (x86-64)
下蝲
10201_database_solx86_64.zip

(g)查系l环?br />
保pȝ可以q行囑Ş界面或可以远E运行图形界面,在此使用的远E桌面是X Manager 2.0
打开XBrowserQ输入服务器的IP地址卛_q上?br />
查看pȝ版本Q要?.10 64-bitQ?br />? uname -a
SunOS javasvr 5.10 Generic_118844-26 i86pc i386 i86pc
? isainfo -kv
64-bit amd64 kernel modules

查看物理内存Q要?12MB以上Q按具体情况Q?br />? /usr/sbin/prtconf | grep "Memory size"
Memory size: 2048 Megabytes

查看交换文gQ要?G以上Q?br />? /usr/sbin/swap -l
swapfile             dev  swaplo blocks   free
/dev/dsk/c0t0d0s1   55,65      8 4192952 4192952

临时文gI间Q要?00M以上Q?br />? df -h /tmp
Filesystem             size   used  avail capacity  Mounted on
swap                   3.1G     8K   3.1G     1%    /tmp

q里的物理内存ؓ(f)2GQ理Z?G*1.5=3G合适,q里再添?12MB

创徏一?12MB的交换文Ӟ(x)
# mkfile 512M /export/home/swapone

d刚创建的交换文gQ?br /># swap -a /export/home/swapone

(g)查一下:(x)
# swap -l
swapfile             dev  swaplo blocks   free
/dev/dsk/c0d0s1     102,1       8 1056376 1056376
/export/home/swapone  -        8 1048568 1048568

下面讄交换文g在重启后自动加蝲使用Q?br /># vi /etc/vfstab
/export/home/swapone    -       -       swap    -       no      -

查看盘I间Q要?.7G以上Q?br /> df -h
Filesystem             size   used  avail capacity  Mounted on
/dev/dsk/c0t0d0s0       29G   3.1G    25G    12%    /
......
swap                   3.1G   636K   3.1G     1%    /etc/svc/volatile
......
/dev/dsk/c0t0d0s7       27G   6.3G    20G    24%    /export/home

查看以下软g包是否存?br />? pkginfo -i SUNWarc SUNWbtool SUNWhea SUNWlibm  SUNWlibms SUNWsprot SUNWtoo SUNWi1of  SUNWi1cs SUNWi15cs SUNWxwfnt
system      SUNWarc   Lint Libraries (usr)
system      SUNWbtool CCS tools bundled with SunOS
system      SUNWhea   SunOS Header Files
system      SUNWi1of  ISO-8859-1 (Latin-1) Optional Fonts
system      SUNWlibm  Math & Microtasking Library Headers & Lint Files (Usr)
system      SUNWlibms Math & Microtasking Libraries (Usr)
system      SUNWsprot Solaris Bundled tools
system      SUNWtoo   Programming Tools
system      SUNWxwfnt X Window System platform required fonts
ERROR: information for "SUNWi1cs" was not found
ERROR: information for "SUNWi15cs" was not found

q里需要安装两个包QSUNWi1cs和SUNWi15cs

q里从下载的安装镜像文g安装

加蝲存放镜像文g分区
? mkdir /mnt/storage
? mount -F pcfs /dev/dsk/c0t0d0p4:1 /mnt/storage

以块讑֤加蝲镜像文g
? lofiadm -a /mnt/storage/solaris10/sol-10-u1-ga-x86-dvd.iso
/dev/lofi/1
? mount -F hsfs -o ro /dev/lofi/1 /mnt/isoimg

安装q两个包
? pkgadd -d /mnt/isoimg/Solaris_10/Product SUNWi1cs
? pkgadd -d /mnt/isoimg/Solaris_10/Product SUNWi15cs

卸蝲加蝲的文?br />? umount /mnt/isoimg/
? lofiadm -d /dev/lofi/1
? umount /mnt/storage/

׃使用的Solaris 10 u1比较斎ͼ׃打补丁了?br />

创徏用户和组

需要创Z个组oinstall和dbaQ两个用户oracle和nobody

先查看是否已存在
? grep oinstall /etc/group
? grep dba /etc/group
? id -a oracle
? id -a nobody
uid=60001(nobody) gid=60001(nobody) groups=60001(nobody)

创徏l?br />? groupadd oinstall
? groupadd dba

创徏用户
? useradd -g oinstall -G dba -d /export/home/oracle -s /usr/bin/bash -c 'Oracle software owner' -m oracle
? id -a oracle
uid=107(oracle) gid=104(oinstall) groups=105(dba)

讄密码
? passwd oracle
***

创徏所需目录

需要创Z个目录oracle和oradataQ一个用来存储程序文Ӟ一个用来存储数据文?br />
查看盘I间
? df -kh

创徏目录oracleQ需?G以上Q?br />? mkdir -p /opt/oracle
? chown -R oracle:oinstall /opt/oracle
? chmod -R 775 /opt/oracle

创徏目录oradataQ需?.2G以上Q?br />? mkdir -p /export/home/oradata
? chown -R oracle:oinstall /export/home/oradata
? chmod -R 775 /export/home/oradata

调整内核参数

备䆾配置文g
? cp /etc/system /etc/system.orig

修改配置文gQ添加如下几?br />? vi /etc/system
* for install oracle 10g
set noexec_user_stack=1
set semsys:seminfo_semmni=100
set semsys:seminfo_semmns=1024
set semsys:seminfo_semmsl=256
set semsys:seminfo_semvmx=32767
set shmsys:shminfo_shmmax=4294967295
set shmsys:shminfo_shmmin=1
set shmsys:shminfo_shmmni=100
set shmsys:shminfo_shmseg=10

重启pȝ
? reboot

准备安装文g

解压安装文gQ?br />? unzip 10201_database_solx86_64.zip
得到文g夹database

配置环境参数

用oracled
? su - oracle

讄环境参数
? vi .profile
umask 022
ORACLE_BASE=/opt/oracle
ORACLE_SID=cdtdb
export ORACLE_BASE ORACLE_SID

重新d查看
-bash-3.00$ umask
0022
? env | more
-bash-3.00$ env | more
......
ORACLE_SID=cdtdb
ORACLE_BASE=/opt/oracle
......

开始安装过E?br />
用Xmanagerd到服务器
用oracle用户

q行database目录下的runInstaller

Select Installation Method
  Advanced Installation

Specify Inventory directory and credentials
  /opt/oracle/oraInventory
  oinstall

Select Installation Type
  Enterprise Edition

Sepcify Home Details
  Name: OraDb10g_home1
  Path: /opt/oracle/oracle/product/10.2.0/db_1

Product-Specific Prerequisite Checks
  全部通过卛_Q?br />
Select Configuration Option
  Create a database

Select Database Configuration
  General Purpose

Specify Database Configuration Options
Global Database Name:cdtdb    SID:cdtdb
Select Database Character set: Simplified Chinese ZHS16GBK
选中Create database with sample schemas

Select Database Management Option
选中Use Database Control for Database Management
    Enable Email Notification
        61.144.43.235
        chenliqun@pyp.edu.cn

Specify Database Storage Option
选中File System
    location:/export/home/oradata

Specify Backup and Recovery Options
选中Do not enable Automated backups

Specify Database Schema Passwords
l一使用一个密码:(x)***

Summary

Execute Configuration Scripts
按照提示Q用root用户q行脚本

安装完成Q?br />
安装日志Q?br />/opt/oracle/oracle/product/10.2.0/db_1/cfgtoollogs/dbca/cdtdb

iSQL*Plus URL:
http://192.168.200.11:5560/isqlplus

iSQL*Plus DBA URL:
http://192.168.200.11:5560/isqlplus/dba

Enterprise Manager 10g Database Control URL:
http://192.168.200.11:1158/em
用sys用户以sysdbaw䆾d

完成服务配置

用oracled
? su - oracle

修改配置文g
? vi .profile
stty istrip
PS1='# '
umask 022
MAIL=/usr/mail/${LOGNAME:?}
PATH=/usr/bin:/usr/sbin:/usr/sadm/bin:/usr/sfw/bin:/usr/local/bin:/usr/ucb:/etc:.
ORACLE_SID=cdtdb
ORAENV_ASK=NO
ORACLE_BASE=/opt/oracle
export PS1 PATH ORACLE_BASE ORACLE_SID ORAENV_ASK
. oraenv

正确配置数据库实例入?br />? vi /var/opt/oracle/oratab
cdtdb:/opt/oracle/oracle/product/10.2.0/db_1:Y

创徏自动q行脚本
? vi /etc/init.d/oracle
#!/bin/sh
ORA_HOME=/opt/oracle/oracle/product/10.2.0/db_1
ORA_OWNER=oracle
if [ ! -f $ORA_HOME/bin/dbstart ]
then
  echo "Oracle startup: cannot start"
  exit
fi
case "$1" in
   'start') # Start the Oracle databases and listeners
            su - $ORA_OWNER -c "$ORA_HOME/bin/dbstart"
            su - $ORA_OWNER -c "$ORA_HOME/bin/lsnrctl start"
            su - $ORA_OWNER -c "$ORA_HOME/bin/emctl start dbconsole"
            su - $ORA_OWNER -c "$ORA_HOME/bin/isqlplusctl start"
            ;;
   'stop')  # Stop the Oracle databases and listeners
            su - $ORA_OWNER -c "$ORA_HOME/bin/isqlplusctl stop"
            su - $ORA_OWNER -c "$ORA_HOME/bin/emctl stop dbconsole"
            su - $ORA_OWNER -c "$ORA_HOME/bin/lsnrctl stop"
            su - $ORA_OWNER -c "$ORA_HOME/bin/dbshut"
            ;;
esac

建立W号q接
? ln -s /etc/init.d/oracle /etc/rc2.d/S99oracle
? ln -s /etc/init.d/oracle /etc/rc0.d/K10oracle


其它配置和错误排?br />
解决em和isqlplus中文按钮q问题
# cd $ORACLE_HOME/jre/1.4.2/lib
# cp font.properties font.properties.orig
# cp font.properties.zh_CN_UTF8 font.properties

# cd $ORACLE_HOME/jdk/jre/lib/
# cp font.properties font.properties.orig
# cp font.properties.zh_CN_UTF8 font.properties

清除~存的文?br /># cd $ORACLE_HOME/oc4j/j2ee/oc4j_applications/applications/em/em/cabo/images/cache/zhs
# rm *.*

# cd $ORACLE_HOME/oc4j/j2ee/oc4j_applications/applications/isqlplus/isqlplus/cabo/images/cache/zhs
# rm *.*

排除tnslsnr启动错误Q?br />错误信息QFailed to auto-start Oracle Net Listene using /ade/vikrkuma_new/oracle/bin/tnslsnr
q里的Listene应该是Listener吧!

# vi $ORACLE_HOME/bin/dbstart
?ORACLE_HOME_LISTNER=/ade/vikrkuma_new/oracle
改ؓ(f) ORACLE_HOME_LISTNER=$ORACLE_HOME

可见Q这是由于Oracel工程师手误引P非常不应该!

启动Oracle时启动Apache出错

查看错误提示
# vi /var/adm/messages
Mar 30 08:31:50 javasvr svc.startd[7]: [ID 652011 daemon.warning] svc:/network/http:apache2: Method "/
lib/svc/method/http-apache2 start" failed with exit status 1.

? svcs -a | grep apache2
maintenance    Mar_31   svc:/network/http:apache2
上面说明apache2没有正常q行

应该是Oracle安装Ӟ惛_动Apache2Q但Apache2作ؓ(f)SMF服务Q不允许外部E序单独启用?br />
如果不需要Apache2服务Q关闭它
? svcadm disable http:apache2

如果需要,启用它
? svcadm disable http:apache2
? svcadm enable http:apache2

注意Qem和isqlplus使用的是oc4j服务器?/font>

Vincent Chen 2006-04-04 12:35 发表评论
]]>
SQL优化http://www.tkk7.com/Vencent/articles/36601.htmlVincent ChenVincent ChenTue, 21 Mar 2006 04:40:00 GMThttp://www.tkk7.com/Vencent/articles/36601.htmlhttp://www.tkk7.com/Vencent/comments/36601.htmlhttp://www.tkk7.com/Vencent/articles/36601.html#Feedback0http://www.tkk7.com/Vencent/comments/commentRss/36601.htmlhttp://www.tkk7.com/Vencent/services/trackbacks/36601.html 首先先了解一个SQL语句的执行过E分3? 语法分析(parase)与编?执行,取数?
1Q?在语法分析与~译?oracle 使用哈希函数为SQL语句在库~存中分配一个SQL?
首先(g)查语句是否存?若在,则查询数据库字典、检查必ȝ权限?br />若无Q需要语法分析与~译。所以SQL语句存在与内存中Q将减少分析Q编译时间?br />SQL语句的分析与~译占整个语句运行过E的60%的时_(d)SQL优化的目标就是减分析与~译的时_(d)׃n代码?

查询SQL语句分析与编译的旉Q?br />select * from v$sysstat
where name in ('parse time cpu','parse time elapsed','parse count (hard)')

一个SQL语句的响应时?elapsed time )应该是服务时?{待旉.
服务旉= CPU执行旉.
{待旉 可以从v$system_event
select total_waits, total_timeouts, time_waited, average_wait ,event
from v$system_event
where event='latch free'
所以解析一个SQL语句的^均等待时间是"{待旉/parse count" q个值接q?
通过数据字典v$sqlare,可以查询到频J被分析与编译的SQL语句.应该减少SQL语句的分析与~译的次?

2: 常用的实体ȝ内存.
Z减少分析与编译时?可以常用的的实体如: 存储q程,包等,可能驻留在内存区域.
 1)预留内存I间. sql> show parameter shared_pool_reserved_size
       2)频J用的实体ȝ在内存中. 在用DBMS_SHARED_POOLE序包前,必须首先q行pȝ提供的程序包: dbmspool.sql 和prvtpool.plb
 在加载这两个E序包后,自动生成所需的包.
      加蝲: sql> @/u01/app/oracle/product/8.17/rdbms/admin/dbmspool.sql
           sql> @/u01/app/oracle/product/8.17/rdbms/admin/prvtpool.sql
      包DBMS_SHARED_POOL包含以下存储q程.
      dbms_shared_pool.keep 用于实体保存内? dbms_shared_pool.keep(object in varchar2,[type in char default p]);
                             object 表示参数? type 表示被驻留内存的实体cd;P 表示存储q程,C表示光标,R表示触发?默认P
       
      dbms_shared_pool.unkeep 用于取消被设|进入内存的实体. dbms_shared_pool.unkeep(object in varchar2,[type in char default p]);
                             object 表示参数? type 表示被驻留内存的实体cd;P 表示存储q程,C表示光标,R表示触发?默认P
     
      dbms_shared_pool.size(minsize in number)

      select name ,type ,source_size+code_size+parsed_size+error_size "total bytes"
      from dba_object_size
      where owner='SCOTT'

3: 创徏索引.
   select index_name,table_owner, table_name, tablespace_name from all_indexes
  
   select user_indexes.TABLE_NAME, user_indexes.INDEX_NAME,uniqueness, column_name
   from user_ind_columns ,user_indexes
   where user_ind_columns.INDEX_NAME=user_indexes.INDEX_NAME
   and user_ind_columns.TABLE_NAME=user_indexes.TABLE_NAME
   order by user_indexes.TABLE_TYPE,user_indexes.TABLE_NAME,user_indexes.INDEX_NAME,user_ind_columns.COLUMN_POSITION

4: 创徏聚簇(cluster): 是一l存储在一L(fng)有共同列或经怸起用的?被聚的两个表只有一个数据段.聚簇表在存储?在物理层子表合q到父表?q样少了表的连接时?

5: 创徏哈希索引.
 
6: SQL优化? Z成本的优化器CBO(cose_based)和基于规则RBO(rule_based)
   sql> show parameter OPTIMIZER_MODE
   可以修改参数文g: initSID.ora,增加: optimizer_Mode={CHOOSE| RULE| FIRST_ROWS|ALL_ROWS}
  all_rows , first_rows(n)Z成本; rule Z规则,chooseZ规则、成本?br />  /*+ ordered*/
  /*+ rule */
  /*+ first_rows(50) */

  /*+ordered star*/
  写发Q?
  alter system flush shared_pool;
select /*+ rule */ aa from visit



Vincent Chen 2006-03-21 12:40 发表评论
]]>
手工创徏数据?/title><link>http://www.tkk7.com/Vencent/articles/35129.html</link><dc:creator>Vincent Chen</dc:creator><author>Vincent Chen</author><pubDate>Mon, 13 Mar 2006 13:01:00 GMT</pubDate><guid>http://www.tkk7.com/Vencent/articles/35129.html</guid><wfw:comment>http://www.tkk7.com/Vencent/comments/35129.html</wfw:comment><comments>http://www.tkk7.com/Vencent/articles/35129.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.tkk7.com/Vencent/comments/commentRss/35129.html</wfw:commentRss><trackback:ping>http://www.tkk7.com/Vencent/services/trackbacks/35129.html</trackback:ping><description><![CDATA[<font face="verdana, arial, helvetica" size="2"><span id="eagmkee" class="javascript" id="text1817591">W一ơ创建数据库是用的DBCAQ中间发生了错误。后来看?机械工业Couchman的书)才知道,<br> 创徏新数据库Ӟ必须原来的数据库shutdownQ否则会(x)出现错误。然后进SQLPLUSQ一直提C?br> ORA12560Q监听报错?br> 试了半天Q又用DBCA把所有的数据库都删掉了,q是用DBCA重新创徏了一个数据库Q这ơ没?br> 出现问题。觉得很奇怪。查了一下资料,可能是在上次创徏的时候INIT.ORA文g破坏了?br> <br> 在网上找C一?I的手动配|过E,呵呵Q真是如莯宝啊?br> <br> l合我自q情况把经验和大家׃nQ请大家l提提意见?br> <br> pȝ环境Q? <br> 1、操作系l:(x)Windows 2003 Server<br> 2、数据库Q Oracle9I Release 9.2.0.1.0 <br> 3、安装\径:(x)D:\ORACLE <br> <br> 建库步骤Q? <br> 1、手工创建相关目?<br> D:\Oracle\admin\test <br> D:\Oracle\admin\test\adhoc <br> D:\Oracle\admin\test\bdump <br> D:\Oracle\admin\test\cdump <br> D:\Oracle\admin\test\create <br> D:\Oracle\admin\test\exp <br> D:\Oracle\admin\test\pfile <br> D:\Oracle\admin\test\udump <br> <br> D:\Oracle\oradata\test <br> D:\Oracle\oradata\test\archive <br> <br> ------------------------------------<br> q几步比较简单,很快完成了。觉得手动创建数据库对理解结构还是很有帮助的?br> <br> <br> <br> <br> 2、手工创建初始化启动参数文gQD:\Oracle\admin\test\pfile\inittest.oraQ内容:(x) <br> -------------------------------------<br> db_name = "test"<br> instance_name = test<br> service_names = test<br> db_files = 1024<br> control_files = ("D:\Oracle\oradata\test\control01.ctl", <br> <br> "D:\Oracle\oradata\test\control02.ctl", "D:\Oracle\oradata\test\control03.ctl")<br> open_cursors = 200<br> max_enabled_roles = 30<br> db_file_multiblock_read_count = 8<br> db_block_buffers = 4096<br> shared_pool_size = 52428800<br> large_pool_size = 78643200<br> java_pool_size = 20971520<br> log_checkpoint_interval = 10000<br> log_checkpoint_timeout = 1800<br> processes = 115<br> parallel_max_servers = 5<br> log_buffer = 32768<br> max_dump_file_size = 10240<br> global_names = true<br> oracle_trace_collection_name = ""<br> background_dump_dest = D:\Oracle\admin\test\bdump<br> user_dump_dest = D:\Oracle\admin\test\udump<br> db_block_size = 16384<br> remote_login_passwordfile = exclusive<br> os_authent_prefix = ""<br> job_queue_processes = 4<br> job_queue_interval = 60<br> open_links = 4<br> <br> # log_archive_start = true<br> # log_archive_dest_1 = "location=D:\Oracle\oradata\oradb\archive"<br> # log_archive_format = %%ORACLE_SID%%T%TS%S.ARC <br> <br> ------------------------------------------<br> 奇怪的是,我当时创ZI的init.ora,最后竟然也能成功创建,<br> 是不是因为OMF的原因?<br> <br> <br> <br> 3、手工创建D:\Oracle\Ora92\DATABASE\inittest.ora文gQ?<br> <br> 内容QIFILE='D:\Oracle\admin\test\pfile\inittest.ora' <br> <br> <br> <br> 4、用orapwd.exe命o(h)Q创建D:\Oracle\Ora92\DATABASE\PWDtest.ora <br> <br> 命o(h)QD:\Oracle\Ora92\bin\orapwd file=D:\Oracle\Ora81\DATABASE\PWDtest.ora <br> <br> password=ORACLE entries=5 <br> <br> 5、通过oradim.exe命o(h)Q在服务里生成一个新的实例管理服务,启动方式为手?<br> set ORACLE_SID=test (q个很重要,否则出现ORA-12560错误)<br> D:\Oracle\Ora92\bin\oradim -new -sid test -startmode manual -pfile <br> <br> "D:\Oracle\admin\test\pfile\inittest.ora" <br> <br> 6、生成各U数据库对象 <br> D:\>Oracle\Ora92\bin\sqlplus<br> <br> Connect:SYS as SYSDBA<br> Password:Orace <br> <br> --创徏数据?<br> <br> startup nomount pfile="D:\Oracle\admin\test\pfile\inittest.ora" <br> CREATE DATABASE test <br> LOGFILE 'D:\Oracle\oradata\test\redo01.log' SIZE 2048K, <br> 'D:\Oracle\oradata\test\redo02.log' SIZE 2048K, <br> 'D:\Oracle\oradata\test\redo03.log' SIZE 2048K <br> MAXLOGFILES 32 <br> MAXLOGMEMBERS 2 <br> MAXLOGHISTORY 1 <br> DATAFILE 'D:\Oracle\oradata\test\system01.dbf' SIZE 58M REUSE AUTOEXTEND ON NEXT 640K <br> MAXDATAFILES 254 <br> MAXINSTANCES 1 <br> CHARACTER SET ZHS16GBK <br> NATIONAL CHARACTER SET ZHS16GBK; <br> <br> 控制文g、日志文件在上面语句执行时生?<br> <br> <br> 以下是网上资料中ORACEL 8I中Init.ora的其他部分,我因为是做实验,所以省略了<br> ***********************************************************************<br> <br> <br> connect INTERNAL/oracle <br> --修改pȝ表空?<br> ALTER TABLESPACE SYSTEM DEFAULT STORAGE ( INITIAL 64K NEXT 64K MINEXTENTS 1 MAXEXTENTS <br> <br> UNLIMITED PCTINCREASE 50); <br> ALTER TABLESPACE SYSTEM MINIMUM EXTENT 64K; <br> <br> --创徏回滚表空?<br> CREATE TABLESPACE RBS DATAFILE 'D:\Oracle\oradata\test\rbs01.dbf' SIZE 256M REUSE <br> AUTOEXTEND ON NEXT 5120K <br> MINIMUM EXTENT 512K <br> DEFAULT STORAGE ( INITIAL 512K NEXT 512K MINEXTENTS 8 MAXEXTENTS 4096); <br> <br> --创徏用户表空?<br> CREATE TABLESPACE USERS DATAFILE 'D:\Oracle\oradata\test\users01.dbf' SIZE 128M REUSE <br> AUTOEXTEND ON NEXT 1280K <br> MINIMUM EXTENT 128K <br> DEFAULT STORAGE ( INITIAL 128K NEXT 128K MINEXTENTS 1 MAXEXTENTS 4096 PCTINCREASE 0); <br> <br> --创徏临时表空?<br> CREATE TABLESPACE TEMP DATAFILE 'D:\Oracle\oradata\test\temp01.dbf' SIZE 32M REUSE <br> AUTOEXTEND ON NEXT 640K <br> MINIMUM EXTENT 64K <br> DEFAULT STORAGE ( INITIAL 64K NEXT 64K MINEXTENTS 1 MAXEXTENTS UNLIMITED PCTINCREASE 0) <br> <br> TEMPORARY; <br> <br> --创徏工具表空?<br> CREATE TABLESPACE TOOLS DATAFILE 'D:\Oracle\oradata\test\tools01.dbf' SIZE 64M REUSE <br> AUTOEXTEND ON NEXT 320K <br> MINIMUM EXTENT 32K <br> DEFAULT STORAGE ( INITIAL 32K NEXT 32K MINEXTENTS 1 MAXEXTENTS 4096 PCTINCREASE 0); <br> <br> --创徏索引表空?<br> CREATE TABLESPACE INDX DATAFILE 'D:\Oracle\oradata\test\indx01.dbf' SIZE 32M REUSE <br> AUTOEXTEND ON NEXT 1280K <br> MINIMUM EXTENT 128K <br> DEFAULT STORAGE ( INITIAL 128K NEXT 128K MINEXTENTS 1 MAXEXTENTS 4096 PCTINCREASE 0); <br> <br> --创徏回滚D?<br> CREATE PUBLIC ROLLBACK SEGMENT RBS0 TABLESPACE RBS STORAGE ( OPTIMAL 4096K ); <br> CREATE PUBLIC ROLLBACK SEGMENT RBS1 TABLESPACE RBS STORAGE ( OPTIMAL 4096K ); <br> CREATE PUBLIC ROLLBACK SEGMENT RBS2 TABLESPACE RBS STORAGE ( OPTIMAL 4096K ); <br> CREATE PUBLIC ROLLBACK SEGMENT RBS3 TABLESPACE RBS STORAGE ( OPTIMAL 4096K ); <br> CREATE PUBLIC ROLLBACK SEGMENT RBS4 TABLESPACE RBS STORAGE ( OPTIMAL 4096K ); <br> CREATE PUBLIC ROLLBACK SEGMENT RBS5 TABLESPACE RBS STORAGE ( OPTIMAL 4096K ); <br> CREATE PUBLIC ROLLBACK SEGMENT RBS6 TABLESPACE RBS STORAGE ( OPTIMAL 4096K ); <br> CREATE PUBLIC ROLLBACK SEGMENT RBS7 TABLESPACE RBS STORAGE ( OPTIMAL 4096K ); <br> CREATE PUBLIC ROLLBACK SEGMENT RBS8 TABLESPACE RBS STORAGE ( OPTIMAL 4096K ); <br> CREATE PUBLIC ROLLBACK SEGMENT RBS9 TABLESPACE RBS STORAGE ( OPTIMAL 4096K ); <br> CREATE PUBLIC ROLLBACK SEGMENT RBS10 TABLESPACE RBS STORAGE ( OPTIMAL 4096K ); <br> CREATE PUBLIC ROLLBACK SEGMENT RBS11 TABLESPACE RBS STORAGE ( OPTIMAL 4096K ); <br> CREATE PUBLIC ROLLBACK SEGMENT RBS12 TABLESPACE RBS STORAGE ( OPTIMAL 4096K ); <br> CREATE PUBLIC ROLLBACK SEGMENT RBS13 TABLESPACE RBS STORAGE ( OPTIMAL 4096K ); <br> CREATE PUBLIC ROLLBACK SEGMENT RBS14 TABLESPACE RBS STORAGE ( OPTIMAL 4096K ); <br> CREATE PUBLIC ROLLBACK SEGMENT RBS15 TABLESPACE RBS STORAGE ( OPTIMAL 4096K ); <br> CREATE PUBLIC ROLLBACK SEGMENT RBS16 TABLESPACE RBS STORAGE ( OPTIMAL 4096K ); <br> CREATE PUBLIC ROLLBACK SEGMENT RBS17 TABLESPACE RBS STORAGE ( OPTIMAL 4096K ); <br> CREATE PUBLIC ROLLBACK SEGMENT RBS18 TABLESPACE RBS STORAGE ( OPTIMAL 4096K ); <br> CREATE PUBLIC ROLLBACK SEGMENT RBS19 TABLESPACE RBS STORAGE ( OPTIMAL 4096K ); <br> CREATE PUBLIC ROLLBACK SEGMENT RBS20 TABLESPACE RBS STORAGE ( OPTIMAL 4096K ); <br> CREATE PUBLIC ROLLBACK SEGMENT RBS21 TABLESPACE RBS STORAGE ( OPTIMAL 4096K ); <br> CREATE PUBLIC ROLLBACK SEGMENT RBS22 TABLESPACE RBS STORAGE ( OPTIMAL 4096K ); <br> CREATE PUBLIC ROLLBACK SEGMENT RBS23 TABLESPACE RBS STORAGE ( OPTIMAL 4096K ); <br> CREATE PUBLIC ROLLBACK SEGMENT RBS24 TABLESPACE RBS STORAGE ( OPTIMAL 4096K ); <br> <br> --使回滚段在线 <br> ALTER ROLLBACK SEGMENT "RBS0" ONLINE; <br> ALTER ROLLBACK SEGMENT "RBS1" ONLINE; <br> ALTER ROLLBACK SEGMENT "RBS2" ONLINE; <br> ALTER ROLLBACK SEGMENT "RBS3" ONLINE; <br> ALTER ROLLBACK SEGMENT "RBS4" ONLINE; <br> ALTER ROLLBACK SEGMENT "RBS5" ONLINE; <br> ALTER ROLLBACK SEGMENT "RBS6" ONLINE; <br> ALTER ROLLBACK SEGMENT "RBS7" ONLINE; <br> ALTER ROLLBACK SEGMENT "RBS8" ONLINE; <br> ALTER ROLLBACK SEGMENT "RBS9" ONLINE; <br> ALTER ROLLBACK SEGMENT "RBS10" ONLINE; <br> ALTER ROLLBACK SEGMENT "RBS11" ONLINE; <br> ALTER ROLLBACK SEGMENT "RBS12" ONLINE; <br> ALTER ROLLBACK SEGMENT "RBS13" ONLINE; <br> ALTER ROLLBACK SEGMENT "RBS14" ONLINE; <br> ALTER ROLLBACK SEGMENT "RBS15" ONLINE; <br> ALTER ROLLBACK SEGMENT "RBS16" ONLINE; <br> ALTER ROLLBACK SEGMENT "RBS17" ONLINE; <br> ALTER ROLLBACK SEGMENT "RBS18" ONLINE; <br> ALTER ROLLBACK SEGMENT "RBS19" ONLINE; <br> ALTER ROLLBACK SEGMENT "RBS20" ONLINE; <br> ALTER ROLLBACK SEGMENT "RBS21" ONLINE; <br> ALTER ROLLBACK SEGMENT "RBS22" ONLINE; <br> ALTER ROLLBACK SEGMENT "RBS23" ONLINE; <br> ALTER ROLLBACK SEGMENT "RBS24" ONLINE; <br> <br> --修改sys用户的(f)时表I间为TEMP <br> alter user sys temporary tablespace TEMP; <br> <br> --创徏数据字典?<br> @D:\Oracle\Ora81\Rdbms\admin\catalog.sql; <br> @D:\Oracle\Ora81\Rdbms\admin\catexp7.sql <br> @D:\Oracle\Ora81\Rdbms\admin\catproc.sql <br> @D:\Oracle\Ora81\Rdbms\admin\caths.sql <br> <br> connect system/manager <br> @D:\Oracle\Ora81\sqlplus\admin\pupbld.sql <br> <br> connect internal/oracle <br> @D:\Oracle\Ora81\Rdbms\admin\catrep.sql <br> exit <br> <br> --生成SQL*Plus帮助pȝ <br> sqlplus SYSTEM/manager <br> @D:\Oracle\Ora81\sqlplus\admin\help\helpbld.sql helpus.sql <br> exit <br> <br> --修改system用户默认表空间和临时表空?<br> svrmgrl <br> connect internal/oracle <br> alter user system default tablespace TOOLS; <br> alter user system temporary tablespace TEMP; <br> exit <br> ************************************************************** <br> 7、将test实例启动服务讄成自动启动方?<br> <br> D:\Oracle\Ora81\bin\oradim -edit -sid test -startmode auto<br> 看看服务里多了一OracleServerTest.<br> <br> <br> l于能看到Database Created,对于我这U初学者,q是很开心的一件事情?br> 然后到OEM里看看自己新建的数据库,同时在SQLPLUS创徏了一个用P在OEM看到了,呵呵?br> 证明实是我刚才创徏的数据库?br> <br> q个时候问题又出现了,在OEM里,我试着用SQLPLUS worksheetQ?br> connect sys as sysdba<br> <br> Enter password: ERROR:<br> ORA-12560: TNS<img src="http://www.itpub.net/images/smilies/13.gif" alt="吐舌" border="0">rotocol adapter error<br> <br> q是怎么回事呢?刚才用的DOS下的SQLPLUS没有养I我在DOS下试着q接Q很好啊Q?br> 那问题出在哪里呢Q于是把DOSH口重新开了一ơ,再连SQLPLUSQ?br> 呵呵Q出C和W(xu)orksheet一L(fng)错误?br> <br> 接着Q又(g)查了inittest.ora,没有扑ֈ什么?br> 反复的startup mount,start nomount pfile="..inittest.ora"<br> shutdown normal,q是出现q个ORA-12560<br> <br> 既然是监听出现问题,是不是与SID有关呢?<br> 问题出在set ORACLE_SID=test.<br> 在DOS下,先SET ORACLE_SID,然后在SQLPLUS里面CONNECTQ?br> 呵呵QSQLPLUS一切正怺。但是在OEM里还是用不了SQLPLUS worksheet,q是Z么?<br><br></span></font><font face="verdana, arial, helvetica" size="2"><span id="omycwka" class="javascript" id="text2014512">步骤一Q其实是不用手动创徏的,在oracle\ora92\admin\sample目录下有模版Q直接考过来,initsmp.ora改名卛_?/span></font><br><img src ="http://www.tkk7.com/Vencent/aggbug/35129.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.tkk7.com/Vencent/" target="_blank">Vincent Chen</a> 2006-03-13 21:01 <a href="http://www.tkk7.com/Vencent/articles/35129.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title> oracle常用命o(h)(我的W记)http://www.tkk7.com/Vencent/articles/35130.htmlVincent ChenVincent ChenMon, 13 Mar 2006 13:01:00 GMThttp://www.tkk7.com/Vencent/articles/35130.htmlhttp://www.tkk7.com/Vencent/comments/35130.htmlhttp://www.tkk7.com/Vencent/articles/35130.html#Feedback0http://www.tkk7.com/Vencent/comments/commentRss/35130.htmlhttp://www.tkk7.com/Vencent/services/trackbacks/35130.htmloracle里常用命令第一章:(x)日志理

1.forcing log switches
sql> alter system switch logfile;
2.forcing checkpoints
sql> alter system checkpoint;
3.adding online redo log groups
sql> alter database add logfile [group 4]
sql> ('/disk3/log4a.rdo','/disk4/log4b.rdo') size 1m;
4.adding online redo log members
sql> alter database add logfile member
sql> '/disk3/log1b.rdo' to group 1,
sql> '/disk4/log2b.rdo' to group 2;
5.changes the name of the online redo logfile
sql> alter database rename file 'c:/oracle/oradata/oradb/redo01.log'
sql> to 'c:/oracle/oradata/redo01.log';
6.drop online redo log groups
sql> alter database drop logfile group 3;
7.drop online redo log members
sql> alter database drop logfile member 'c:/oracle/oradata/redo01.log';
8.clearing online redo log files
sql> alter database clear [unarchived] logfile 'c:/oracle/log2a.rdo';
9.using logminer analyzing redo logfiles
a. in the init.ora specify utl_file_dir = ' '
b. sql> execute dbms_logmnr_d.build('oradb.ora','c:\oracle\oradb\log');
c. sql> execute dbms_logmnr_add_logfile('c:\oracle\oradata\oradb\redo01.log',
sql> dbms_logmnr.new);
d. sql> execute dbms_logmnr.add_logfile('c:\oracle\oradata\oradb\redo02.log',
sql> dbms_logmnr.addfile);
e. sql> execute dbms_logmnr.start_logmnr(dictfilename=>'c:\oracle\oradb\log\oradb.ora');
f. sql> select * from v$logmnr_contents(v$logmnr_dictionary,v$logmnr_parameters
sql> v$logmnr_logs);
g. sql> execute dbms_logmnr.end_logmnr;

W二章:(x)表空间管?
1.create tablespaces
sql> create tablespace tablespace_name datafile 'c:\oracle\oradata\file1.dbf' size 100m,
sql> 'c:\oracle\oradata\file2.dbf' size 100m minimum extent 550k [logging/nologging]
sql> default storage (initial 500k next 500k maxextents 500 pctinccease 0)
sql> [online/offline] [permanent/temporary] [extent_management_clause]
2.locally managed tablespace
sql> create tablespace user_data datafile 'c:\oracle\oradata\user_data01.dbf'
sql> size 500m extent management local uniform size 10m;
3.temporary tablespace
sql> create temporary tablespace temp tempfile 'c:\oracle\oradata\temp01.dbf'
sql> size 500m extent management local uniform size 10m;
4.change the storage setting
sql> alter tablespace app_data minimum extent 2m;
sql> alter tablespace app_data default storage(initial 2m next 2m maxextents 999);
5.taking tablespace offline or online
sql> alter tablespace app_data offline;
sql> alter tablespace app_data online;
6.read_only tablespace
sql> alter tablespace app_data read only|write;
7.droping tablespace
sql> drop tablespace app_data including contents;
8.enableing automatic extension of data files
sql> alter tablespace app_data add datafile 'c:\oracle\oradata\app_data01.dbf' size 200m
sql> autoextend on next 10m maxsize 500m;
9.change the size fo data files manually
sql> alter database datafile 'c:\oracle\oradata\app_data.dbf' resize 200m;
10.Moving data files: alter tablespace
sql> alter tablespace app_data rename datafile 'c:\oracle\oradata\app_data.dbf'
sql> to 'c:\oracle\app_data.dbf';
11.moving data files:alter database
sql> alter database rename file 'c:\oracle\oradata\app_data.dbf'
sql> to 'c:\oracle\app_data.dbf';

W三章:(x)?

1.create a table
sql> create table table_name (column datatype,column datatype]....)
sql> tablespace tablespace_name [pctfree integer] [pctused integer]
sql> [initrans integer] [maxtrans integer]
sql> storage(initial 200k next 200k pctincrease 0 maxextents 50)
sql> [logging|nologging] [cache|nocache]
2.copy an existing table
sql> create table table_name [logging|nologging] as subquery
3.create temporary table
sql> create global temporary table xay_temp as select * from xay;
on commit preserve rows/on commit delete rows
4.pctfree = (average row size - initial row size) *100 /average row size
pctused = 100-pctfree- (average row size*100/available data space)
5.change storage and block utilization parameter
sql> alter table table_name pctfree=30 pctused=50 storage(next 500k
sql> minextents 2 maxextents 100);
6.manually allocating extents
sql> alter table table_name allocate extent(size 500k datafile 'c:/oracle/data.dbf');
7.move tablespace
sql> alter table employee move tablespace users;
8.deallocate of unused space
sql> alter table table_name deallocate unused [keep integer]
9.truncate a table
sql> truncate table table_name;
10.drop a table
sql> drop table table_name [cascade constraints];
11.drop a column
sql> alter table table_name drop column comments cascade constraints checkpoint 1000;
alter table table_name drop columns continue;
12.mark a column as unused
sql> alter table table_name set unused column comments cascade constraints;
alter table table_name drop unused columns checkpoint 1000;
alter table orders drop columns continue checkpoint 1000
data_dictionary : dba_unused_col_tabs

W四章:(x)索引

1.creating function-based indexes
sql> create index summit.item_quantity on summit.item(quantity-quantity_shipped);
2.create a B-tree index
sql> create [unique] index index_name on table_name(column,.. asc/desc) tablespace
sql> tablespace_name [pctfree integer] [initrans integer] [maxtrans integer]
sql> [logging | nologging] [nosort] storage(initial 200k next 200k pctincrease 0
sql> maxextents 50);
3.pctfree(index)=(maximum number of rows-initial number of rows)*100/maximum number of rows
4.creating reverse key indexes
sql> create unique index xay_id on xay(a) reverse pctfree 30 storage(initial 200k
sql> next 200k pctincrease 0 maxextents 50) tablespace indx;
5.create bitmap index
sql> create bitmap index xay_id on xay(a) pctfree 30 storage( initial 200k next 200k
sql> pctincrease 0 maxextents 50) tablespace indx;
6.change storage parameter of index
sql> alter index xay_id storage (next 400k maxextents 100);
7.allocating index space
sql> alter index xay_id allocate extent(size 200k datafile 'c:/oracle/index.dbf');
8.alter index xay_id deallocate unused;

W五章:(x)U束

1.define constraints as immediate or deferred
sql> alter session set constraint[s] = immediate/deferred/default;
set constraint[s] constraint_name/all immediate/deferred;
2. sql> drop table table_name cascade constraints
sql> drop tablespace tablespace_name including contents cascade constraints
3. define constraints while create a table
sql> create table xay(id number(7) constraint xay_id primary key deferrable
sql> using index storage(initial 100k next 100k) tablespace indx);
primary key/unique/references table(column)/check
4.enable constraints
sql> alter table xay enable novalidate constraint xay_id;
5.enable constraints
sql> alter table xay enable validate constraint xay_id;

W六章:(x)LOAD数据

1.loading data using direct_load insert
sql> insert /*+append */ into emp nologging
sql> select * from emp_old;
2.parallel direct-load insert
sql> alter session enable parallel dml;
sql> insert /*+parallel(emp,2) */ into emp nologging
sql> select * from emp_old;
3.using sql*loader
sql> sqlldr scott/tiger \
sql> control = ulcase6.ctl \
sql> log = ulcase6.log direct=true

W七章:(x)reorganizing data

1.using expoty
$exp scott/tiger tables(dept,emp) file=c:\emp.dmp log=exp.log compress=n direct=y
2.using import
$imp scott/tiger tables(dept,emp) file=emp.dmp log=imp.log ignore=y
3.transporting a tablespace
sql>alter tablespace sales_ts read only;
$exp sys/.. file=xay.dmp transport_tablespace=y tablespace=sales_ts
triggers=n constraints=n
$copy datafile
$imp sys/.. file=xay.dmp transport_tablespace=y datafiles=(/disk1/sles01.dbf,/disk2
/sles02.dbf)
sql> alter tablespace sales_ts read write;
4.checking transport set
sql> DBMS_tts.transport_set_check(ts_list =>'sales_ts' ..,incl_constraints=>true);
在表transport_set_violations 中查?
sql> dbms_tts.isselfcontained 为true 是, 表示自包?

W八章:(x) managing password security and resources

1.controlling account lock and password
sql> alter user juncky identified by oracle account unlock;
2.user_provided password function
sql> function_name(userid in varchar2(30),password in varchar2(30),
old_password in varchar2(30)) return boolean
3.create a profile : password setting
sql> create profile grace_5 limit failed_login_attempts 3
sql> password_lock_time unlimited password_life_time 30
sql>password_reuse_time 30 password_verify_function verify_function
sql> password_grace_time 5;
4.altering a profile
sql> alter profile default failed_login_attempts 3
sql> password_life_time 60 password_grace_time 10;
5.drop a profile
sql> drop profile grace_5 [cascade];
6.create a profile : resource limit
sql> create profile developer_prof limit sessions_per_user 2
sql> cpu_per_session 10000 idle_time 60 connect_time 480;
7. view => resource_cost : alter resource cost
dba_Users,dba_profiles
8. enable resource limits
sql> alter system set resource_limit=true;

W九(ji)章:(x)Managing users

1.create a user: database authentication
sql> create user juncky identified by oracle default tablespace users
sql> temporary tablespace temp quota 10m on data password expire
sql> [account lock|unlock] [profile profilename|default];
2.change user quota on tablespace
sql> alter user juncky quota 0 on users;
3.drop a user
sql> drop user juncky [cascade];
4. monitor user
view: dba_users , dba_ts_quotas

W十章:(x)managing privileges

1.system privileges: view => system_privilege_map ,dba_sys_privs,session_privs
2.grant system privilege
sql> grant create session,create table to managers;
sql> grant create session to scott with admin option;
with admin option can grant or revoke privilege from any user or role;
3.sysdba and sysoper privileges:
sysoper: startup,shutdown,alter database open|mount,alter database backup controlfile,
alter tablespace begin/end backup,recover database
alter database archivelog,restricted session
sysdba: sysoper privileges with admin option,create database,recover database until
4.password file members: view:=> v$pwfile_users
5.O7_dictionary_accessibility =true restriction access to view or tables in other schema
6.revoke system privilege
sql> revoke create table from karen;
sql> revoke create session from scott;
7.grant object privilege
sql> grant execute on dbms_pipe to public;
sql> grant update(first_name,salary) on employee to karen with grant option;
8.display object privilege : view => dba_tab_privs, dba_col_privs
9.revoke object privilege
sql> revoke execute on dbms_pipe from scott [cascade constraints];
10.audit record view :=> sys.aud$
11. protecting the audit trail
sql> audit delete on sys.aud$ by access;
12.statement auditing
sql> audit user;
13.privilege auditing
sql> audit select any table by summit by access;
14.schema object auditing
sql> audit lock on summit.employee by access whenever successful;
15.view audit option : view=> all_def_audit_opts,dba_stmt_audit_opts,dba_priv_audit_opts,dba_obj_audit_opts
16.view audit result: view=> dba_audit_trail,dba_audit_exists,dba_audit_object,dba_audit_session,dba_audit_statement

W十一章:(x) manager role

1.create roles
sql> create role sales_clerk;
sql> create role hr_clerk identified by bonus;
sql> create role hr_manager identified externally;
2.modify role
sql> alter role sales_clerk identified by commission;
sql> alter role hr_clerk identified externally;
sql> alter role hr_manager not identified;
3.assigning roles
sql> grant sales_clerk to scott;
sql> grant hr_clerk to hr_manager;
sql> grant hr_manager to scott with admin option;
4.establish default role
sql> alter user scott default role hr_clerk,sales_clerk;
sql> alter user scott default role all;
sql> alter user scott default role all except hr_clerk;
sql> alter user scott default role none;
5.enable and disable roles
sql> set role hr_clerk;
sql> set role sales_clerk identified by commission;
sql> set role all except sales_clerk;
sql> set role none;
6.remove role from user
sql> revoke sales_clerk from scott;
sql> revoke hr_manager from public;
7.remove role
sql> drop role hr_manager;
8.display role information
view: =>dba_roles,dba_role_privs,role_role_privs,dba_sys_privs,role_sys_privs,role_tab_privs,session_roles

W十二章: BACKUP and RECOVERY

1. v$sga,v$instance,v$process,v$bgprocess,v$database,v$datafile,v$sgastat
2. Rman need set dbwr_IO_slaves or backup_tape_IO_slaves and large_pool_size
3. Monitoring Parallel Rollback
> v$fast_start_servers , v$fast_start_transactions
4.perform a closed database backup (noarchivelog)
> shutdown immediate
> cp files /backup/
> startup
5.restore to a different location
> connect system/manager as sysdba
> startup mount
> alter database rename file '/disk1/../user.dbf' to '/disk2/../user.dbf';
> alter database open;
6.recover syntax
--recover a mounted database
>recover database;
>recover datafile '/disk1/data/df2.dbf';
>alter database recover database;
--recover an opened database
>recover tablespace user_data;
>recover datafile 2;
>alter database recover datafile 2;
7.how to apply redo log files automatically
>set autorecovery on
>recover automatic datafile 4;
8.complete recovery:
--method 1(mounted databae)
>copy c:\backup\user.dbf c:\oradata\user.dbf
>startup mount
>recover datafile 'c:\oradata\user.dbf;
>alter database open;
--method 2(opened database,initially opened,not system or rollback datafile)
>copy c:\backup\user.dbf c:\oradata\user.dbf (alter tablespace offline)
>recover datafile 'c:\oradata\user.dbf' or
>recover tablespace user_data;
>alter database datafile 'c:\oradata\user.dbf' online or
>alter tablespace user_data online;
--method 3(opened database,initially closed not system or rollback datafile)
>startup mount
>alter database datafile 'c:\oradata\user.dbf' offline;
>alter database open
>copy c:\backup\user.dbf d:\oradata\user.dbf
>alter database rename file 'c:\oradata\user.dbf' to 'd:\oradata\user.dbf'
>recover datafile 'e:\oradata\user.dbf' or recover tablespace user_data;
>alter tablespace user_data online;
--method 4(loss of data file with no backup and have all archive log)
>alter tablespace user_data offline immediate;
>alter database create datafile 'd:\oradata\user.dbf' as 'c:\oradata\user.dbf''
>recover tablespace user_data;
>alter tablespace user_data online
5.perform an open database backup
> alter tablespace user_data begin backup;
> copy files /backup/
> alter database datafile '/c:/../data.dbf' end backup;
> alter system switch logfile;
6.backup a control file
> alter database backup controlfile to 'control1.bkp';
> alter database backup controlfile to trace;
7.recovery (noarchivelog mode)
> shutdown abort
> cp files
> startup
8.recovery of file in backup mode
>alter database datafile 2 end backup;
9.clearing redo log file
>alter database clear unarchived logfile group 1;
>alter database clear unarchived logfile group 1 unrecoverable datafile;
10.redo log recovery
>alter database add logfile group 3 'c:\oradata\redo03.log' size 1000k;
>alter database drop logfile group 1;
>alter database open;
or >cp c:\oradata\redo02.log' c:\oradata\redo01.log
>alter database clear logfile 'c:\oradata\log01.log';


Vincent Chen 2006-03-13 21:01 发表评论
]]>
持久对象原生数据库查询语aQ中文版Q——预?/title><link>http://www.tkk7.com/Vencent/articles/32615.html</link><dc:creator>Vincent Chen</dc:creator><author>Vincent Chen</author><pubDate>Mon, 27 Feb 2006 04:32:00 GMT</pubDate><guid>http://www.tkk7.com/Vencent/articles/32615.html</guid><wfw:comment>http://www.tkk7.com/Vencent/comments/32615.html</wfw:comment><comments>http://www.tkk7.com/Vencent/articles/32615.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.tkk7.com/Vencent/comments/commentRss/32615.html</wfw:commentRss><trackback:ping>http://www.tkk7.com/Vencent/services/trackbacks/32615.html</trackback:ping><description><![CDATA[     摘要: 持久对象原生数据库查询语a 设计白皮?      William R. Cook                       &...  <a href='http://www.tkk7.com/Vencent/articles/32615.html'>阅读全文</a><img src ="http://www.tkk7.com/Vencent/aggbug/32615.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.tkk7.com/Vencent/" target="_blank">Vincent Chen</a> 2006-02-27 12:32 <a href="http://www.tkk7.com/Vencent/articles/32615.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>ORACLE SQL性能优化pd (十三)http://www.tkk7.com/Vencent/articles/32454.htmlVincent ChenVincent ChenSat, 25 Feb 2006 14:34:00 GMThttp://www.tkk7.com/Vencent/articles/32454.htmlhttp://www.tkk7.com/Vencent/comments/32454.htmlhttp://www.tkk7.com/Vencent/articles/32454.html#Feedback0http://www.tkk7.com/Vencent/comments/commentRss/32454.htmlhttp://www.tkk7.com/Vencent/services/trackbacks/32454.html
ORACLE SQL性能优化pd (十三)

作? black_snail

 

关键?ORACLE PERFORMANCE TUNING PL/SQL

出处 http://www.dbasupport.com



43. 用WHERE替代ORDER BY

ORDER BY 子句只在两种严格的条件下使用索引.


ORDER BY中所有的列必d含在相同的烦(ch)引中q保持在索引中的排列序.

ORDER BY中所有的列必d义ؓ(f)非空.


WHERE子句使用的烦(ch)引和ORDER BY子句中所使用的烦(ch)引不能ƈ?


例如:

表DEPT包含以下?

DEPT_CODE PK NOT NULL

DEPT_DESC NOT NULL

DEPT_TYPE NULL


非唯一性的索引(DEPT_TYPE)


低效: (索引不被使用)

SELECT DEPT_CODE

FROM DEPT

ORDER BY DEPT_TYPE


EXPLAIN PLAN:

SORT ORDER BY

TABLE ACCESS FULL


高效: (使用索引)


SELECT DEPT_CODE

FROM DEPT

WHERE DEPT_TYPE > 0


EXPLAIN PLAN:

TABLE ACCESS BY ROWID ON EMP

INDEX RANGE SCAN ON DEPT_IDX

译者按:

ORDER BY 也能使用索引! q的是个容易被忽视的知识点. 我们来验证一?

SQL> select * from emp order by empno;

Execution Plan

----------------------------------------------------------

0 SELECT STATEMENT Optimizer=CHOOSE

1 0 TABLE ACCESS (BY INDEX ROWID) OF 'EMP'

2 1 INDEX (FULL SCAN) OF 'EMPNO' (UNIQUE)



44. 避免改变索引列的cd.

当比较不同数据类型的数据? ORACLE自动对列q行单的cd转换.


假设 EMPNO是一个数值类型的索引?


SELECT ?

FROM EMP

WHERE EMPNO = ?23'


实际?l过ORACLEcd转换, 语句转化?

SELECT ?

FROM EMP

WHERE EMPNO = TO_NUMBER(?23')


q运的是,cd转换没有发生在烦(ch)引列?索引的用途没有被改变.


现在,假设EMP_TYPE是一个字W类型的索引?

SELECT ?

FROM EMP

WHERE EMP_TYPE = 123


q个语句被ORACLE转换?

SELECT ?

FROM EMP

WHERE TO_NUMBER(EMP_TYPE)=123


因ؓ(f)内部发生的类型{? q个索引不?x)被用?

译者按:

Z避免ORACLE对你的SQLq行隐式的类型{? 最好把cd转换用显式表现出? 注意当字W和数值比较时, ORACLE?x)优先{换数值类型到字符cd.



45. 需要当心的WHERE子句

某些SELECT 语句中的WHERE子句不用烦(ch)? q里有一些例?

在下面的例子? ?=' 不使用索引. C, 索引只能告诉你什么存在于表中, 而不能告诉你什么不存在于表?

不用烦(ch)?

SELECT ACCOUNT_NAME

FROM TRANSACTION

WHERE AMOUNT !=0;

使用索引:

SELECT ACCOUNT_NAME

FROM TRANSACTION

WHERE AMOUNT >0;


下面的例子中, ‘||'是字W连接函? p其他函数那样, 停用了烦(ch)?

不用烦(ch)?

SELECT ACCOUNT_NAME,AMOUNT

FROM TRANSACTION

WHERE ACCOUNT_NAME||ACCOUNT_TYPE='AMEXA';

使用索引:

SELECT ACCOUNT_NAME,AMOUNT

FROM TRANSACTION

WHERE ACCOUNT_NAME = ‘AMEX'

AND ACCOUNT_TYPE=' A';


下面的例子中, ?'是数学函? p其他数学函数那样, 停用了烦(ch)?

不用烦(ch)?

SELECT ACCOUNT_NAME, AMOUNT

FROM TRANSACTION

WHERE AMOUNT + 3000 >5000;

使用索引:

SELECT ACCOUNT_NAME, AMOUNT

FROM TRANSACTION

WHERE AMOUNT > 2000 ;

下面的例子中,相同的烦(ch)引列不能互相比较,q将?x)启用全表扫?

不用烦(ch)?

SELECT ACCOUNT_NAME, AMOUNT

FROM TRANSACTION

WHERE ACCOUNT_NAME = NVL(:ACC_NAME,ACCOUNT_NAME);

使用索引:

SELECT ACCOUNT_NAME, AMOUNT

FROM TRANSACTION

WHERE ACCOUNT_NAME LIKE NVL(:ACC_NAME,'%');


译者按:

如果一定要对用函数的列启用烦(ch)? ORACLE新的功能: Z函数的烦(ch)?Function-Based Index) 也许是一个较好的Ҏ(gu).

CREATE INDEX EMP_I ON EMP (UPPER(ename)); /*建立Z函数的烦(ch)?/

SELECT * FROM emp WHERE UPPER(ename) = ‘BLACKSNAIL'; /*用烦(ch)?/



Vincent Chen 2006-02-25 22:34 发表评论
]]>
ORACLE SQL性能优化pd (十四) 完结?/title><link>http://www.tkk7.com/Vencent/articles/32455.html</link><dc:creator>Vincent Chen</dc:creator><author>Vincent Chen</author><pubDate>Sat, 25 Feb 2006 14:34:00 GMT</pubDate><guid>http://www.tkk7.com/Vencent/articles/32455.html</guid><wfw:comment>http://www.tkk7.com/Vencent/comments/32455.html</wfw:comment><comments>http://www.tkk7.com/Vencent/articles/32455.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.tkk7.com/Vencent/comments/commentRss/32455.html</wfw:commentRss><trackback:ping>http://www.tkk7.com/Vencent/services/trackbacks/32455.html</trackback:ping><description><![CDATA[<table cellpadding="0" cellspacing="0"><tbody><tr><td class="font14" align="center"><div id="ceiamkk" class="style34 style35" align="center"><strong>ORACLE SQL性能优化pd (十四) 完结?</strong></div></td> </tr> <tr> <td class="font12" align="center"><div id="icuqsgw" class="style36" align="center"><br> 作? black_snail</div></td> </tr> <tr> <td class="font12"><br></td> </tr> <tr> <td class="font12" align="center"><table cellpadding="0" cellspacing="0"> <tbody><tr> <td><p class="style35"> </p> <p class="style35">关键?ORACLE PERFORMANCE TUNING PL/SQL <br> <br> 出处 http://www.dbasupport.com <br> <br> <br> <br> 46. q接多个扫描 <br> <br> 如果你对一个列和一l有限的D行比? 优化器可能执行多ơ扫描ƈ对结果进行合q连? <br> <br> 举例: <br> <br> SELECT * <br> <br> FROM LODGING <br> <br> WHERE MANAGER IN (‘BILL GATES','KEN MULLER'); <br> <br> <br> 优化器可能将它{换成以下形式 <br> <br> SELECT * <br> <br> FROM LODGING <br> <br> WHERE MANAGER = ‘BILL GATES' <br> <br> OR MANAGER = 'KEN MULLER'; <br> <br> <br> 当选择执行路径? 优化器可能对每个条g采用LODGING$MANAGER上的索引范围扫描. q回的ROWID用来讉KLODGING表的记录 (通过TABLE ACCESS BY ROWID 的方?. 最后两l记录以q接(CONCATENATION)的Ş式被l合成一个单一的集? <br> <br> <br> Explain Plan : <br> <br> <br> SELECT STATEMENT Optimizer=CHOOSE <br> <br> CONCATENATION <br> <br> TABLE ACCESS (BY INDEX ROWID) OF LODGING <br> <br> INDEX (RANGE SCAN ) OF LODGING$MANAGER (NON-UNIQUE) <br> <br> TABLE ACCESS (BY INDEX ROWID) OF LODGING <br> <br> INDEX (RANGE SCAN ) OF LODGING$MANAGER (NON-UNIQUE) <br> <br> 译者按: <br> <br> 本节和第37节似乎有矛盾之处. <br> <br> <br> <br> 47. CBO下用更具选择性的索引 <br> <br> Z成本的优化器(CBO, Cost-Based Optimizer)对烦(ch)引的选择性进行判断来军_索引的用是否能提高效率. <br> <br> 如果索引有很高的选择? 那就是说对于每个不重复的索引键?只对应数量很的记录. <br> <br> 比如, 表中共有100条记录而其中有80个不重复的烦(ch)引键? q个索引的选择性就?0/100 = 0.8 . 选择性越? 通过索引键值检索出的记录就少. <br> <br> 如果索引的选择性很? (g)索数据就需要大量的索引范围查询操作和ROWID 讉K表的 <br> <br> 操作. 也许?x)比全表扫描的效率更? <br> <br> <br> 译者按: <br> <br> 下列l验请参? <br> <br> a. 如果(g)索数据量过30%的表中记录数.使用索引没有显著的效率提高. <br> <br> b. 在特定情况下, 使用索引也许?x)比全表扫描? 但这是同一个数量上的 <br> <br> 区别. 而通常情况?使用索引比全表扫描要块几倍乃臛_千? <br> <br> <br> <br> 48. 避免使用耗费资源的操?<br> <br> 带有DISTINCT,UNION,MINUS,INTERSECT,ORDER BY的SQL语句?x)启动SQL引擎 <br> <br> 执行耗费资源的排?SORT)功能. DISTINCT需要一ơ排序操? 而其他的臛_需要执行两ơ排? <br> <br> 例如,一个UNION查询,其中每个查询都带有GROUP BY子句, GROUP BY?x)触发嵌入排?NESTED SORT) ; q样, 每个查询需要执行一ơ排? 然后在执行UNION? 又一个唯一排序(SORT UNIQUE)操作被执行而且它只能在前面的嵌入排序结束后才能开始执? 嵌入的排序的深度?x)大大?jing)响查询的效率. <br> <br> 通常, 带有UNION, MINUS , INTERSECT的SQL语句都可以用其他方式重写. <br> <br> 译者按: <br> <br> 如果你的数据库的SORT_AREA_SIZE调配得好, 使用UNION , MINUS, INTERSECT也是可以考虑? 毕竟它们的可L很?<br> <br> <br> <br> 49. 优化GROUP BY <br> <br> 提高GROUP BY 语句的效? 可以通过不需要的记录在GROUP BY 之前qo(h)?下面两个查询q回相同l果但第二个明显快了许? <br> <br> <br> 低效: <br> <br> SELECT JOB , AVG(SAL) <br> <br> FROM EMP <br> <br> GROUP JOB <br> <br> HAVING JOB = ‘PRESIDENT' <br> <br> OR JOB = ‘MANAGER' <br> <br> 高效: <br> <br> SELECT JOB , AVG(SAL) <br> <br> FROM EMP <br> <br> WHERE JOB = ‘PRESIDENT' <br> <br> OR JOB = ‘MANAGER' <br> <br> GROUP JOB <br> <br> <br> 译者按: <br> <br> 本节?4节相? 可略q? <br> <br> <br> <br> 50. 使用日期 <br> <br> 当用日期是,需要注意如果有过5位小数加到日期上, q个日期?x)进C一? <br> <br> <br> 例如: <br> <br> 1. <br> <br> SELECT TO_DATE(?1-JAN-93'+.99999) <br> <br> FROM DUAL; <br> <br> <br> Returns: <br> <br> '01-JAN-93 23:59:59' <br> <br> 2. <br> <br> SELECT TO_DATE(?1-JAN-93'+.999999) <br> <br> FROM DUAL; <br> <br> <br> Returns: <br> <br> '02-JAN-93 00:00:00' <br> <br> <br> 译者按: <br> <br> 虽然本节和SQL性能优化没有关系, 但是作者的功力可见一?<br> <br> <br> <br> 51. 使用昑ּ的游?CURSORs) <br> <br> 使用隐式的游?会(x)执行两次操作. W一ơ检索记? W二ơ检查TOO MANY ROWS q个exception . 而显式游标不执行W二ơ操? <br> <br> <br> <br> 52. 优化EXPORT和IMPORT <br> <br> 使用较大的BUFFER(比如10MB , 10,240,000)可以提高EXPORT和IMPORT的速度. <br> <br> ORACLE尽可能地获取你所指定的内存大?即在内存不满,也不?x)报?q个D要和表中最大的列相?否则列g(x)被截? <br> <br> 译者按: <br> <br> 可以肯定的是, 增加BUFFER?x)大大提高EXPORT , IMPORT的效? (曄到q一个CASE, 增加BUFFER?IMPORT/EXPORT快了10?) <br> <br> 作者可能犯了一个错? “这个D要和表中最大的列相?否则列g(x)被截? ?<br> <br> 其中最大的列也许是指最大的记录大小. <br> <br> 关于EXPORT/IMPORT的优?CSDN论坛中有一些ȝ性的贴子,比如关于BUFFER参数, COMMIT参数{等, 详情h. <br> <br> <br> <br> 53. 分离表和索引 <br> <br> L你的表和烦(ch)引徏立在不同的表I间?TABLESPACES). 决不要将不属于ORACLE内部pȝ的对象存攑ֈSYSTEM表空间里. 同时,保数据表空间和索引表空间置于不同的盘? <br> <br> <br> 译者按: <br> <br> “同?保数据表空间和索引表空间置与不同的盘?”可能改为如下更为准?“同?保数据表空间和索引表空间置与不同的盘控制卡控制的盘??<br> <br> <br> (全文? <br> <br>作者:(x)</p><p class="style35">Black_Snail <br> <br> ligang1000@hotmail.com <br> <br> 4/Sep/2003 </p></td></tr></tbody></table></td></tr></tbody></table><img src ="http://www.tkk7.com/Vencent/aggbug/32455.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.tkk7.com/Vencent/" target="_blank">Vincent Chen</a> 2006-02-25 22:34 <a href="http://www.tkk7.com/Vencent/articles/32455.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>ORACLE SQL性能优化pd (?http://www.tkk7.com/Vencent/articles/32451.htmlVincent ChenVincent ChenSat, 25 Feb 2006 14:33:00 GMThttp://www.tkk7.com/Vencent/articles/32451.htmlhttp://www.tkk7.com/Vencent/comments/32451.htmlhttp://www.tkk7.com/Vencent/articles/32451.html#Feedback0http://www.tkk7.com/Vencent/comments/commentRss/32451.htmlhttp://www.tkk7.com/Vencent/services/trackbacks/32451.html
ORACLE SQL性能优化pd (?

作? black_snail

 

关键?ORACLE PERFORMANCE TUNING PL/SQL

出处 http://WWW.DBASUPPORT.COM



31. 强制索引失效


如果两个或以上烦(ch)引具有相同的{,你可以强制命令ORACLE优化器用其中的一?通过?(g)索出的记录数量少) .


举例:


SELECT ENAME

FROM EMP

WHERE EMPNO = 7935

AND DEPTNO + 0 = 10 /*DEPTNO上的索引失?/

AND EMP_TYPE || ? = ‘A' /*EMP_TYPE上的索引失?/


q是一U相当直接的提高查询效率的办? 但是你必}慎考虑q种{略,一般来?只有在你希望单独优化几个SQL时才能采用它.


q里有一个例子关于何旉用这U策?


假设在EMP表的EMP_TYPE列上有一个非唯一性的索引而EMP_CLASS上没有烦(ch)?


SELECT ENAME

FROM EMP

WHERE EMP_TYPE = ‘A'

AND EMP_CLASS = ‘X';


优化器会(x)注意到EMP_TYPE上的索引q用它. q是目前唯一的选择. 如果,一D|间以? 另一个非唯一性徏立在EMP_CLASS?优化器必d两个索引q行选择,在通常情况?优化器将使用两个索引q在他们的结果集合上执行排序?qing)合q? 然?如果其中一个烦(ch)引(EMP_TYPEQ接q于唯一性而另一个烦(ch)引(EMP_CLASSQ上有几千个重复的? 排序?qing)合q就?x)成ZU不必要的负? 在这U情况下,你希望优化器屏蔽掉EMP_CLASS索引.

用下面的Ҏ(gu)可以解决问?

SELECT ENAME

FROM EMP

WHERE EMP_TYPE = ‘A'

AND EMP_CLASS||'' = ‘X';



32. 避免在烦(ch)引列上用计.

WHERE子句中,如果索引列是函数的一部分Q优化器不使用索引而用全表扫描.


举例:


低效Q?

SELECT ?

FROM DEPT

WHERE SAL * 12 > 25000;


高效:

SELECT ?

FROM DEPT

WHERE SAL > 25000/12;


译者按:

q是一个非常实用的规则Q请务必牢记



33. 自动选择索引

如果表中有两个以上(包括两个Q烦(ch)引,其中有一个唯一性烦(ch)引,而其他是非唯一性.

在这U情况下QORACLE用唯一性烦(ch)引而完全忽略非唯一性烦(ch)引.


举例:

SELECT ENAME

FROM EMP

WHERE EMPNO = 2326

AND DEPTNO = 20 ;


q里Q只有EMPNO上的索引是唯一性的Q所以EMPNO索引用来检索记录.

TABLE ACCESS BY ROWID ON EMP

INDEX UNIQUE SCAN ON EMP_NO_IDX



34. 避免在烦(ch)引列上用NOT

通常Q 我们要避免在索引列上使用NOT, NOT?x)生在和在索引列上使用函数相同?

影响. 当ORACLE”遇到”NOT,他就?x)停止用?ch)引{而执行全表扫?

举例:


低效: (q里,不用烦(ch)?


SELECT ?

FROM DEPT

WHERE DEPT_CODE NOT = 0;


高效: (q里,使用了烦(ch)?


SELECT ?

FROM DEPT

WHERE DEPT_CODE > 0;


需要注意的?在某些时? ORACLE优化器会(x)自动NOT转化成相对应的关pL作符.

NOT > to <=

NOT >= to <

NOT < to >=

NOT <= to >



译者按:

在这个例子中,作者犯了一些错? 例子中的低效率SQL是不能被执行?

我做了一些测?


SQL> select * from emp where NOT empno > 1;

no rows selected

Execution Plan

----------------------------------------------------------

0 SELECT STATEMENT Optimizer=CHOOSE

1 0 TABLE ACCESS (BY INDEX ROWID) OF 'EMP'

2 1 INDEX (RANGE SCAN) OF 'EMPNO' (UNIQUE)


SQL> select * from emp where empno <= 1;

no rows selected

Execution Plan

----------------------------------------------------------

0 SELECT STATEMENT Optimizer=CHOOSE

1 0 TABLE ACCESS (BY INDEX ROWID) OF 'EMP'

2 1 INDEX (RANGE SCAN) OF 'EMPNO' (UNIQUE)


两者的效率完全一P也许q符合作者关于?在某些时? ORACLE优化器会(x)自动NOT转化成相对应的关pL作符?的观点.



35. ?gt;=替代>


如果DEPTNO上有一个烦(ch)?


高效:


SELECT *

FROM EMP

WHERE DEPTNO >=4


低效:


SELECT *

FROM EMP

WHERE DEPTNO >3


两者的区别在于, 前者DBMS直接蟩到第一个DEPT{于4的记录而后者将首先定位到DEPTNO=3的记录ƈ且向前扫描到W一个DEPT大于3的记?



Vincent Chen 2006-02-25 22:33 发表评论
]]>
ORACLE SQL性能优化pd (十一)http://www.tkk7.com/Vencent/articles/32452.htmlVincent ChenVincent ChenSat, 25 Feb 2006 14:33:00 GMThttp://www.tkk7.com/Vencent/articles/32452.htmlhttp://www.tkk7.com/Vencent/comments/32452.htmlhttp://www.tkk7.com/Vencent/articles/32452.html#Feedback0http://www.tkk7.com/Vencent/comments/commentRss/32452.htmlhttp://www.tkk7.com/Vencent/services/trackbacks/32452.html
ORACLE SQL性能优化pd (十一)

作? black_snail

 

关键?ORACLE PERFORMANCE PL/SQL TUNING

出处 http://www.dbasupport.com



36. 用UNION替换OR (适用于烦(ch)引列)

通常情况? 用UNION替换WHERE子句中的OR会(x)起到较好的效? 对烦(ch)引列使用OR造成全表扫描. 注意, 以上规则只针对多个烦(ch)引列有效. 如果有column没有被烦(ch)? 查询效率可能?x)因Z没有选择OR而降?

在下面的例子? LOC_ID 和REGION上都建有索引.

高效:

SELECT LOC_ID , LOC_DESC , REGION

FROM LOCATION

WHERE LOC_ID = 10

UNION

SELECT LOC_ID , LOC_DESC , REGION

FROM LOCATION

WHERE REGION = “MELBOURNE?


低效:

SELECT LOC_ID , LOC_DESC , REGION

FROM LOCATION

WHERE LOC_ID = 10 OR REGION = “MELBOURNE?


如果你坚持要用OR, 那就需要返回记录最的索引列写在最前面.


注意:


WHERE KEY1 = 10 (q回最记?

OR KEY2 = 20 (q回最多记?


ORACLE 内部以上{换ؓ(f)

WHERE KEY1 = 10 AND

((NOT KEY1 = 10) AND KEY2 = 20)


译者按:


下面的测试数据仅供参? (a = 1003 q回一条记?, b = 1 q回1003条记?

SQL> select * from unionvsor /*1st test*/

2 where a = 1003 or b = 1;

1003 rows selected.

Execution Plan

----------------------------------------------------------

0 SELECT STATEMENT Optimizer=CHOOSE

1 0 CONCATENATION

2 1 TABLE ACCESS (BY INDEX ROWID) OF 'UNIONVSOR'

3 2 INDEX (RANGE SCAN) OF 'UB' (NON-UNIQUE)

4 1 TABLE ACCESS (BY INDEX ROWID) OF 'UNIONVSOR'

5 4 INDEX (RANGE SCAN) OF 'UA' (NON-UNIQUE)

Statistics

----------------------------------------------------------

0 recursive calls

0 db block gets

144 consistent gets

0 physical reads

0 redo size

63749 bytes sent via SQL*Net to client

7751 bytes received via SQL*Net from client

68 SQL*Net roundtrips to/from client

0 sorts (memory)

0 sorts (disk)

1003 rows processed

SQL> select * from unionvsor /*2nd test*/

2 where b = 1 or a = 1003 ;

1003 rows selected.

Execution Plan

----------------------------------------------------------

0 SELECT STATEMENT Optimizer=CHOOSE

1 0 CONCATENATION

2 1 TABLE ACCESS (BY INDEX ROWID) OF 'UNIONVSOR'

3 2 INDEX (RANGE SCAN) OF 'UA' (NON-UNIQUE)

4 1 TABLE ACCESS (BY INDEX ROWID) OF 'UNIONVSOR'

5 4 INDEX (RANGE SCAN) OF 'UB' (NON-UNIQUE)

Statistics

----------------------------------------------------------

0 recursive calls

0 db block gets

143 consistent gets

0 physical reads

0 redo size

63749 bytes sent via SQL*Net to client

7751 bytes received via SQL*Net from client

68 SQL*Net roundtrips to/from client

0 sorts (memory)

0 sorts (disk)

1003 rows processed



SQL> select * from unionvsor /*3rd test*/

2 where a = 1003

3 union

4 select * from unionvsor

5 where b = 1;

1003 rows selected.

Execution Plan

----------------------------------------------------------

0 SELECT STATEMENT Optimizer=CHOOSE

1 0 SORT (UNIQUE)

2 1 UNION-ALL

3 2 TABLE ACCESS (BY INDEX ROWID) OF 'UNIONVSOR'

4 3 INDEX (RANGE SCAN) OF 'UA' (NON-UNIQUE)

5 2 TABLE ACCESS (BY INDEX ROWID) OF 'UNIONVSOR'

6 5 INDEX (RANGE SCAN) OF 'UB' (NON-UNIQUE)

Statistics

----------------------------------------------------------

0 recursive calls

0 db block gets

10 consistent gets

0 physical reads

0 redo size

63735 bytes sent via SQL*Net to client

7751 bytes received via SQL*Net from client

68 SQL*Net roundtrips to/from client

1 sorts (memory)

0 sorts (disk)

1003 rows processed

用UNION的效果可以从consistent gets?SQL*NET的数据交换量的减看?



37. 用IN来替换OR


下面的查询可以被更有效率的语句替?


低效:


SELECT?

FROM LOCATION

WHERE LOC_ID = 10

OR LOC_ID = 20

OR LOC_ID = 30


高效

SELECT?

FROM LOCATION

WHERE LOC_IN IN (10,20,30);


译者按:

q是一条简单易记的规则Q但是实际的执行效果q须(g)验,在ORACLE8i下,两者的执行路径g是相同的Q 



38. 避免在烦(ch)引列上用IS NULL和IS NOT NULL

避免在烦(ch)引中使用M可以为空的列QORACLE无法用该索引 Q对于单列烦(ch)引,如果列包含空|索引中将不存在此记录. 对于复合索引Q如果每个列都ؓ(f)I,索引中同样不存在此记? 如果臛_有一个列不ؓ(f)I,则记录存在于索引中.

举例:

如果唯一性烦(ch)引徏立在表的A列和B列上, q且表中存在一条记录的A,Bgؓ(f)(123,null) , ORACLE不接受下一条具有相同A,B|123,nullQ的记录(插入). 然而如?

所有的索引列都为空QORACLE认为整个键gؓ(f)I空不等于空. 因此你可以插?000

条具有相同键值的记录,当然它们都是I?


因ؓ(f)Ig存在于烦(ch)引列?所以WHERE子句中对索引列进行空值比较将使ORACLE停用该烦(ch)?

举例:


低效: (索引失效)

SELECT ?

FROM DEPARTMENT

WHERE DEPT_CODE IS NOT NULL;


高效: (索引有效)

SELECT ?

FROM DEPARTMENT

WHERE DEPT_CODE >=0;



Vincent Chen 2006-02-25 22:33 发表评论
]]>
ORACLE SQL性能优化pd (十二)http://www.tkk7.com/Vencent/articles/32453.htmlVincent ChenVincent ChenSat, 25 Feb 2006 14:33:00 GMThttp://www.tkk7.com/Vencent/articles/32453.htmlhttp://www.tkk7.com/Vencent/comments/32453.htmlhttp://www.tkk7.com/Vencent/articles/32453.html#Feedback0http://www.tkk7.com/Vencent/comments/commentRss/32453.htmlhttp://www.tkk7.com/Vencent/services/trackbacks/32453.html
ORACLE SQL性能优化pd (十二)

作? black_snail

 

关键?ORACLE PERFORMANCE TUNING PL/SQL

出处 http://www.dbasupport.com



39. L使用索引的第一个列

如果索引是徏立在多个列上, 只有在它的第一个列(leading column)被where子句引用?优化器才?x)选择使用该烦(ch)?


译者按:

q也是一条简单而重要的规则. 见以下实?


SQL> create table multiindexusage ( inda number , indb number , descr varchar2(10));

Table created.

SQL> create index multindex on multiindexusage(inda,indb);

Index created.

SQL> set autotrace traceonly


SQL> select * from multiindexusage where inda = 1;

Execution Plan

----------------------------------------------------------

0 SELECT STATEMENT Optimizer=CHOOSE

1 0 TABLE ACCESS (BY INDEX ROWID) OF 'MULTIINDEXUSAGE'

2 1 INDEX (RANGE SCAN) OF 'MULTINDEX' (NON-UNIQUE)


SQL> select * from multiindexusage where indb = 1;

Execution Plan

----------------------------------------------------------

0 SELECT STATEMENT Optimizer=CHOOSE

1 0 TABLE ACCESS (FULL) OF 'MULTIINDEXUSAGE'


很明? 当仅引用索引的第二个列时,优化器用了全表扫描而忽略了索引



40. ORACLE内部操作

当执行查询时,ORACLE采用了内部的操作. 下表昄了几U重要的内部操作.

ORACLE Clause
内部操作

ORDER BY
SORT ORDER BY

UNION
UNION-ALL

MINUS
MINUS

INTERSECT
INTERSECT

DISTINCT,MINUS,INTERSECT,UNION
SORT UNIQUE

MIN,MAX,COUNT
SORT AGGREGATE

GROUP BY
SORT GROUP BY

ROWNUM
COUNT or COUNT STOPKEY

Queries involving Joins
SORT JOIN,MERGE JOIN,NESTED LOOPS

CONNECT BY
CONNECT BY




41. 用UNION-ALL 替换UNION ( 如果有可能的?


当SQL语句需要UNION两个查询l果集合?q两个结果集合会(x)以UNION-ALL的方式被合ƈ, 然后在输出最l结果前q行排序.

如果用UNION ALL替代UNION, q样排序׃是必要了. 效率׃(x)因此得到提高.


举例:

低效Q?

     SELECT ACCT_NUM, BALANCE_AMT

FROM DEBIT_TRANSACTIONS

WHERE TRAN_DATE = '31-DEC-95'

UNION

SELECT ACCT_NUM, BALANCE_AMT

FROM DEBIT_TRANSACTIONS

WHERE TRAN_DATE = '31-DEC-95'

高效:

SELECT ACCT_NUM, BALANCE_AMT

FROM DEBIT_TRANSACTIONS

WHERE TRAN_DATE = '31-DEC-95'

UNION ALL

SELECT ACCT_NUM, BALANCE_AMT

FROM DEBIT_TRANSACTIONS

WHERE TRAN_DATE = '31-DEC-95'


译者按:

需要注意的是,UNION ALL 重复输Z个结果集合中相同记录. 因此各位q是

要从业务需求分析用UNION ALL的可行?

UNION 对l果集合排序,q个操作?x)用到SORT_AREA_SIZEq块内存. 对于q?

块内存的优化也是相当重要? 下面的SQL可以用来查询排序的消耗量


Select substr(name,1,25) "Sort Area Name",

substr(value,1,15) "Value"

from v$sysstat

where name like 'sort%'



42. 使用提示(Hints)

对于表的讉K,可以使用两种Hints.

FULL ?ROWID


FULL hint 告诉ORACLE使用全表扫描的方式访问指定表.

例如:

SELECT /*+ FULL(EMP) */ *

FROM EMP

WHERE EMPNO = 7893;


ROWID hint 告诉ORACLE使用TABLE ACCESS BY ROWID的操作访问表.


通常, 你需要采用TABLE ACCESS BY ROWID的方式特别是当访问大表的时? 使用q种方式, 你需要知道ROIWD的值或者用烦(ch)?

如果一个大表没有被讑֮为缓?CACHED)表而你希望它的数据在查询结束是仍然停留

在SGA?你就可以使用CACHE hint 来告诉优化器把数据保留在SGA? 通常CACHE hint ?FULL hint 一起?

例如:

SELECT /*+ FULL(WORKER) CACHE(WORKER)*/ *

FROM WORK;


索引hint 告诉ORACLE使用Z索引的扫描方? 你不必说明具体的索引名称

例如:

SELECT /*+ INDEX(LODGING) */ LODGING

FROM LODGING

WHERE MANAGER = ‘BILL GATES';


在不使用hint的情况下, 以上的查询应该也?x)用?ch)?然?如果该烦(ch)引的重复D多而你的优化器是CBO, 优化器就可能忽略索引. 在这U情况下, 你可以用INDEX hint强制ORACLE使用该烦(ch)?


ORACLE hints q包括ALL_ROWS, FIRST_ROWS, RULE,USE_NL, USE_MERGE, USE_HASH {等.


译者按:

使用hint , 表示我们对ORACLE优化器缺省的执行路径不满?需要手工修?

q是一个很有技巧性的工作. 我徏议只针对特定?数的SQLq行hint的优?

对ORACLE的优化器q是要有信心(特别是CBO)



Vincent Chen 2006-02-25 22:33 发表评论
]]>
ORACLE SQL性能优化pd (?http://www.tkk7.com/Vencent/articles/32449.htmlVincent ChenVincent ChenSat, 25 Feb 2006 14:32:00 GMThttp://www.tkk7.com/Vencent/articles/32449.htmlhttp://www.tkk7.com/Vencent/comments/32449.htmlhttp://www.tkk7.com/Vencent/articles/32449.html#Feedback0http://www.tkk7.com/Vencent/comments/commentRss/32449.htmlhttp://www.tkk7.com/Vencent/services/trackbacks/32449.html
ORACLE SQL性能优化pd (?

作? black_snail

 

关键?ORACLE SQL PERFORMANCE TUNING

出处 http://www.dbasupport.com



25. 用烦(ch)引提高效?


索引是表的一个概念部?用来提高?gu)(g)索数据的效率. 实际?ORACLE使用了一个复杂的自^衡B-treel构. 通常,通过索引查询数据比全表扫描要? 当ORACLE扑և执行查询和Update语句的最佌\径时, ORACLE优化器将使用索引. 同样在联l多个表时用烦(ch)引也可以提高效率. 另一个用烦(ch)引的好处?它提供了主键(primary key)的唯一性验?

除了那些LONG或LONG RAW数据cd, 你可以烦(ch)引几乎所有的? 通常, 在大型表中用烦(ch)引特别有? 当然,你也?x)发? 在扫描小表时,使用索引同样能提高效?

虽然使用索引能得到查询效率的提高,但是我们也必L意到它的代h(hun). 索引需要空间来

存储,也需要定期维? 每当有记录在表中增减或烦(ch)引列被修Ҏ(gu), 索引本n也会(x)被修? q意味着每条记录的INSERT , DELETE , UPDATEؓ(f)此多付出4 , 5 ơ的盘I(y)/O . 因ؓ(f)索引需要额外的存储I间和处?那些不必要的索引反而会(x)使查询反应时间变?


译者按:

定期的重构烦(ch)引是有必要的.

ALTER INDEX <INDEXNAME> REBUILD <TABLESPACENAME>



26. 索引的操?


ORACLE对烦(ch)引有两种讉K模式.


索引唯一扫描 ( INDEX UNIQUE SCAN)


大多数情况下, 优化器通过WHERE子句讉KINDEX.


例如:

表LODGING有两个烦(ch)?: 建立在LODGING列上的唯一性烦(ch)引LODGING_PK和徏立在MANAGER列上的非唯一性烦(ch)引LODGING$MANAGER.



SELECT *

FROM LODGING

WHERE LODGING = ‘ROSE HILL';


在内?, 上述SQL被分成两步执行, 首先 , LODGING_PK 索引通过索引唯一扫描的方式被讉K , 获得相对应的ROWID, 通过ROWID讉K表的方式 执行下一步检?

如果被检索返回的列包括在INDEX列中,ORACLE不执行W二步的处理(通过ROWID讉K?. 因ؓ(f)(g)索数据保存在索引? 单单讉K索引可以完全满x询结?

下面SQL只需要INDEX UNIQUE SCAN 操作.


SELECT LODGING

FROM LODGING

WHERE LODGING = ‘ROSE HILL';


索引范围查询(INDEX RANGE SCAN)

适用于两U情?

1. Z一个范围的(g)?

2. Z非唯一性烦(ch)引的(g)?


?:


SELECT LODGING

FROM LODGING

WHERE LODGING LIKE ‘M%';


WHERE子句条g包括一pd? ORACLE通过索引范围查询的方式查询LODGING_PK . ׃索引范围查询返回一l? 它的效率p比烦(ch)引唯一扫描

低一?


?:


SELECT LODGING

FROM LODGING

WHERE MANAGER = ‘BILL GATES';


q个SQL的执行分两步, LODGING$MANAGER的烦(ch)引范围查?得到所有符合条件记录的ROWID) 和下一步同qROWID讉K表得到LODGING列的? ׃LODGING$MANAGER是一个非唯一性的索引,数据库不能对它执行烦(ch)引唯一扫描.


׃SQLq回LODGING?而它q不存在于LODGING$MANAGER索引? 所以在索引范围查询后会(x)执行一个通过ROWID讉K表的操作.


WHERE子句? 如果索引列所对应的值的W一个字W由通配W?WILDCARD)开? 索引不被采?


SELECT LODGING

FROM LODGING

WHERE MANAGER LIKE ‘%HANMAN';


在这U情况下QORACLE用全表扫?



Vincent Chen 2006-02-25 22:32 发表评论
]]>
ORACLE SQL性能优化pd (?http://www.tkk7.com/Vencent/articles/32450.htmlVincent ChenVincent ChenSat, 25 Feb 2006 14:32:00 GMThttp://www.tkk7.com/Vencent/articles/32450.htmlhttp://www.tkk7.com/Vencent/comments/32450.htmlhttp://www.tkk7.com/Vencent/articles/32450.html#Feedback0http://www.tkk7.com/Vencent/comments/commentRss/32450.htmlhttp://www.tkk7.com/Vencent/services/trackbacks/32450.html
ORACLE SQL性能优化pd (?

作? black_snail

 

关键?ORACLE PL/SQL TUNING PERFORMANCE

出处 http://www.dbasupport.com



27. 基础表的选择


基础?Driving Table)是指被最先访问的?通常以全表扫描的方式被访?. Ҏ(gu)优化器的不同, SQL语句中基表的选择是不一L(fng).

如果你用的是CBO (COST BASED OPTIMIZER),优化器会(x)(g)查SQL语句中的每个表的物理大小,索引的状?然后选用p最低的执行路径.

如果你用RBO (RULE BASED OPTIMIZER) , q且所有的q接条g都有索引对应, 在这U情况下, 基础表就是FROM 子句中列在最后的那个?

举例:

SELECT A.NAME , B.MANAGER

FROM WORKER A,

LODGING B

WHERE A.LODGING = B.LODING;

׃LODGING表的LODING列上有一个烦(ch)? 而且WORKER表中没有相比较的索引, WORKER表将被作为查询中的基?



28. 多个q等的烦(ch)?

当SQL语句的执行\径可以用分布在多个表上的多个烦(ch)引时, ORACLE?x)同时用多个?ch)引ƈ在运行时对它们的记录q行合ƈ, (g)索出仅对全部索引有效的记?

在ORACLE选择执行路径?唯一性烦(ch)引的{高于非唯一性烦(ch)? 然而这个规则只?

当WHERE子句中烦(ch)引列和常量比较才有效.如果索引列和其他表的索引cȝ比较. q种子句在优化器中的{是非怽?

如果不同表中两个惛_{的烦(ch)引将被引? FROM子句中表的顺序将军_哪个?x)被率先使? FROM子句中最后的表的索引有最高的优先U?

如果相同表中两个惛_{的烦(ch)引将被引? WHERE子句中最先被引用的烦(ch)引将有最高的优先U?

举例:

DEPTNO上有一个非唯一性烦(ch)?EMP_CAT也有一个非唯一性烦(ch)?

SELECT ENAME,

FROM EMP

WHERE DEPT_NO = 20

AND EMP_CAT = ‘A';

q里,DEPTNO索引被最先检?然后同EMP_CAT索引(g)索出的记录进行合q? 执行路径如下:



TABLE ACCESS BY ROWID ON EMP

AND-EQUAL

INDEX RANGE SCAN ON DEPT_IDX

INDEX RANGE SCAN ON CAT_IDX



29. {式比较和范围比?

当WHERE子句中有索引? ORACLE不能合ƈ它们,ORACLE用范围比较.


举例:

DEPTNO上有一个非唯一性烦(ch)?EMP_CAT也有一个非唯一性烦(ch)?

SELECT ENAME

FROM EMP

WHERE DEPTNO > 20

AND EMP_CAT = ‘A';



q里只有EMP_CAT索引被用?然后所有的记录逐条与DEPTNO条gq行比较. 执行路径如下:

TABLE ACCESS BY ROWID ON EMP

INDEX RANGE SCAN ON CAT_IDX



30. 不明的索引{


当ORACLE无法判断索引的等U高低差?优化器将只用一个烦(ch)?它就是在WHERE子句中被列在最前面?

举例:

DEPTNO上有一个非唯一性烦(ch)?EMP_CAT也有一个非唯一性烦(ch)?


SELECT ENAME

FROM EMP

WHERE DEPTNO > 20

AND EMP_CAT > ‘A';


q里, ORACLE只用CDEPT_NO索引. 执行路径如下:


TABLE ACCESS BY ROWID ON EMP

INDEX RANGE SCAN ON DEPT_IDX


译者按:

我们来试一下以下这U情?

SQL> select index_name, uniqueness from user_indexes where table_name = 'EMP';


INDEX_NAME UNIQUENES

------------------------------ ---------

EMPNO UNIQUE

EMPTYPE NONUNIQUE


SQL> select * from emp where empno >= 2 and emp_type = 'A' ;


no rows selected



Execution Plan

----------------------------------------------------------

0 SELECT STATEMENT Optimizer=CHOOSE

1 0 TABLE ACCESS (BY INDEX ROWID) OF 'EMP'

2 1 INDEX (RANGE SCAN) OF 'EMPTYPE' (NON-UNIQUE)


虽然EMPNO是唯一性烦(ch)?但是׃它所做的是范围比? {要比非唯一性烦(ch)引的{式比较?



Vincent Chen 2006-02-25 22:32 发表评论
]]>
ORACLE SQL性能优化pd (?http://www.tkk7.com/Vencent/articles/32447.htmlVincent ChenVincent ChenSat, 25 Feb 2006 14:31:00 GMThttp://www.tkk7.com/Vencent/articles/32447.htmlhttp://www.tkk7.com/Vencent/comments/32447.htmlhttp://www.tkk7.com/Vencent/articles/32447.html#Feedback0http://www.tkk7.com/Vencent/comments/commentRss/32447.htmlhttp://www.tkk7.com/Vencent/services/trackbacks/32447.html
ORACLE SQL性能优化pd (?

作? black_snail

 

关键?ORACLE PERFORMANCE TUNING SQL

出处 http://www.dbasupport.com



20. 用表q接替换EXISTS


通常来说 , 采用表连接的方式比EXISTS更有效率

SELECT ENAME

FROM EMP E

WHERE EXISTS (SELECT ‘X'

FROM DEPT

WHERE DEPT_NO = E.DEPT_NO

AND DEPT_CAT = ‘A');


(更高?

SELECT ENAME

FROM DEPT D,EMP E

WHERE E.DEPT_NO = D.DEPT_NO

AND DEPT_CAT = ‘A' ;


(译者按: 在RBO的情况下,前者的执行路径包括F(xin)ILTER,后者用NESTED LOOP)



21. 用EXISTS替换DISTINCT

当提交一个包含一对多表信?比如部门表和雇员?的查询时,避免在SELECT子句中用DISTINCT. 一般可以考虑用EXIST替换


例如:

低效:

SELECT DISTINCT DEPT_NO,DEPT_NAME

FROM DEPT D,EMP E

WHERE D.DEPT_NO = E.DEPT_NO

高效:

SELECT DEPT_NO,DEPT_NAME

FROM DEPT D

WHERE EXISTS ( SELECT ‘X'

FROM EMP E

WHERE E.DEPT_NO = D.DEPT_NO);


EXISTS 使查询更?因ؓ(f)RDBMS核心模块在子查询的条g一旦满_,立刻q回l果.



22. 识别'低效执行'的SQL语句


用下列SQL工具扑և低效SQL:

SELECT EXECUTIONS , DISK_READS, BUFFER_GETS,

ROUND((BUFFER_GETS-DISK_READS)/BUFFER_GETS,2) Hit_radio,

ROUND(DISK_READS/EXECUTIONS,2) Reads_per_run,

SQL_TEXT

FROM V$SQLAREA

WHERE EXECUTIONS>0

AND BUFFER_GETS > 0

AND (BUFFER_GETS-DISK_READS)/BUFFER_GETS < 0.8

ORDER BY 4 DESC;


(译者按: 虽然目前各种关于SQL优化的图形化工具层出不穷,但是写出自己的SQL工具来解决问题始l是一个最好的Ҏ(gu))



23. 使用TKPROF 工具来查询SQL性能状?


SQL trace 工具攉正在执行的SQL的性能状态数据ƈ记录C个跟t文件中. q个跟踪文g提供了许多有用的信息,例如解析ơ数.执行ơ数,CPU使用旉{?q些数据可以用来优化你的系l?


讄SQL TRACE在会(x)话? 有效


ALTER SESSION SET SQL_TRACE TRUE


讄SQL TRACE 在整个数据库有效? 你必dSQL_TRACE参数在init.ora中设为TRUE, USER_DUMP_DEST参数说明了生成跟t文件的目录


(译者按: q一节中,作者ƈ没有提到TKPROF的用? 对SQL TRACE的用法也不够准确, 讄SQL TRACE首先要在init.ora中设定TIMED_STATISTICS, q样才能得到那些重要的时间状? 生成的trace文g是不可读?所以要用TKPROF工具对其q行转换,TKPROF有许多执行参? 大家可以参考ORACLE手册来了解具体的配置. )



Vincent Chen 2006-02-25 22:31 发表评论
]]>
ORACLE SQL性能优化pd (?)http://www.tkk7.com/Vencent/articles/32448.htmlVincent ChenVincent ChenSat, 25 Feb 2006 14:31:00 GMThttp://www.tkk7.com/Vencent/articles/32448.htmlhttp://www.tkk7.com/Vencent/comments/32448.htmlhttp://www.tkk7.com/Vencent/articles/32448.html#Feedback0http://www.tkk7.com/Vencent/comments/commentRss/32448.htmlhttp://www.tkk7.com/Vencent/services/trackbacks/32448.html
ORACLE SQL性能优化pd (?)

作? black_snail

 

24. 用EXPLAIN PLAN 分析SQL语句


EXPLAIN PLAN 是一个很好的分析SQL语句的工?它甚臛_以在不执行SQL的情况下分析语句. 通过分析,我们可以知道ORACLE是怎么栯接表,使用什么方式扫描表(索引扫描或全表扫?以及(qing)使用到的索引名称.

你需要按照从里到?从上C的次序解d析的l果. EXPLAIN PLAN分析的结果是用羃q的格式排列? 最内部的操作将被最先解? 如果两个操作处于同一层中,带有最操作号的将被首先执?

NESTED LOOP是少C按照上述规则处理的操? 正确的执行\径是(g)查对NESTED LOOP提供数据的操?其中操作h的被最先处?


译者按:

通过实践, 感到q是用SQLPLUS中的SET TRACE 功能比较方便.

举例:


SQL> list

1 SELECT *

2 FROM dept, emp

3* WHERE emp.deptno = dept.deptno

SQL> set autotrace traceonly /*traceonly 可以不显C执行结?/

SQL> /

14 rows selected.

Execution Plan

----------------------------------------------------------

0 SELECT STATEMENT Optimizer=CHOOSE

1 0 NESTED LOOPS

2 1 TABLE ACCESS (FULL) OF 'EMP'

3 1 TABLE ACCESS (BY INDEX ROWID) OF 'DEPT'

4 3 INDEX (UNIQUE SCAN) OF 'PK_DEPT' (UNIQUE)


Statistics

----------------------------------------------------------

0 recursive calls

2 db block gets

30 consistent gets

0 physical reads

0 redo size

2598 bytes sent via SQL*Net to client

503 bytes received via SQL*Net from client

2 SQL*Net roundtrips to/from client

0 sorts (memory)

0 sorts (disk)

14 rows processed


通过以上分析,可以得出实际的执行步骤是:

1. TABLE ACCESS (FULL) OF 'EMP'

2. INDEX (UNIQUE SCAN) OF 'PK_DEPT' (UNIQUE)

3. TABLE ACCESS (BY INDEX ROWID) OF 'DEPT'

4. NESTED LOOPS (JOINING 1 AND 3)



? 目前许多W三方的工具如TOAD和ORACLE本n提供的工具如OMS的SQL Analyze都提供了极其方便的EXPLAIN PLAN工具.也许喜欢囑Ş化界面的朋友们可以选用它们.



Vincent Chen 2006-02-25 22:31 发表评论
]]>
ORACLE SQL性能优化pd (?http://www.tkk7.com/Vencent/articles/32445.htmlVincent ChenVincent ChenSat, 25 Feb 2006 14:30:00 GMThttp://www.tkk7.com/Vencent/articles/32445.htmlhttp://www.tkk7.com/Vencent/comments/32445.htmlhttp://www.tkk7.com/Vencent/articles/32445.html#Feedback0http://www.tkk7.com/Vencent/comments/commentRss/32445.htmlhttp://www.tkk7.com/Vencent/services/trackbacks/32445.html
ORACLE SQL性能优化pd (?

作? black_snail

 

关键?ORACLE SQL PERFORMANCE TUNING

出处 http://WWW.DBASUPPORT.COM



13. 计算记录条数

和一般的观点相反, count(*) 比count(1)E快 , 当然如果可以通过索引(g)?对烦(ch)引列的计C旧是最快的. 例如 COUNT(EMPNO)


(译者按: 在CSDN论坛?曄Ҏ(gu)有过相当热烈的讨? 作者的观点q不十分准确,通过实际的测?上述三种Ҏ(gu)q没有显著的性能差别)


14. 用Where子句替换HAVING子句


避免使用HAVING子句, HAVING 只会(x)在检索出所有记录之后才对结果集q行qo(h). q个处理需要排?总计{操? 如果能通过WHERE子句限制记录的数?那就能减这斚w的开销.


例如:


低效:

SELECT REGIONQAVG(LOG_SIZE)

FROM LOCATION

GROUP BY REGION

HAVING REGION REGION != ‘SYDNEY'

AND REGION != ‘PERTH'


高效

SELECT REGIONQAVG(LOG_SIZE)

FROM LOCATION

WHERE REGION REGION != ‘SYDNEY'

AND REGION != ‘PERTH'

GROUP BY REGION

(译者按: HAVING 中的条g一般用于对一些集合函数的比较,如COUNT() {等. 除此而外,一般的条g应该写在WHERE子句?


15. 减少对表的查?

在含有子查询的SQL语句?要特别注意减对表的查询.


例如:

低效

SELECT TAB_NAME

FROM TABLES

WHERE TAB_NAME = ( SELECT TAB_NAME

FROM TAB_COLUMNS

WHERE VERSION = 604)

AND DB_VER= ( SELECT DB_VER

FROM TAB_COLUMNS

WHERE VERSION = 604)


高效

SELECT TAB_NAME

FROM TABLES

WHERE (TAB_NAME,DB_VER)

= ( SELECT TAB_NAME,DB_VER)

FROM TAB_COLUMNS

WHERE VERSION = 604)


Update 多个Column 例子:

低效:

UPDATE EMP

SET EMP_CAT = (SELECT MAX(CATEGORY) FROM EMP_CATEGORIES),

SAL_RANGE = (SELECT MAX(SAL_RANGE) FROM EMP_CATEGORIES)

WHERE EMP_DEPT = 0020;


高效:

UPDATE EMP

SET (EMP_CAT, SAL_RANGE)

= (SELECT MAX(CATEGORY) , MAX(SAL_RANGE)

FROM EMP_CATEGORIES)

WHERE EMP_DEPT = 0020;



16. 通过内部函数提高SQL效率.


SELECT H.EMPNO,E.ENAME,H.HIST_TYPE,T.TYPE_DESC,COUNT(*)

FROM HISTORY_TYPE T,EMP E,EMP_HISTORY H

WHERE H.EMPNO = E.EMPNO

AND H.HIST_TYPE = T.HIST_TYPE

GROUP BY H.EMPNO,E.ENAME,H.HIST_TYPE,T.TYPE_DESC;


通过调用下面的函数可以提高效?

FUNCTION LOOKUP_HIST_TYPE(TYP IN NUMBER) RETURN VARCHAR2

AS

TDESC VARCHAR2(30);

CURSOR C1 IS

SELECT TYPE_DESC

FROM HISTORY_TYPE

WHERE HIST_TYPE = TYP;

BEGIN

OPEN C1;

FETCH C1 INTO TDESC;

CLOSE C1;

RETURN (NVL(TDESC,'?'));

END;


FUNCTION LOOKUP_EMP(EMP IN NUMBER) RETURN VARCHAR2

AS

ENAME VARCHAR2(30);

CURSOR C1 IS

SELECT ENAME

FROM EMP

WHERE EMPNO=EMP;

BEGIN

OPEN C1;

FETCH C1 INTO ENAME;

CLOSE C1;

RETURN (NVL(ENAME,'?'));

END;


SELECT H.EMPNO,LOOKUP_EMP(H.EMPNO),

H.HIST_TYPE,LOOKUP_HIST_TYPE(H.HIST_TYPE),COUNT(*)

FROM EMP_HISTORY H

GROUP BY H.EMPNO , H.HIST_TYPE;


(译者按: l常在论坛中看到?'能不能用一个SQL写出?' 的脓(chung)? D不知复杂的SQL往往牺牲了执行效? 能够掌握上面的运用函数解决问题的Ҏ(gu)在实际工作中是非常有意义?



Vincent Chen 2006-02-25 22:30 发表评论
]]>
ORACLE SQL性能优化pd (?http://www.tkk7.com/Vencent/articles/32446.htmlVincent ChenVincent ChenSat, 25 Feb 2006 14:30:00 GMThttp://www.tkk7.com/Vencent/articles/32446.htmlhttp://www.tkk7.com/Vencent/comments/32446.htmlhttp://www.tkk7.com/Vencent/articles/32446.html#Feedback0http://www.tkk7.com/Vencent/comments/commentRss/32446.htmlhttp://www.tkk7.com/Vencent/services/trackbacks/32446.html
ORACLE SQL性能优化pd (?

作? black_snail

 

关键?ORACLE PERFORMANCE SQL TUNING

出处 http://WWW.DBASUPPORT.COM



17. 使用表的别名(Alias)

当在SQL语句中连接多个表? 请用表的别名ƈ把别名前~于每个Column?q样一?可以减解析的旉q减那些由Column歧义引v的语法错?


(译者注: Column歧义指的是由于SQL中不同的表具有相同的Column?当SQL语句中出现这个Column?SQL解析器无法判断这个Column的归?


18. 用EXISTS替代IN

在许多基于基表的查询?Z满一个条?往往需要对另一个表q行联接.在这U情况下, 使用EXISTS(或NOT EXISTS)通常提高查询的效率.


低效:

SELECT *

FROM EMP (基础?

WHERE EMPNO > 0

AND DEPTNO IN (SELECT DEPTNO

FROM DEPT

WHERE LOC = ‘MELB')


高效:

SELECT *

FROM EMP (基础?

WHERE EMPNO > 0

AND EXISTS (SELECT ‘X'

FROM DEPT

WHERE DEPT.DEPTNO = EMP.DEPTNO

AND LOC = ‘MELB')


(译者按: 相对来说,用NOT EXISTS替换NOT IN 更显著地提高效?下一节中指?



19. 用NOT EXISTS替代NOT IN

在子查询?NOT IN子句执行一个内部的排序和合q? 无论在哪U情况下,NOT IN都是最低效?(因ؓ(f)它对子查询中的表执行了一个全表遍?. Z避免使用NOT IN ,我们可以把它改写成外q接(Outer Joins)或NOT EXISTS.


例如:

SELECT ?

FROM EMP

WHERE DEPT_NO NOT IN (SELECT DEPT_NO

FROM DEPT

WHERE DEPT_CAT='A');


Z提高效率.改写?


(Ҏ(gu)一: 高效)

SELECT ?

FROM EMP A,DEPT B

WHERE A.DEPT_NO = B.DEPT(+)

AND B.DEPT_NO IS NULL

AND B.DEPT_CAT(+) = ‘A'



(Ҏ(gu)? 最高效)

SELECT ?

FROM EMP E

WHERE NOT EXISTS (SELECT ‘X'

FROM DEPT D

WHERE D.DEPT_NO = E.DEPT_NO

AND DEPT_CAT = ‘A');



Vincent Chen 2006-02-25 22:30 发表评论
]]>
ORACLE SQL性能优化pd (?http://www.tkk7.com/Vencent/articles/32444.htmlVincent ChenVincent ChenSat, 25 Feb 2006 14:29:00 GMThttp://www.tkk7.com/Vencent/articles/32444.htmlhttp://www.tkk7.com/Vencent/comments/32444.htmlhttp://www.tkk7.com/Vencent/articles/32444.html#Feedback0http://www.tkk7.com/Vencent/comments/commentRss/32444.htmlhttp://www.tkk7.com/Vencent/services/trackbacks/32444.html
ORACLE SQL性能优化pd (?

作? black_snail

 

关键?ORACLE SQL PERFORMANCE TUNING

出处 http://www.dbasupport.com



8. 使用DECODE函数来减处理时?


使用DECODE函数可以避免重复扫描相同记录或重复连接相同的?


例如:

SELECT COUNT(*)QSUM(SAL)

FROM EMP

WHERE DEPT_NO = 0020

AND ENAME LIKE ‘SMITH%';


SELECT COUNT(*)QSUM(SAL)

FROM EMP

WHERE DEPT_NO = 0030

AND ENAME LIKE ‘SMITH%';


你可以用DECODE函数高效地得到相同结?


SELECT COUNT(DECODE(DEPT_NO,0020,'X',NULL)) D0020_COUNT,

COUNT(DECODE(DEPT_NO,0030,'X',NULL)) D0030_COUNT,

SUM(DECODE(DEPT_NO,0020,SAL,NULL)) D0020_SAL,

SUM(DECODE(DEPT_NO,0030,SAL,NULL)) D0030_SAL

FROM EMP WHERE ENAME LIKE ‘SMITH%';


cM?DECODE函数也可以运用于GROUP BY 和ORDER BY子句?



9. 整合?无关联的数据库访?


如果你有几个单的数据库查询语?你可以把它们整合C个查询中(即它们之间没有关系)

例如:


SELECT NAME

FROM EMP

WHERE EMP_NO = 1234;


SELECT NAME

FROM DPT

WHERE DPT_NO = 10 ;


SELECT NAME

FROM CAT

WHERE CAT_TYPE = ‘RD';


上面?个查询可以被合ƈ成一?


SELECT E.NAME , D.NAME , C.NAME

FROM CAT C , DPT D , EMP E,DUAL X

WHERE NVL(‘X',X.DUMMY) = NVL(‘X',E.ROWID(+))

AND NVL(‘X',X.DUMMY) = NVL(‘X',D.ROWID(+))

AND NVL(‘X',X.DUMMY) = NVL(‘X',C.ROWID(+))

AND E.EMP_NO(+) = 1234

AND D.DEPT_NO(+) = 10

AND C.CAT_TYPE(+) = ‘RD';


(译者按: 虽然采取q种Ҏ(gu),效率得到提高,但是E序的可L大大降?所以读?q是要权衡之间的利弊)


10. 删除重复记录

最高效的删除重复记录方?( 因ؓ(f)使用了ROWID)


DELETE FROM EMP E

WHERE E.ROWID > (SELECT MIN(X.ROWID)

FROM EMP X

WHERE X.EMP_NO = E.EMP_NO);


11. 用TRUNCATE替代DELETE

当删除表中的记录?在通常情况? 回滚D?rollback segments ) 用来存放可以被恢复的信息. 如果你没有COMMIT事务,ORACLE?x)将数据恢复到删除之前的状?准确地说?

恢复到执行删除命令之前的状况)


而当q用TRUNCATE? 回滚D不再存放Q何可被恢复的信息.当命令运行后,数据不能被恢?因此很少的资源被调用,执行旉也会(x)很短.


(译者按: TRUNCATE只在删除全表适用,TRUNCATE是DDL不是DML)



12. 量多用COMMIT


只要有可?在程序中量多用COMMIT, q样E序的性能得到提高,需求也?x)因为COMMIT所释放的资源而减?

COMMIT所释放的资?

a. 回滚D上用于恢复数据的信?

b. 被程序语句获得的?

c. redo log buffer 中的I间

d. ORACLE为管理上q?U资源中的内部花?


(译者按: 在用COMMIT时必要注意C务的完整?现实中效率和事务完整性往往是鱼和熊掌不可得?



对该文的评论 人气Q?369
black_snail (2003-9-7 19:16:56)

如果DECODE取gؓ(f)NULLQSUMQNULLQ的值是NULL -->如果所有的值都是NULL , SUM(NULL) = NULL 但是只要有一个g是NULL,SUM() <> NULL 所以原SQL应该没有什么逻辑上的问题

menlion (2003-9-4 12:38:01)

关于W八点的个h看法Q如果DECODE取gؓ(f)NULLQSUMQNULLQ的值是NULLQ不?x)正常求和的。可以改成如下所C就好了Q? SELECT COUNT(DECODE(DEPT_NO,0020,'X',NULL)) D0020_COUNT, COUNT(DECODE(DEPT_NO,0030,'X',NULL)) D0030_COUNT, SUM(DECODE(DEPT_NO,0020,SAL,0)) D0020_SAL, SUM(DECODE(DEPT_NO,0030,SAL,0)) D0030_SAL FROM EMP WHERE ENAME LIKE ‘SMITH%';



Vincent Chen 2006-02-25 22:29 发表评论
]]>
ORACLE SQL性能优化pd (一)http://www.tkk7.com/Vencent/articles/32442.htmlVincent ChenVincent ChenSat, 25 Feb 2006 14:28:00 GMThttp://www.tkk7.com/Vencent/articles/32442.htmlhttp://www.tkk7.com/Vencent/comments/32442.htmlhttp://www.tkk7.com/Vencent/articles/32442.html#Feedback0http://www.tkk7.com/Vencent/comments/commentRss/32442.htmlhttp://www.tkk7.com/Vencent/services/trackbacks/32442.html
   ORACLE SQL性能优化pd (一)


                                          作? black_snail



关键?ORACEL SQL Performance tuning

出处 http://www.dbasupport.com


1. 选用适合的ORACLE优化?



ORACLE的优化器共有3U?

a. RULE (Z规则) b. COST (Z成本) c. CHOOSE (选择?



讄~省的优化器,可以通过对init.ora文g中OPTIMIZER_MODE参数的各U声?如RULE,COST,CHOOSE,ALL_ROWS,FIRST_ROWS . 你当然也在SQL句或是?x)?session)U对其进行覆?

Z使用Z成本的优化器(CBO, Cost-Based Optimizer) , 你必ȝ常运行analyze 命o(h),以增加数据库中的对象l计信息(object statistics)的准?

如果数据库的优化器模式设|ؓ(f)选择?CHOOSE),那么实际的优化器模式和是否q行qanalyze命o(h)有关. 如果table已经被analyzeq? 优化器模式将自动成ؓ(f)CBO , 反之,数据库将采用RULE形式的优化器.



在缺省情况下,ORACLE采用CHOOSE优化? Z避免那些不必要的全表扫描(full table scan) , 你必d量避免用CHOOSE优化?而直接采用基于规则或者基于成本的优化?



2. 讉KTable的方?



ORACLE 采用两种讉K表中记录的方?



a. 全表扫描

全表扫描是序地访问表中每条记? ORACLE采用一ơ读入多个数据块(database block)的方式优化全表扫?



b. 通过ROWID讉K?

? 可以采用ZROWID的访问方式情?提高讉K表的效率, , ROWID包含了表中记录的物理位置信息..ORACLE采用索引(INDEX)实现了数据和存放数据的物理位|?ROWID)之间的联p? 通常索引提供了快速访问ROWID的方?因此那些Z索引列的查询可以得到性能上的提高.



3. ׃nSQL语句



? 了不重复解析相同的SQL语句,在第一ơ解析之? ORACLESQL语句存放在内存中.q块位于pȝ全局区域SGA(system global area)的共享池(shared buffer pool)中的内存可以被所有的数据库用户共? 因此,当你执行一个SQL语句(有时被称Z个游??如果?

和之前的执行q的语句完全相同, ORACLEp很快获得已经被解析的语句以及(qing)最好的

执行路径. ORACLE的这个功能大大地提高了SQL的执行性能q节省了内存的?

可惜的是ORACLE只对单的表提供高速缓?cache buffering) ,q个功能q不适用于多表连接查?

数据库管理员必须在init.ora中ؓ(f)q个区域讄合适的参数,当这个内存区域越?可以保留更多的语句,当然被共享的可能性也p大了.

当你向ORACLE 提交一个SQL语句,ORACLE?x)首先在q块内存中查扄同的语句.

q里需要注明的?ORACLE对两者采取的是一U严格匹?要达成共?SQL语句必须

完全相同(包括I格,换行{?.

׃n的语句必L三个条?



A. 字符U的比较:

当前被执行的语句和共享池中的语句必须完全相同.

例如:

SELECT * FROM EMP;

和下列每一个都不同

SELECT * from EMP;

Select * From Emp;

SELECT * FROM EMP;





B. 两个语句所指的对象必须完全相同:

例如:

用户 对象?如何讉K

Jack sal_limit private synonym

Work_city public synonym

Plant_detail public synonym



Jill sal_limit private synonym

Work_city public synonym

Plant_detail table owner


考虑一下下列SQL语句能否在这两个用户之间׃n.



SQL
能否׃n
原因

select max(sal_cap) from sal_limit;
不能
每个用户都有一个private synonym - sal_limit , 它们是不同的对象

select count(*0 from work_city where sdesc like 'NEW%';
?
两个用户讉K相同的对象public synonym - work_city

select a.sdesc,b.location from work_city a , plant_detail b where a.city_id = b.city_id
不能
用户jack 通过private synonym讉Kplant_detail 而jill 是表的所有?对象不同.





C. 两个SQL语句中必M用相同的名字的绑定变?bind variables)


例如Q?


W一l的两个SQL语句是相同的(可以׃n),而第二组中的两个语句是不同的(即在运行时,赋于不同的绑定变量相同的?

a.

select pin , name from people where pin = :blk1.pin;

select pin , name from people where pin = :blk1.pin;


b.

select pin , name from people where pin = :blk1.ot_ind;

select pin , name from people where pin = :blk1.ov_ind;


Vincent Chen 2006-02-25 22:28 发表评论
]]>
ORACLE SQL性能优化pd (?http://www.tkk7.com/Vencent/articles/32443.htmlVincent ChenVincent ChenSat, 25 Feb 2006 14:28:00 GMThttp://www.tkk7.com/Vencent/articles/32443.htmlhttp://www.tkk7.com/Vencent/comments/32443.htmlhttp://www.tkk7.com/Vencent/articles/32443.html#Feedback0http://www.tkk7.com/Vencent/comments/commentRss/32443.htmlhttp://www.tkk7.com/Vencent/services/trackbacks/32443.html
ORACLE SQL性能优化pd (?

作? black_snail

 

关键?ORACLE SQL PERFORMANCE TUNING

出处 www.dbasupport.com



4. 选择最有效率的表名序(只在Z规则的优化器中有?


ORACLE的解析器按照从右到左的顺序处理FROM子句中的表名,因此FROM子句中写在最后的?基础?driving table)被最先处? 在FROM子句中包含多个表的情况下,你必选择记录条数最的表作为基?当ORACLE处理多个表时, ?x)运用排序?qing)合ƈ的方式连接它?首先,扫描W一个表(FROM子句中最后的那个?q对记录q行zֺ,然后扫描W二个表(FROM子句中最后第二个 ?,最后将所有从W二个表中检索出的记录与W一个表中合适记录进行合q?


例如:

?TAB1 16,384 条记?

?TAB2 1 条记?


选择TAB2作ؓ(f)基础?(最好的Ҏ(gu))

select count(*) from tab1,tab2 执行旉0.96U?


选择TAB2作ؓ(f)基础?(不佳的方?

select count(*) from tab2,tab1 执行旉26.09U?


如果?个以上的表连接查? 那就需要选择交叉?intersection table)作ؓ(f)基础? 交叉表是指那个被其他表所引用的表.


例如:

EMP表描qCLOCATION表和CATEGORY表的交集.

SELECT *

FROM LOCATION L ,

CATEGORY C,

EMP E

WHERE E.EMP_NO BETWEEN 1000 AND 2000

AND E.CAT_NO = C.CAT_NO

AND E.LOCN = L.LOCN


比下列SQL更有效率


SELECT *

FROM EMP E ,

LOCATION L ,

CATEGORY C

WHERE E.CAT_NO = C.CAT_NO

AND E.LOCN = L.LOCN

AND E.EMP_NO BETWEEN 1000 AND 2000



5. WHERE子句中的q接序Q?


ORACLE采用自下而上的顺序解析WHERE子句,Ҏ(gu)q个原理,表之间的q接必须写在其他WHERE条g之前, 那些可以qo(h)掉最大数量记录的条g必须写在WHERE子句的末?


例如:

(低效,执行旉156.3U?

SELECT ?

FROM EMP E

WHERE SAL > 50000

AND JOB = ‘MANAGER'

AND 25 < (SELECT COUNT(*) FROM EMP

WHERE MGR=E.EMPNO);


(高效,执行旉10.6U?

SELECT ?

FROM EMP E

WHERE 25 < (SELECT COUNT(*) FROM EMP

WHERE MGR=E.EMPNO)

AND SAL > 50000

AND JOB = ‘MANAGER';



6. SELECT子句中避免??* ?

当你惛_SELECT子句中列出所有的COLUMN?使用动态SQL列引??' 是一个方便的Ҏ(gu).不幸的是,q是一个非怽效的Ҏ(gu). 实际?ORACLE在解析的q程? ?x)?*' 依次转换成所有的列名, q个工作是通过查询数据字典完成? q意味着耗费更多的时?



7. 减少讉K数据库的ơ数

当执行每条SQL语句? ORACLE在内部执行了许多工作: 解析SQL语句, 估算索引的利用率, l定变量 , L据块{等. 由此可见, 减少讉K数据库的ơ数 , p实际上减ORACLE的工作量.


例如,

以下有三U方法可以检索出雇员L(fng)?342?291的职?


Ҏ(gu)1 (最低效)

SELECT EMP_NAME , SALARY , GRADE

FROM EMP

WHERE EMP_NO = 342;


SELECT EMP_NAME , SALARY , GRADE

FROM EMP

WHERE EMP_NO = 291;


Ҏ(gu)2 (ơ低?

DECLARE

CURSOR C1 (E_NO NUMBER) IS

SELECT EMP_NAME,SALARY,GRADE

FROM EMP

WHERE EMP_NO = E_NO;

BEGIN

OPEN C1(342);

FETCH C1 INTO ?..,.. ;

?.

OPEN C1(291);

FETCH C1 INTO ?..,.. ;

CLOSE C1;

END;


Ҏ(gu)3 (高效)

SELECT A.EMP_NAME , A.SALARY , A.GRADE,

B.EMP_NAME , B.SALARY , B.GRADE

FROM EMP A,EMP B

WHERE A.EMP_NO = 342

AND B.EMP_NO = 291;


注意:

在SQL*Plus , SQL*Forms和Pro*C中重新设|ARRAYSIZE参数, 可以增加每次数据库访问的(g)索数据量 ,gؓ(f)200



Vincent Chen 2006-02-25 22:28 发表评论
]]>
exp/imp导出导入工具的?(?http://www.tkk7.com/Vencent/articles/31944.htmlVincent ChenVincent ChenWed, 22 Feb 2006 05:04:00 GMThttp://www.tkk7.com/Vencent/articles/31944.htmlhttp://www.tkk7.com/Vencent/comments/31944.htmlhttp://www.tkk7.com/Vencent/articles/31944.html#Feedback0http://www.tkk7.com/Vencent/comments/commentRss/31944.htmlhttp://www.tkk7.com/Vencent/services/trackbacks/31944.html一. 导出工具 exp

1. 它是操作pȝ下一个可执行的文?存放目录/ORACLE_HOME/bin

exp导出工具数据库中数据备份压~成一个二q制pȝ文g.可以在不同OS间迁U?br>
它有三种模式Q?br> a. 用户模式Q?导出用户所有对象以?qing)对象中的数据?br> b. 表模式:(x) 导出用户所有表或者指定的表;
c. 整个数据库:(x) 导出数据库中所有对象?br>
2. 导出工具exp交互式命令行方式的用的例子

$exp test/test123@appdb
Enter array fetch buffer size: 4096 > 回R
Export file: expdat.dmp > m.dmp 生成导出的文件名
(1)E(ntire database), (2)U(sers), or (3)T(ables): (2)U > 3
Export table data (yes/no): yes > 回R
Compress extents (yes/no): yes > 回R
Export done in ZHS16GBK character set and ZHS16GBK NCHAR character set
About to export specified tables via Conventional Path ...
Table(T) or Partition(T:P) to be exported: (RETURN to quit) > cmamenu 要导出的表名
. . exporting table CMAMENU 4336 rows exported
Table(T) or Partition(T:P) to be exported: (RETURN to quit) >要导出的表名n
Table(T) or Partition(T:P) to be exported: (RETURN to quit) > 回R
Export terminated successfully without warnings.

3. 导出工具exp非交互式命o(h)行方式的例子

$exp scott/tiger tables=(emp,dept) file=/directory/scott.dmp grants=y

说明:把scott用户里两个表emp,dept导出到文?directory/scott.dmp

$exp scott/tiger tables=emp query=\"where job=\'salesman\' and sal\<1600\" file=/directory/scott2.dmp

说明:在exp里面加上导出emp的查询条件job='salesman' and sal<1600

(但我个h很少q样?q是把满x件的记录生成临时表后,再exp?x)方便一?

$exp parfile=username.par file=/directory1/username_1.dmp,/directory1/username_2.dmp filesize=2000M log=/directory2/username_exp.log

参数文gusername.par内容
userid=username/userpassword
buffer=8192000
compress=n
grants=y

说明:username.par为导出工具exp用的参数文g,里面具体参数可以Ҏ(gu)需要去修改

filesize指定生成的二q制备䆾文g的最大字节数

(可用来解x些OS?G物理文g的限制及(qing)加快压羃速度和方便刻历史数据光盘{?

?导入工具 imp

1. 它是操作pȝ下一个可执行的文?存放目录/ORACLE_HOME/bin

imp导入工具EXP形成的二q制pȝ文g导入到数据库?

它有三种模式Q?br> a. 用户模式Q?导出用户所有对象以?qing)对象中的数据?br> b. 表模式:(x) 导出用户所有表或者指定的表;
c. 整个数据库:(x) 导出数据库中所有对象?br>
只有拥有IMP_FULL_DATABASE和DBA权限的用h能做整个数据库导?br>
imp步骤Q?br> (1) create table (2) insert data (3) create index (4) create triggers,constraints

2.导入工具imp交互式命令行方式的例?br>$ imp
Import: Release 8.1.6.0.0 - Production on 星期?12?7 17:01:08 2001
(c) Copyright 1999 Oracle Corporation. All rights reserved.
用户? test
口o(h):****
q接? Oracle8i Enterprise Edition Release 8.1.6.0.0 - 64bit Production
With the Partitioning option
JServer Release 8.1.6.0.0 - Production
导入文g: expdat.dmp> /tmp/m.dmp
输入插入~冲区大(最ؓ(f) 8192 ) 30720>
l由常规路径导出由EXPORT:V08.01.06创徏的文?br>警告: 此对象由 TEST 导出, 而不是当前用?br>已经完成ZHS16GBK字符集和ZHS16GBK NCHAR 字符集中的导?br>只列出导入文件的内容(yes/no)Qno>
׃对象已存? 忽略创徏错误(yes/no)Qno> yes
导入权限(yes/no)Qyes>
导入表数?yes/no)Qyes>
导入整个导出文g(yes/no)Qno> yes
. 正在TEST的对象导入到 SCOTT
. . 正在导入? "CMAMENU" 4336行被导入
成功l止导入Q但出现警告?


3.导入工具imp非交互式命o(h)行方式的例子

$ imp system/manager fromuser=jones tables=(accts)
$ imp system/manager fromuser=scott tables=(emp,dept)
$ imp system/manager fromuser=scott touser=joe tables=emp
$ imp scott/tiger file = expdat.dmp full=y
$ imp scott/tiger file = /mnt1/t1.dmp show=n buffer=2048000 ignore=n commit=y grants=y full=y log=/oracle_backup/log/imp_scott.log
$ imp system/manager parfile=params.dat
params.dat 内容
file=dba.dmp show=n ignore=n grants=y fromuser=scott tables=(dept,emp)

4.导入工具imp可能出现的问?br>
(1) 数据库对象已l存?br> 一般情? 导入数据前应该彻底删除目标数据下的表, 序列, 函数/q程,触发器等;
数据库对象已l存? 按缺省的imp参数, 则会(x)导入p|
如果用了参数ignore=y, ?x)把exp文g内的数据内容导入
如果表有唯一关键字的U束条g, 不合条g不被导?br> 如果表没有唯一关键字的U束条g, 引赯录重?br>
(2) 数据库对象有d键约?br> 不符合主外键U束? 数据?x)导入失?
解决办法: 先导入主? 再导入依存表
disable目标导入对象的主外键U束, 导入数据? 再enable它们
(3) 权限不够
如果要把A用户的数据导入B用户? A用户需要有imp_full_database权限

(4) 导入大表( 大于80M ) ? 存储分配p|
默认的EXP? compress = Y, 也就是把所有的数据压羃在一个数据块?
导入? 如果不存在连l一个大数据? 则会(x)导入p|.
导出80M以上的大表时, 记得compress= N, 则不?x)引赯U错?

(5) imp和exp使用的字W集不同
如果字符集不? 导入?x)失? 可以改变unix环境变量或者NT注册表里NLS_LANG相关信息.
导入完成后再改回?

(6) imp和exp版本不能往上兼?br> imp可以成功导入低版本exp生成的文? 不能导入高版本exp生成的文?br> Ҏ(gu)情况我们可以?br> $ imp username/password@connect_string
说明: connect_string 是在/ORACLE_HOME/network/admin/tnsnames.ora
定义的本地或者远端数据库的名U?br> 注意事项:
UNIX: /etc/hosts 要定义本地或者远端数据库服务器的L?br> win98: windows\hosts 和IP地址的对应关p?

win2000: winnt\system32\drivers\etc\hosts

Vincent Chen 2006-02-22 13:04 发表评论
]]>
oracle update多表兌http://www.tkk7.com/Vencent/articles/31943.htmlVincent ChenVincent ChenWed, 22 Feb 2006 05:03:00 GMThttp://www.tkk7.com/Vencent/articles/31943.htmlhttp://www.tkk7.com/Vencent/comments/31943.htmlhttp://www.tkk7.com/Vencent/articles/31943.html#Feedback0http://www.tkk7.com/Vencent/comments/commentRss/31943.htmlhttp://www.tkk7.com/Vencent/services/trackbacks/31943.htmlUPDATE A.A3 = A.A3+B.B3 的问?br>
表A l构 : A1 , A2 ,A3
表B l构: B1,  B2,  B3
其中 A1 ,B1 为PK ,切值相?是可以使用A1 = B1 ?

请问用SQL 语句或过E该如何实现如下的功???

更新A 表的 A3 ,用A.A3 与B.B3之和更新.

3>update A
set A3 = (select A.A3 + B.B3 from B where A.A1 = B.B1) ;

7>update (select a1,a3,b1,b3 from a,b where a1=b1) set a3=a3+b3

开执行计划, 谈论效率是没有太多的意义的^_^..


三楼的写法与7楼的写法得到的结果是不同?

三楼的写法会(x)更新所有记? ?楼的写法只修改两者相交的相关记录信息.

7楼的写法可以更加Ҏ(gu)的控制这条update语句的执行计? 不过要求B表必d对应的字D上有主键烦(ch)?) , 在B表在对应字段上有主键索引的时? 使用7楼的写法.

可以参考一下这个帖子^_^

http://www.cnoug.org/viewthread.php?tid=44070
(试没有成功..不知道怎么搞的.)
参考了下面?
非常佩服。抱着学习(fn)的态度Q重写了一下三楼的Q在没有主键的情况,h教:(x)
update a
set a3=(select a3+b3 from b where a1=b1)
where a1=(select b1 from b where a1=b1)
如下:
update con_eme_on20050309 a set a.con_price=(select a.con_price+(b.annuity-a.annuity)+(b.nojob-a.nojob)
+(b.medicare-a.medicare)+(b.birthfee-a.birthfee)+(b.bruisefee-a.bruisefee) from con_eme_on200404 b
where a.emp_cod=b.emp_cod and a.if_act='1' and a.emp_base!=b.emp_base),
a.emp_base=(select b.emp_base from con_eme_on200404 b where a.emp_cod=b.emp_cod and a.if_act='1' and a.emp_base!=b.emp_base),
a.annuity=(select b.annuity from con_eme_on200404 b where a.emp_cod=b.emp_cod and a.if_act='1' and a.emp_base!=b.emp_base),
a.nojob=(select b.nojob from con_eme_on200404 bwhere a.emp_cod=b.emp_cod and a.if_act='1' and a.emp_base!=b.emp_base),
a.medicare=(select b.medicare from con_eme_on200404 b where a.emp_cod=b.emp_cod and a.if_act='1' and a.emp_base!=b.emp_base),
a.birthfee=(select b.birthfee from con_eme_on200404 b where a.emp_cod=b.emp_cod and a.if_act='1' and a.emp_base!=b.emp_base),
a.bruisefee=(select b.bruisefee from con_eme_on200404 b where a.emp_cod=b.emp_cod and a.if_act='1' and a.emp_base!=b.emp_base),
a.nojobbase=(select b.nojobbase from con_eme_on200404 b where a.emp_cod=b.emp_cod and a.if_act='1' and a.emp_base!=b.emp_base),
a.mediabase=(select b.mediabase from con_eme_on200404 b where a.emp_cod=b.emp_cod and a.if_act='1' and a.emp_base!=b.emp_base),
a.birthbase=(select b.birthbase from con_eme_on200404 b where a.emp_cod=b.emp_cod and a.if_act='1' and a.emp_base!=b.emp_base),
a.bruisebase=(select b.bruisebase from con_eme_on200404 b where a.emp_cod=b.emp_cod and a.if_act='1' and a.emp_base!=b.emp_base)where a.emp_cod in(select b.emp_cod from con_eme_on200404 b
where a.emp_cod=b.emp_cod and a.if_act='1' and a.emp_base!=b.emp_base)
公积?
update con_eme_on20050309 a set a.con_price=(select a.con_price+(b.accumulation-a.accumulation) from con_eme_on200404 b
where a.emp_cod=b.emp_cod and a.if_act='1' and a.emp_base!=b.emp_base),a.accumulation=(select b.accumulation from con_eme_on200404 b where a.emp_cod=b.emp_cod and a.if_act='1' and a.emp_base!=b.emp_base),
a.accumulationbase=(select b.accumulationbase from con_eme_on200404 b where a.emp_cod=b.emp_cod and a.if_act='1' and a.emp_base!=b.emp_base),a.accumulationbase1=(select b.accumulationbase1 from con_eme_on200404 b
where a.emp_cod=b.emp_cod and a.if_act='1' and a.emp_base!=b.emp_base)
where a.emp_cod in(select b.emp_cod from con_eme_on200404 b where a.emp_cod=b.emp_cod and a.if_act='1' and a.emp_base!=b.emp_base)


Vincent Chen 2006-02-22 13:03 发表评论
]]>
改变数据库字W集的方?/title><link>http://www.tkk7.com/Vencent/articles/31336.html</link><dc:creator>Vincent Chen</dc:creator><author>Vincent Chen</author><pubDate>Sat, 18 Feb 2006 04:43:00 GMT</pubDate><guid>http://www.tkk7.com/Vencent/articles/31336.html</guid><wfw:comment>http://www.tkk7.com/Vencent/comments/31336.html</wfw:comment><comments>http://www.tkk7.com/Vencent/articles/31336.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.tkk7.com/Vencent/comments/commentRss/31336.html</wfw:commentRss><trackback:ping>http://www.tkk7.com/Vencent/services/trackbacks/31336.html</trackback:ping><description><![CDATA[oracle 数据库具有国际化的支持能? 主要通过字符集等 NLS(National Language Support)  参数讄来实现对不同国家语言环境的支持。其中数据库的字W集是在数据库创建的阶段, ?create database 语句中指定的Q数据库一l徏立,字符集就没法改变了,除非重徏。我们最常用的字W集讄通常?zhs16cgb231280(国标2312字库) ? ZHS16GBK(Ҏ(gu) GBK 字库)。GBK是在GB2312-80标准基础上的内码扩展规范Q用了双字节编码方案,其编码范围从8140至FEFEQ剔除xx7FQ,?3940 个码位,共收录了21003个汉字,完全兼容国标GB2312-80标准(只实C6763个汉??<br><br>在项目开发和l护q程中我们经怼(x)遇见下面的情? 使用 ZHS16CGB231280 字符集的oracle pȝ中,姓名中出现的很多疑难汉字无法正常昄Q显CZؓ(f) ??Q?br><br>    遇见q种情况以往最常见的处理方法是导出数据(exp), ?ZHS16GBK 字符集重建数据库Q最后再导入(imp)数据。但q个q程对于一个大型数据库来说很O长和痛苦。这里给大家介绍一个比较快速简单的Ҏ(gu)Q几分钟p实现? W集转换。这里以 oracle9iZ(8i中的操作略有不同)?br><br>1.        作ؓ(f) oracle 用户d数据库服务器<br><br>2.        停止监听E序<br>                   $lsnrctl stop<br>                   ?br>                   $lsnrctl stop  listener名称<br><br>3.        作ؓ(f) sysdba d数据? q检查目前的数据库字W集讄<br>                   sqlplus /nolog<br>                   connect /as sysdba<br>                   select value$ from props$ where name ='NLS_CHARACTERSET';<br><br>如果上述查询l果?ZHS16CGB231280, 则进行如下操?<br><br>4.        保存下列数据库配|参数的原始讄<br>             show parameter job_queue_processes<br>             show parameter aq_tm_processes<br><br>5.        关闭数据库服?重新启动后修Ҏ(gu)据库字符? q关闭数据库<br>              shutdown immediate<br>              startup mount<br>              alter system enable restricted session;<br>              alter database open;<br>              alter system set job_queue_processes = 0;<br>              alter system set aq_tm_processes = 0;<br>              alter database character set internal_use zhs16gbk;<br>              shutdown immediate<br><br>6.        重新启动数据库服?恢复 job_queue_processes讄<br>             startup<br>             alter system set job_queue_processes=原始讄;<br>             alter system set aq_tm_processes=原始讄;<br>             exit<br><br>7.        启动监听E序<br>             $lsnrctl start<br>             ?br>             $lsnrctl start  listener名称<br><br>8.        修改客户?NLS_LANG 讄<br>             windows 客户端在注册表中修改 NLS_LANG 参数:<br>             nls_lang=”American_america.zhs16gbk?br><br>    注意Q这里要指出的是, 字符集间的{换可能会(x)造成数据库信息破坏,如把 ZHS16GBK 的oracle 数据库{换ؓ(f) zhs16cgb231280, 其中的疑难汉字就?x)变成同L(fng)??, 有时甚至造成主键重复z违反唯一索引{问题。可能很有人知? Oracle 其实提供了一个应用程?csscan, 可以用来(g)字W集转换后数据库的内Ҏ(gu)否会(x)被破坏。要使用 csscan E序必须先以 sysdba 的n份执?$ORACLE_HOME/rdbms/admin 目录下的 csminst.sql。csscan help=y 可以得到关于 csscan 命o(h)使用Ҏ(gu)的帮助?img src ="http://www.tkk7.com/Vencent/aggbug/31336.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.tkk7.com/Vencent/" target="_blank">Vincent Chen</a> 2006-02-18 12:43 <a href="http://www.tkk7.com/Vencent/articles/31336.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>oracle数据库移植时字符集问题的解决http://www.tkk7.com/Vencent/articles/31335.htmlVincent ChenVincent ChenSat, 18 Feb 2006 04:42:00 GMThttp://www.tkk7.com/Vencent/articles/31335.htmlhttp://www.tkk7.com/Vencent/comments/31335.htmlhttp://www.tkk7.com/Vencent/articles/31335.html#Feedback0http://www.tkk7.com/Vencent/comments/commentRss/31335.htmlhttp://www.tkk7.com/Vencent/services/trackbacks/31335.html 

对于oracle数据库之间的UL采用oracle的导入导出工?import/export)是一个比较好? {略。虽也可以利用第三方软g如sybase 的power designer中的reverse engineering q行数据库结构重建,然后在进行较复杂的数据导入过E,但对于作业队列、快照等则不得不用手工来创徏。而export能将整个数据库、指定用戗指定表? 相关的数据字典进行输出,export输出的输{存二q制文g包括了完全重建所有被选对象所需的命令?

本h在ؓ(f)某电(sh)厂mis(oracle数据?数据采用oracle的导入导出工具从windows ntq_UL到digital unixq_旉到的关于字符集的问题和ȝ出的l验与大家来分n?

1. UL环境
原操作系l^収ͼ(x) windows nt
数据库:(x) oracle 8.0.5 for windows nt
服务器:(x)hp netserver lh3
目标操作pȝq_Qdigital unix alpha v4.0
数据库:(x)oracle 8.0.4 for digital unix
服务器:(x)alphaserver es40 型?

2. 数据导出
在nt服务器上用oracle导出工具q行数据导出,oracle导出工具有命令行和图形界面两U方式?
本h直接用命令行方式q行数据导出Q?
c:> exp80 gxmisdba/manager file=c:expdat.dmp log=c:export.log
卛_导出指定的用?..
. 正在导出用户gxmisdba的外部函数程序库名称
. 正在导出用户gxmisdba的对象类型定?
卛_导出gxmisdba的对?...
. 正在导出数据库链?
. 正在导出序号
. 正在导出集定义
. 卛_导出gxmisdba的表通过常规路径 ...
. . 正在导出?    aaaaa          0 行被导出
. . 正在导出? evt_carrier_configuration   0 行被导出
. . 正在导出?   tbl_aj_agks       331 行被导出
  .
  .
  .
. 正在导出同义?
. 正在导出视图
. 正在导出存储的过E?
. 正在导出参考资料一致性约束条?
. 正在导出触发?
. 正在导出后期表活?
. 正在导出快照
. 正在导出快照日志
. 正在导出作业队列
. 正在导出hl和子组
在没有警告的情况下成功终止导出?

3.数据导入
在nt服务器上通过ftp命o(h)导出的输出转存二进制文件expdat.dmp(使用binary传输模式)传输至digital unix服务器上?
用oracle for digital unix 数据导入工具命o(h)行方式进行数据导?
$imp gxmisdba/manager file=/expdat.dmp full=y log=u01import.log
connected to: oracle8 enterprise edition release 8.0.4.0.0 - production
pl/sql release 8.0.4.0.0 - production
export file created by export:v08.00.05 via conventional path
. importing gxmisdbas objects into gxmisdba
. . importing table   "aaaaa"            0 rows imported
. . importing table  "evt_carrier_configuration"   0 rows imported
. . importing table   "tbl_aj_stk"         331 rows imported
imp-00017: following statement failed with oracle error 2437:
"alter table "tbl_kj_jlry" add constraint "pk_tbl_kj_jlry" primary key ("fld_kj_jlry_bh","fld_kj_jlry_xm") using index pctfree 10 initrans 2 maxtrans 255 storage (initial 10240 next 10240 minextents 1 maxextents 2147483645 pctincrease 50 freelists 1 freelist groups 1 buffer_pool default)"
"      enable novalidate"
imp-00003: oracle error 2437 encountered
ora-02437: cannot enable (gxmisdba.pk_tbl_kj_jlry) - primary key violated
.
.
.
import terminated successfully with warnings.
? 据导入出?0多个以上cM错误Q后分析其中报错?tbl_aj_stk"表,发现"fld_kj_jlry_xm"字段?关键字组成之一)Z文字 W而在digital unix服务器oracle数据库中"fld_kj_jlry_xm"字段值显C的?????"(在客L(fng)用oracle sql plus查看)Q从而造成关键字冲H?
在客L(fng)oracle sql plusҎ(gu)行显C?????"的字DD行修改,如改成中文值”测试?提交后,用sql语句查看Q刚修改的行中显C?????"的字D值变成了”测 试”,q说明了digital unin服务器上的oracle数据集可以存储中文字W,但oracle 8.0.4 for digital unin的导入工具imp未能oracle 8.0.5 for windows nt imp80导出的中文数据进行{换?

4.查看字符集参?
4.1查看oracle 8.0.5 for windows nt props$内容
sql> connect sys/change_on_install
sql> col value$ format a40
sql> select name,value$ from props$;
name              value$
---------------------------------------
dict.base            2
nls_language           american
nls_territory          america
nls_currency           $
nls_iso_currency         america
nls_numeric_characters     .,
nls_calendar           gregorian
nls_date_format         dd-mon-yy
nls_date_language        american
nls_characterset         zhs16gbk
nls_sort            binary
nls_nchar_characterset     zhs16gbk
nls_rdbms_version        8.0.5.0.0
global_db_name         oracle.world
export_views_version      7
已选择15行?

4.2查看oracle 8.0.4 for digital unin 的props$内容
sql> connect sys/change_on_install
sql> col value$ format a40
sql> select name,value$ from props$;
name              value$
---------------------------------------
dict.base            2
nls_language           american
nls_territory          america
nls_currency           $
nls_iso_currency         america
nls_numeric_characters      .,
nls_calendar           gregorian
nls_date_format         dd-mon-yy
nls_date_language        american
nls_characterset         zhs16cgb231280
nls_sort             binary
nls_nchar_characterset      zhs16cgb231280
nls_rdbms_version        8.0.4.0.0
global_db_name          orcl.world
export_views_version      7
15 rows selected.
? 现oracle 8.0.4 for digital unin 采用了oracle在digital unix环境下徏议的中文字符集zhs16cgb231280,两者的字符集不同,于是本h在digital unin服务器上重新安装oracleQ选择了与nt上同L(fng)字符集zhs16gbk(中国体汉?6位国标库)。安装完成后Q通过查看props$? 内容Q确认了oracle 8.0.4 for digital unin和oracle 8.0.5 for windows nt的字W集一致。于是用oracle 8.0.4 for digital unin的导入工具imp重新q行数据导入Q但q是报同L(fng)错误Q问题还未得到解冟?

5.问题解决办法
后来本h发现在oracle 8.0.5 for windows nt的服务器(或装有oracle 8.0.5 for windows 95/98的工作站)上直接用oracle 8.0.5 for windows nt的导入工具imp80q程对oracle 8.0.4 for digital unin数据库进行数据导入,问题竟得到解冟?
5.1在nt的服务器上,修改tnsnames.ora(或通过oracle net8 easy config)讄数据库连接字W串gxmis(可自行设?指向oracle 8.0.4 for digital unin服务器?

5.2在nt的服务器上进行数据远E导?
c:>imp80 gxmisdba/manager@gxmis file=c:expdat.dmpfull=y log=c:import.log

已连接到Qoracle8 enterprise edition release 8.0.4.0.0 - production
pl/sql release 8.0.4.0.0 - production
l由常规路径导出由export:v08.00.05创徏的文?
. 正在gxmisdba的对象导入到 gxmisdba
. . 正在导入?"aaaaa" 0行被导入
. . 正在导入?"evt_carrier_configuration" 0行被导入
. . 正在导入?"tbl_aj_agks" 331行被导入
.
.
.
准备启用U束条g...
成功l止导入

5.3把oracle 8.0.4 for digital unin字符集重新又Ҏ(gu)zhs16cgb231280,q行数据q程导入试Q数据也同样地导入成功。说明zhs16cgb231280字符集可以兼容zhs16gbk字符集?

6.l验ȝ
6.1在oracle 8.0.4 for digital unin服务器上(字符集zhs16gbk)?.0.4 for digital unin的导出工具exp已正常(卛_存储和显CZ?的数据库导出?
$ exp gxmisdba/manager file=/u01/expdat.dmp log=/u01/export.log
昄成功导出?
在用oracle 8.0.4 for digital unin的导入工具impq行导入
$imp gxmisdba/manager file=/u01/expdat.dmp full=y log=u01import.log
错误又重现?

6.2在nt服务器上通过ftp命o(h)在oracle 8.0.4 for digital unin服务器上刚导出的输出转存二进制文件expdat.dmp下蝲至nt服务器上Q用imp80q行q程导入?
c:>imp80 gxmisdba/manager@gxmis file=c:expdat.dmp full=y log=c:import.log
已连接到Qoracle8 enterprise edition release 8.0.4.0.0 ?production
pl/sql release 8.0.4.0.0 ?production
imp-00016: 不支持要求的字符集{换(从类??52Q?
imp-00000: 未成功终止导?

6.3在nt服务器上对digital unin服务器上的数据进行远E导?备䆾)
c:>exp80 gxmisdba/manager@gxmis file=c:expdat.dmp log=c:export.log
昄成功导出。再q行q程导入
c:>imp80 gxmisdba/manager@gxmis file=c:expdat.dmp full=y log=c:import.log
昄成功导入。通过客户端oracle sql plus查看中文昄正常?
? 而说明在oracle 8.0.4 for digital unin服务器上对含有中文的数据库的数据UL、备份、数据恢复不要用oracle 8.0.4 for digital unin本n自带的导入导出工具imp,expQ应使用能进行中文导入导出的工具Q如imp80,exp80?



Vincent Chen 2006-02-18 12:42 发表评论
]]>
Oracle 9.2.0.4 ?Redhat AS3 上安装全q程http://www.tkk7.com/Vencent/articles/31184.htmlVincent ChenVincent ChenFri, 17 Feb 2006 04:42:00 GMThttp://www.tkk7.com/Vencent/articles/31184.htmlhttp://www.tkk7.com/Vencent/comments/31184.htmlhttp://www.tkk7.com/Vencent/articles/31184.html#Feedback0http://www.tkk7.com/Vencent/comments/commentRss/31184.htmlhttp://www.tkk7.com/Vencent/services/trackbacks/31184.htmlOracle 9.2.0.4 ?Redhat AS3 上安装全q程

折腾??nbsp; ȝ是搞定了 同一版本的Oracle 装在不同版本Redhat?装法都不?真是ȝ(ch) 难怪微软称怸? 他的产品毕竟好装又好用上|看了别人的装配l历若干 但即使是同一版本的Redhat 每h的配|又都不一?装法也有差别 Linux的可配置性太高这点不象windows 每个人的windows都差不多 微Y没留太多的配|余地给用户 好了说正l的

基本参数  
操作pȝ: Redhat Enterprise Linux as3  默认配置外加所有开发Y件包 内存臛_512? swap分区讄为内存的二倍。不要采用DHCP讄L名和IP地址Q而是“手工设|”。否则会(x)在安装oracle的时候出现如下错误:(x)Thrown when the IP address of a host cannot be determined 

Oracle: 9.2.0.4  Q注意不?.2.0.1 q个版本安装后要打补丁升U到 9.2.0.4Q?/p>

所需的Y?br>Oracle: 9.2.0.4 安装文g
ship_9204_linux_disk1.cpio.gz
ship_9204_linux_disk2.cpio.gz
ship_9204_linux_disk3.cpio.gz

从网上下载升U补丁包, 
所有的补丁说明如下Q?nbsp; 
p3006854_9204_LINUX.zip 在运?runInstaller 之前?
p2617419_210_GENERIC.zip 打其他补丁所需要的工具. 
p3119415_9204_LINUX.zip 在升U到9.2.0.4.0之后? 
p3238244_9204_LINUX.zip 用来修a(chn)gent服务不能启动的错?/p>

安装需要在2个帐户下q行 分别?root ?oracle帐户 理员帐戯责基设施创徏 oracle帐户则负责Oracle软g的安?帐户切换可用 su
每步安装操作一定要看清楚在那个帐户q行  注意我下面的帐户提示

现在开?/p>

1Q先以rootd  在root帐户下进行下面操?/p>

首先准备安装需要的软g包和补丁?先看安装所需要的软g包是否都装了
a  (g)察开发Y件包 用下面的命o(h)
rpm -q gcc cpp compat-libstdc++ glibc-devel glibc-headers glibc-kernheaders binutils

b  (g)察安装依赖Y件包 查看pȝ中是否安有以下几个Y件包
compat-libstdc++-7.3-2.96.122 
compat-gcc-c++-7.3-2.96.122 
compat-libstdc++-devel-7.3-2.96.122 
compat-db-4.0.14-5 
compat-gcc-7.3-2.96.122 
setarch-1.3-1.i386.rpm
tcl-8.3.5-92.i386.rpm
nss_db-compat-2.2-20.i386.rpm 

如果q没?它们都在W?和第3张盘?把它们都装上 保险的做法是把他们都拷到你当前目录下用下面的命o(h)
装过的它?x)自动蟩q?br>rpm -ivh \
compat-db-4.0.14-5.i386.rpm \
compat-gcc-7.3-2.96.122.i386.rpm \
compat-gcc-c++-7.3-2.96.122.i386.rpm \
compat-libstdc++-7.3-2.96.122.i386.rpm \
compat-libstdc++-devel-7.3-2.96.122.i386.rpm \
openmotif21-2.1.30-8.i386.rpm \
setarch-1.3-1.i386.rpm \
tcl-8.3.5-92.i386.rpm\
nss_db-compat-2.2-20.i386.rpm 

注意Q在装Redhat时一定要选上 gnome开发Y件包 否则来配置 Oracle http是会(x)出错 没装的话现在装上q来的及(qing)

2Q还是在root帐户?准备安装q程中需要的用户和用L(fng)  对就是那个oracle帐户
# groupadd oinstall 
# groupadd dba 
# useradd -g oinstall -G dba oracle 
# passwd oracle 

3Q还是在root帐户?准备文g目录Q?nbsp;
# mkdir -p /usr/oracle/product/9.2 
# mkdir /var/opt/oracle 
# chown oracle.dba /var/opt/oracle 
# chown -R oracle.dba /usr/oracle 
# chmod 777 /var/opt/oracle

3Q还是在root帐户?讄内核参数Q调节信L(fng)?qing)共享内存?x) 
# echo 250 32000 100 128 > /proc/sys/kernel/sem 
# echo 1073741824 > /proc/sys/kernel/shmmax 
# echo 4096 > /proc/sys/kernel/shmmni 
# echo 2097152 > /proc/sys/kernel/shmall 
# echo 65536 > /proc/sys/fs/file-max 
# echo 1024 65000 > /proc/sys/net/ipv4/ip_local_port_range 
 
当然Z一开机系l就能自动帮你设好这些参敎ͼ也可改动 /etc/sysctl.conf q个文gQ加入以下的语句Q?nbsp;
kernel.shmmax = 1073741824 
kernel.shmmni = 4096       
kernel.shmall = 2097152 
kernel.sem = 250 32000 100 128 
fs.file-max = 65536 
net.ipv4.ip_local_port_range = 1024 65000 
保存

讄完成后用命o(h) more /etc/sysctl.conf |grep kernel.s (g)?
ShmmaxQ?最大共享内?GB 物理内存如果的话可以设|成 536870912
ShmmniQ?最共享内?4096KBQ?/p>

4Q还是在root帐户?讄oracleҎ(gu)件的要求Q?nbsp;
~辑文gQ?etc/security/limits.conf 加入以下语句Q?nbsp;
oracle    soft    nofile    65536 
oracle    hard    nofile   65536 
oracle    soft    nproc    16384 
oracle    hard    nproc    16384 
保存

 

现在退出root帐户 以oracle帐户登陆
4Q在oracle帐户?设该|帐L(fng)?br>打开.bash.profile文gQ将如下内容加入Q?nbsp;
 
#oracle 9i 
export ORACLE_BASE=/usr/oracle 
export ORACLE_HOME=/usr/oracle/product/9.2 
export PATH=$ORACLE_HOME/bin:$ORACLE_HOME/Apache/Apache/bin:$PATH 
export ORACLE_OWNER=oracle 
export ORACLE_SID=db01 
export ORACLE_TERM=vt100 
export LD_ASSUME_KERNEL=2.4.1 
export THREADS_FLAG=native 
export LD_LIBRARY_PATH=/usr/oracle/product/9.2/lib:$LD_LIBRARY_PATH 
export PATH=/opt/ora9/product/9.2/bin:$PATH 

# change this NLS settings to suit your country: 
# example: 
# german_germany.we8iso8859p15, american_america.we8iso8859p2 etc. 

export LANG=en_US 

保存后退出?nbsp;
然后。退出登录,再次q入Q这时候oracle的环境就已经生效了?/p>

4Q{到root帐户?Q可?su  rootQ?br>随便建立个安装目录把oracle安装文g和补丁都拯?br>解压oracle安装文g
zcat ship_9204_linux_disk1.cpio.gz | cpio -idmv
zcat ship_9204_linux_disk2.cpio.gz | cpio -idmv
zcat ship_9204_linux_disk3.cpio.gz | cpio -idmv
解压完后看见Disk1,Disk2,Disk3q?个目?/p>

打安装前补丁 p3006854_9204_LINUX.zip 用下面的命o(h)
# unzip p3006854_9204_LINUX.zip 
Archive: p3006854_9204_LINUX.zip 
creating: 3006854/ 
inflating: 3006854/rhel3_pre_install.sh 
inflating: 3006854/README.txt 
... 
# cd 3006854 
# sh rhel3_pre_install.sh 
退出root帐户

5Q回到oracle帐户?br>q到Disk1目录q行
./runInstaller 
启动安装界面

- Welcome Screen:       Click Next
- Inventory Location:   Click Next
- Unix Group Name:      Use "oinstall" and click Next
                         ?x)提C?/tmp/orainstRoot.sh, q行它然后l?br>- File Locations:       Use default values
- Available Products:   Select "Oracle9i Database 9.2.0.4"
- Installation Types:   选择安装cd是“通用”除非你有特别要?如数据仓?或不惌产生默认数据?br>- 输入全局数据库名Q?nbsp;    我一般设为和下面SID一?br>- 数据文g的存放位|?    我采用的是默认位|,点“Next”;
出现安装lg的选择l果Q这时点“Install”,开始安装,复制文gQ进度条在一点一点的增加Q当安装qlink完后Q会(x)提示q行root.sh q行它然后l?br>出现配置工具界面Q默认数据库正确配置完毕后会(x)自动产生2个数据库理员帐?SYS ?SYSTEM 分别讄密码然后l箋
agent服务不能配置成功Q忽略不用管Q在下面修复。DBCAQNETCAQHTTP都正配|完毕哦。下面开始修复错误?/p>

6Q{到root帐户?Q可?su  rootQ?br>先加入下?个环境变?br>#export ORACLE_BASE=/usr/oracle 
#export ORACLE_HOME=/usr/oracle/product/9.2

先解压补丁工?p2617419_210_GENERIC.zip q是打其他补丁所需要的工具opatch.
# unzip p2617419_210_GENERIC.zip 
Archive: p2617419_210_GENERIC.zip 
creating: OPatch/ 
creating: OPatch/docs/ 
inflating: Opatch/docs/FAQ 
...... 
inflating: README.txt  
# pwd 
解压所在目?nbsp;
# export PATH=$PATH:解压所在目?OPatch:/sbin

安装p3119415_9204_LINUX.zip 补丁
# unzip p3119415_9204_LINUX.zip 
Archive: p3119415_9204_LINUX.zip 
creating: 3119415/ 
...... 
inflating: 3119415/README.txt 
# cd 3119415 
# opatch apply 

安装p3238244_9204_LINUX.zip补丁
unzip p3238244_9204_LINUX.zip
# cd 3238244
...
# opatch apply

补丁修复完成Q需要relinked一?mk文g?br>回到oracle帐户?br>$ cd $ORACLE_HOME/network/lib
$ make -f ins_oemagent.mk install
现在在运行agentctl startQ看是不是可以成功运行agent服务了啊Q可以用stop、status来停止此服务或者检查服务的状?/p>

好了全部的安装就成功了. 
贺?恶梦l束?nbsp;

要配|数据库?br>$dbca

要启动企业管理器
$oemapp console
看看能不能连上刚才创建的数据?/p>

注意Q下ơ从新开机后企业理器中打开数据库报ORA-12541:TNS:no listener错误
q是因ؓ(f)监听服务QlistenerQ第一ơ是安装E序Z启动?以后你得自己启动 用下面的命o(h)
$lsnrctl start



Vincent Chen 2006-02-17 12:42 发表评论
]]>
Oracle性能调优实践中的几点心得http://www.tkk7.com/Vencent/articles/31182.htmlVincent ChenVincent ChenFri, 17 Feb 2006 04:41:00 GMThttp://www.tkk7.com/Vencent/articles/31182.htmlhttp://www.tkk7.com/Vencent/comments/31182.htmlhttp://www.tkk7.com/Vencent/articles/31182.html#Feedback0http://www.tkk7.com/Vencent/comments/commentRss/31182.htmlhttp://www.tkk7.com/Vencent/services/trackbacks/31182.html
一? 通过操作pȝ的一些工h查系l的状态,比如CPU、内存、交换、磁盘的利用率,Ҏ(gu)l验或与pȝ正常时的状态相比对Q有时系l表面上看v来看I闲q也? 能不是一个正常的状态,因ؓ(f)cpu可能正等待IO的完成。除此之外我们还应观注那些占用系l资?cpu、内?的进E?

   1、如何检查操作系l是否存在IO的问题?使用的工hsar,q是一个比较通用的工兗?

   Rp1#Sar -u 2 10

   x?U检察一ơ,共执?0ơ,当然q些都由你决定了?

   CZq回Q?

   HP-UX hpn2 B.11.00 U 9000/800 08/05/03

   18:26:32 %usr %sys %wio %idle

   18:26:34 80 9 12 0

   18:26:36 78 11 11 0

   18:26:38 78 9 13 1

   18:26:40 81 10 9 1

   18:26:42 75 10 14 0

   18:26:44 76 8 15 0

   18:26:46 80 9 10 1

   18:26:48 78 11 11 0

   18:26:50 79 10 10 0

   18:26:52 81 10 9 0

   Average 79 10 11 0

    其中?usr指的是用戯E用的cpu资源的百分比Q?sys指的是系l资源用cpu资源的百分比Q?wio指的是等待io完成的百分比Q这是值得 我们观注的一,%idle即空闲的癑ֈ比。如果wio列的值很大,如在35%以上Q说明你的系l的IO存在瓉Q你的CPUp了很大的旉ȝ待IO 的完成。Idle很小说明pȝCPU很忙。像我的q个CZQ可以看到wioq_gؓ(f)11说明io没什么特别的问题Q而我的idlegؓ(f)Ӟ说明我的cpu 已经满负药行了?

   当你的系l存在IO的问题,可以从以下几个方面解?

   Q联pȝ应的操作pȝ的技术支持对q方面进行优化,比如hp-ux在划定卷l时的条带化{方面?

   Q查找Oracle中不合理的sql语句Q对其进行优?

   Q对Oracle中访问量频繁的表除合理徏索引外,再就是把q些表分表空间存放以免访问上产生热点Q再有就是对表合理分区?    2、关注一下内存?

   常用的工具便是vmstatQ对于hp-unix来说可以用glance,Aix来说可以用topas,当你发现vmstat中pi列非Ӟmemory 中的free列的值很,glance,topas中内存的利用率多?0%Ӟq时说明你的内存斚w应该调节一下了Q方法大体有以下几项?

   Q划lOracle使用的内存不要超q系l内存的1/2,一般保在系l内存的40%为益?

   为系l增加内?

   Q如果你的连接特别多Q可以用MTS的方?

   Q打全补丁,防止内存漏洞?

   3、如何找到点用系用资源特别大的Oracle的session?qing)其执行的语句?

   Hp-unix可以用glance,top

   IBM AIX可以用topas

   此外可以使用ps的命令?

    通过q些E序我们可以扑ֈ点用pȝ资源特别大的q些q程的进E号Q我们就可以通过以下的sql语句发现q个pid正在执行哪个sqlQ这个sql最好在 pl/sql developer,toad{Y件中执行, ?lt;>中的spid换成你的spid可以了?

   SELECT a.username,

   a.machine,

   a.program,

   a.sid,

   a.serial#,

   a.status,

   c.piece,

   c.sql_text

   FROM v$session a,

   v$process b,

   v$sqltext c

   WHERE b.spid=

   AND b.addr=a.paddr

   AND a.sql_address=c.address(+)

   ORDER BY c.piece

   我们可以把得到的这个sql分析一下,看一下它的执行计划是否走索引Q对其优化避免全表扫描,以减IO{待Q从而加快语句的执行速度?

   提示Q我在做优化sqlӞl常到使用in的语句,q时我们一定要用exists把它l换掉,因ؓ(f)Oracle在处理In时是按Or的方式做的,即使用了烦(ch)引也?x)很慢?

   比如Q?

   SELECT col1,col2,col3 FROM table1 a

   WHERE a.col1 not in (SELECT col1 FROM table2)

   可以换成Q?

   SELECT col1,col2,col3 FROM table1 a

   WHERE not exists

   (SELECT 'x' FROM table2 b

   WHERE a.col1=b.col1)

   4、另一个有用的脚本Q查扑։十条性能差的sql.

   SELECT * FROM

   (
   SELECT PARSING_USER_ID

     EXECUTIONS,

     SORTS,

     COMMAND_TYPE,

     DISK_READS,

     sql_text

   FROM v$sqlarea

   ORDER BY disk_reads DESC

   )

   WHERE ROWNUM<10 ;
   二、迅速发现Oracle Server的性能问题的成因,我们可以求助于v$session_waitq个视图Q看pȝ的这些session在等什么,使用了多的IO。以下是我提供的参考脚本:(x)

   脚本说明Q查看占io较大的正在运行的session

   SELECT se.sid,

     se.serial#,

     pr.SPID,

     se.username,

     se.status,

     se.terminal,

     se.program,

     se.MODULE,

     se.sql_address,

     st.event,

     st.p1text,

     si.physical_reads,

     si.block_changes

   FROM v$session se,

     v$session_wait st,

     v$sess_io si,

     v$process pr

   WHERE st.sid=se.sid

     AND st.sid=si.sid

     AND se.PADDR=pr.ADDR

     AND se.sid>6

     AND st.wait_time=0

     AND st.event NOT LIKE '%SQL%'

   ORDER BY physical_reads DESC
   Ҏ(gu)索出的结果的几点说明Q?

   1、我是按每个正在{待的session已经发生的物理读排的序,因ؓ(f)它与实际的IO相关?

   2、你可以看一下这些等待的q程都在忙什么,语句是否合理Q?

   Select sql_address from v$session where sid= ;

   Select * from v$sqltext where address= ;

   执行以上两个语句便可以得到这个session的语句?

   你也以用alter system kill session 'sid,serial#';把这个session杀掉?


   3、应观注一下eventq列Q这是我们调优的关键一列,下面对常出现的event做以要的说明Q?
a? buffer busy waitsQfree buffer waitsq两个参数所标识是dbwr是否够用的问题,与IO很大相关的,当v$session_wait中的free buffer wait的条目很或没有的时侯,说明你的pȝ的dbwrq程军_够用Q不用调_(d)free buffer wait的条目很多,你的pȝ感觉h一定很慢,q时说明你的dbwr已经不够用了Q它产生的wio已经成ؓ(f)你的数据库性能的瓶颈,q时的解军_法如下:(x)

   a.1增加写进E,同时要调整db_block_lru_latches参数

   CZQ修Ҏ(gu)d如下两个参数
   db_writer_processes=4

   db_block_lru_latches=8

   a?开异步IOQIBMq方面简单得多,hp则麻?ch)一些,可以与Hp工程师联pR?

   b、db file sequential readQ指的是序读,卛_表扫描,q也是我们应该尽量减的部分Q解x法就是用烦(ch)引、sql调优Q同时可以增大db_file_multiblock_read_countq个参数?

   c、db file scattered read,q个参数指的是通过索引来读取,同样可以通过增加db_file_multiblock_read_countq个参数来提高性能?

   d、latch free,与栓相关的了Q需要专门调节?

   e、其他参数可以不特别观注?

   l篇Q匆忙之中写下了q篇文章Q希望能抛砖引玉Q能Z的Oracle调优实践带来帮助?

Vincent Chen 2006-02-17 12:41 发表评论
]]>
վ֩ģ壺 jizzjizzƵ| ĻƵ| | һһ| ѿAAƬƵ| þҹɫƷAV| ůůձĻ| ޳վ| þþƷһ| ޽Сxxxx| Ƶ97| 鵺̳Ƶ| ޹˾Ʒþþþþۺ | Ʒһ| ƬƵ| ҳڻӭ| ѳҹƵ| aaaëƬƵѹۿ| þƷAV鶹Ƭ| þþþþþƷο| þ޾ƷƷ| ƷþƵ| ˳Ƶ| AVƬ߹ۿ| þþƷƵۿ| йchina[ձ| ѿһ| õɫƵȫ| 7777þĻ| ҹ˳| ƬƵѹۿһ| þԭAV鶹 | Ӱѿ| ߹ۿƵ| ޾ñĻ| Ƭѹۿ| þùƷ| Ļһȥ̨| av| ѹۿ.WWW| йһػƸѵĴƬйһɫƬ |