提高ORACLE数据库的查询统计速度(转)


提高ORACLE数据库的查询统计速度(转)
提高ORACLE数据库的查询统计速度(转)
大型数据库系统中往往要用到查询统计,但是对于数据量大的系统,用户在进行复杂的查询统计时往往感到速度很慢,不能满足应用要求,这就要求我们在设计数据库系统时进行合理设置,提高查询统计的速度。本文结合笔者的项目开发经验,阐述具体的设置方法。

以oracle7.33数据库系统为例,我们在开发大型oracle数据库系统时结合项目的特点,本着安全、高效的原则对数据库进行了一些物理设计,从而大大提高了数据库的查询统计速度。总结为如下几点:

1)扩大数据表空间到500M,用于存放本系统的数据;

2)段盘区的初始大小为10K,增长大小为10K,增长幅度为1;

3)用户临时空间增大40M;

4)系统临时表空间和回滚段表空间增大40M,并且新建4个回滚段;

5)需要经常联结查询,而且数据量又大的库存表、名录表、收发料表放在一簇内;

6)提供定时备份,备份文件放在另外的机器上。

设置数据表空间的SQL语句如下:

CREATE TABLESPACE WXGL_DATA1 DATAFILE 'WXGL_DATA1.ORA' SIZE 500M ONLINE;
  
 


增加系统临时表空间和回滚段表空间的SQL语句如下:

ALTER TABLESPACE TEMPORARY_DATA ADD DATAFILE 'TMP2ORCL.ORA' SIZE 40M;
ALTER TABLESPACE ROLLBACK_DATA  ADD DATAFILE 'RBS2ORCL.ORA' SIZE 40M;
  
 


将数据空间设置在指定的数据文件的SQL语句如下:

CREATE USER ZBGL IDENTIFIED BY ZBGL;
GRANT DBA TO ZBGL;
ALTER USER ZBGL DEFAULT TABLESPACE WXGL_DATA1 TEMPORARY TABLESPACE TEMPORARY_DATA;
  
 


设置五个回滚段的SQL语句如下:

SELECT SEGMENT_NAME FROM DBA_ROLLBACK_SEGS WHERE INITIAL_EXTENT < 512000 AND
UPPPER(OWNER) = 'PUBLIC';
SELECT UPPER(STATUS) FROM DBA_ROLLBACK_SEGS WHERE UPPER(SEGMENT_NAME) = ''

ALTER ROLLBACK SEGMENT RB1 OFFLINE;
ALTER ROLLBACK SEGMENT RB2 OFFLINE;
ALTER ROLLBACK SEGMENT RB3 OFFLINE;
ALTER ROLLBACK SEGMENT RB4 OFFLINE;
ALTER ROLLBACK SEGMENT RB5 OFFLINE;

DROP ROLLBACK SEGMENT RB1;
DROP ROLLBACK SEGMENT RB2;
DROP ROLLBACK SEGMENT RB3;
DROP ROLLBACK SEGMENT RB4;
DROP ROLLBACK SEGMENT RB5;

CREATE PUBLIC ROLLBACK SEGMENT RB1 TABLESPACE ROLLBACK_DATA
  STORAGE (INITIAL 512000 NEXT 512000 MAXEXTENTS 121);
CREATE PUBLIC ROLLBACK SEGMENT RB2 TABLESPACE ROLLBACK_DATA
  STORAGE (INITIAL 512000 NEXT 512000 MAXEXTENTS 121);
CREATE PUBLIC ROLLBACK SEGMENT RB3 TABLESPACE ROLLBACK_DATA
  STORAGE (INITIAL 512000 NEXT 512000 MAXEXTENTS 121);
CREATE PUBLIC ROLLBACK SEGMENT RB4 TABLESPACE ROLLBACK_DATA
  STORAGE (INITIAL 512000 NEXT 512000 MAXEXTENTS 121);
CREATE PUBLIC ROLLBACK SEGMENT RB5 TABLESPACE ROLLBACK_DATA
  STORAGE (INITIAL 512000 NEXT 512000 MAXEXTENTS 121);

ALTER ROLLBACK SEGMENT RB1 ONLINE;
ALTER ROLLBACK SEGMENT RB2 ONLINE;
ALTER ROLLBACK SEGMENT RB3 ONLINE;
ALTER ROLLBACK SEGMENT RB4 ONLINE;
ALTER ROLLBACK SEGMENT RB5 ONLINE;

COMMIT;
  
 


将数据量大的库存表等放在一簇内的SQL语句如下:

KCB='CREATE TABLE QC_KCB( '
         +' CKNM      NUMBER(8)  ,'
         +' QCNM      NUMBER(10) ,'
         +' CKKC      NUMBER(12,2),'
         +' SNCKKC    NUMBER(12,2),'
         +' LDJ       NUMBER(12,2),'
         +' BZ        VARCHAR(100),'
         +' PRIMARY KEY(CKNM,QCNM))'
         +' TABLESPACE WXGL_DATA1 ' ;(大数据量的库存表等放在WXGL_DATA1)
QCFL = 'CREATE TABLE QC_QCFL '
     + '(FLBH   NUMBER(2) PRIMARY KEY,'
     + ' FLMC   VARCHAR(20) '
     + ' ) '
     +' TABLESPACE WXGL_DATA2 ' ;(其他表放在WXGL_DATA2)
  
 


系统的基础数据库存表、名录表大约有数据80M;一个单位一般每年收发300次,收发料单大约有数据50M;系统冗余数据100M,系统辅助数据10M;因此,系统总共需要空间大约是240M,现在系统开辟数据空间500M,完全满足存储要求。由于系统使用了冗余数据,在查询常用数据时,避免了多表联结查询的情况,这样,虽然使用了更多的存储空间,但查询效率大幅度提高;同时,系统将需要经常联结查询的数据放在一簇,即将存放这些数据的空间在物理上相邻,这样也使查询速度大大提高。

另外在oracle7.33数据库的Database目录下有一个Initorcl.ora文件,改变其中的设置也可以提高查询统计速度。该文件的内容如下:

#
# $Header: init.ora 1.2 94/10/18 16:12:36 gdudey Osd<desktop/netware> $ init.ora Copyr (c) 1991 Oracle
#
##############################################################################
# Example INIT.ORA file
#
# This file is provided by Oracle Corporation to help you customize
# your RDBMS installation for your site.  Important system parameters
# are discussed, and example settings given.
#
# Some parameter settings are generic to any size installation.
# For parameters that require different values in different size
# installations, three scenarios have been provided: SMALL, MEDIUM
# and LARGE.  Any parameter that needs to be tuned according to
# installation size will have three settings, each one commented
# according to installation size.
#
# Use the following table to approximate the SGA size needed for the
# three scenarious provided in this file:
#
#                     -------Installation/Database Size------
#                      SMALL           MEDIUM           LARGE
#  Block         2K    4500K            6800K           17000K
#  Size          4K    5500K            8800K           21000K
#
# To set up a database that multiple instances will be using, place
# all instance-specific parameters in one file, and then have all
# of these files point to a master file using the IFILE command.
# This way, when you change a public
# parameter, it will automatically change on all instances.  This is
# necessary, since all instances must run with the same value for many
# parameters. For example, if you choose to use private rollback segments,
# these must be specified in different files, but since all gc_*
# parameters must be the same on all instances, they should be in one file.
#
# INSTRUCTIONS: Edit this file and the other INIT files it calls for
# your site, either by using the values provided here or by providing
# your own.  Then place an IFILE= line into each instance-specific
# INIT file that points at this file.
###############################################################################

db_name = oracle
db_files = 20
control_files = C:\ORAWIN95\DATABASE\ctl1orcl.ora

compatible = 7.3.0.0.0

db_file_multiblock_read_count =  8 # INITIAL
# db_file_multiblock_read_count = 8                                   # SMALL 
# db_file_multiblock_read_count = 16                                  # MEDIUM
# db_file_multiblock_read_count = 32                                  # LARGE 

db_block_buffers =  200                           # INITIAL
# db_block_buffers = 200                                              # SMALL 
# db_block_buffers = 550                                              # MEDIUM
# db_block_buffers = 3200                                             # LARGE 

shared_pool_size =  3500000                           # INITIAL
# shared_pool_size = 3500000                                          # SMALL
# shared_pool_size = 6000000                                          # MEDIUM
# shared_pool_size = 9000000                                          # LARGE

log_checkpoint_interval = 10000

processes =  50                                         # INITIAL
# processes = 50                                                      # SMALL 
# processes = 100                                                     # MEDIUM
# processes = 200                                                     # LARGE 

dml_locks =  100                                         # INITIAL
# dml_locks = 100                                                     # SMALL 
# dml_locks = 200                                                     # MEDIUM
# dml_locks = 500                                                     # LARGE

log_buffer =  8192                                       # INITIAL
# log_buffer = 8192                                                   # SMALL
# log_buffer = 32768                                                  # MEDIUM
# log_buffer = 163840                                                 # LARGE

sequence_cache_entries =  10               # INITIAL
# sequence_cache_entries = 10                                         # SMALL 
# sequence_cache_entries = 30                                         # MEDIUM
# sequence_cache_entries = 100                                        # LARGE 

sequence_cache_hash_buckets =  10     # INITIAL
# sequence_cache_hash_buckets = 10                                    # SMALL 
# sequence_cache_hash_buckets = 23                                    # MEDIUM
# sequence_cache_hash_buckets = 89                                    # LARGE 

# audit_trail = true            # if you want auditing
# timed_statistics = true       # if you want timed statistics
max_dump_file_size = 10240      # limit trace file size to 5 Meg each
             
# log_archive_start = true      # if you want automatic archiving
log_archive_dest=%ORACLE_HOME%\DATABASE\ARCHIVE

# define directories to store trace and alert files
background_dump_dest=%RDBMS73%\trace
user_dump_dest=%RDBMS73%\trace

db_block_size = 2048

snapshot_refresh_processes = 1

remote_login_passwordfile = shared
  
 


可以修改该文件的db_file_multiblock_read_count,db_block_buffers,shared_pool_size,processes ,log_buffer,sequence_cache_entries,sequence_cache_hash_buckets等项(文件中均有提示),根据需要和系统使用的数据库服务器的特点适当改大数值,可以提高查询统计速度。这里要注意的是,必须将 log_archive_start = true 项改为False,设置才能生效。

本文介绍的Oracle数据库设置方法均在用户实际使用中经过了严格测试,证明是有效和实用的。


Oracle入门
1、如果有一定的数据库基础,知道SQL是怎么回事,即使写不出来简单的SQL,但可以看动它们,你就可以跳到2。否则请先看一下数据库基础和SQL语言,不需要很深,更不需要去记忆那些复杂的SQL命令,这些可以留在以后边应用边学习、记忆。

2、要想学好ORACLE,首先要学习ORACLE的体系结构,现在你不需要深入理解它们,但要分清几个关键的概念:

instance & database,

memory structure , process & those files ,such as data file, control file, init parameter file etc

以及database , tablespace , data file和tablespace, segmnet, extent & block它们之间的关系。

当然还要分清undo tablespace & redo log file等,

对于很多初学者来说,能够对这些概念有个较为清晰的认识并不是一件容易的事,而这些并非Oracle的全部。

3、2是有关ORACLE的一些基本概念,下面要学习的是一些简单的的实际操作,就是如何去管理ORACLE数据库,当然不是管理全部的ORACLE。在此过程中你将对SQL和ORACLE体系结构有个更深入的了解。

4、到了这一步你基本上算是初步掌握了ORACLE,下面将要根据你的方向来具体学习其它的ORACLE知识了。如果你是开发人员,则需要更多地去学习PL/SQL以及DEVELOPER,而这将是一门新的课程。如果你是一名DBA,请继续。

5、现在你可以根据自己的实际情况,进行有选择的学习,也就是说下面的内容没有特别顺序要求。可以选择深入学习ORACLE的管理、备份与恢复、性能调整、网络等。当然在学习这些知识的过程中,如果有实际的工作更好,这样你可以在实际中成长,学会TROUBLE SHOOTING。

6、当然在学习的过程中,你可以在网站或论坛中与他人进行交流,可以看别人的一些经验文章,也可以自己写一些心得体会。技术进步的本身就是经验的积累和提炼过程,希望我们共同成长,还有什么问题吗?


Trackback: http://tb.blog.csdn.net/TrackBack.aspx?PostId=319107

如何从SQLServer到Oracle实现服务器连接
以SQL Server 2000为例说明SQL Server到Oracle连接服务器的具体实现过程。

1.要求pc机上安装oralce客户端软件和sqlserver2000软件。

2.客户端的配置tnsnames.ora文件,配置所要连接的数据库服务器(windows,unix等平台均可以)

eg:tnsnames.ora

......

TEST =

(DESCRIPTION =

(ADDRESS_LIST =

(ADDRESS = (PROTOCOL = TCP)(HOST = 10.1.11.90)(PORT = 1521))

)

(CONNECT_DATA =

(sid = blue)

(SERVER = DEDICATED)

)

)

......

3.配置windows的ODBC数据源:

开始菜单—》设置—》管理工具—》数据源(ODBC)—》进入配置用户DSN或者系统DSN均可以:添加—》选择Microsoft ODBC for oracle—》自定义数据源名称(最好跟tns中连接串同名!)—》服务器名称(必填!填写tns文件中的连接串名称)—》完成。

4.配置sqlserver2000中的连接服务器:

企业管理器—》安全性—》连接服务器—》右键新建连接服务器—》定义连接名称; 选其他数据源; 指定程序名称为:Microsoft OLE DB Provider for Oracle; 产品名称可不填; 数据源指定刚才ODBC中定义好的数据源名称; 提供程序字符串按以下格式填写:User ID=username;Password=userpasswd(或者按如下格式:UID=username;PWD=userpasswd),这里的用户名和密码对应所要连接的oracle数据库中的用户名和密码 —》 安全性标签页里:设置用此安全上下文进行,并录入oracle的数据库用户名和密码—》服务器选项标签页可默认—》确定。

5.准备工作全部完成啦!在sqlserver企业管理器—》安全性—》连接服务器打开刚建好的连接服务器—》点击表,即可在右边窗口看到该oracle数据库用户拥有的的所有表名,但在这里还并不能查看表的记录,这个需要在sqserver的查询分析器中用具体sql实现!访问表时,使用格式为: [连接服务器名]..[ORACLE用户].[表名]。更详细具体的使用这里不再赘述。
SQLServer的几个技巧
1.把某个字段重新生气序列(从1到n):
DECLARE @i int
Set @i = 0
Update Table1 Set @i = @i + 1,Field1 = @i

2.按成绩排名次
Update 成绩表
Set a.名次 = (
Select Count(*) + 1
From 成绩表 b
Where a.总成绩 < b.总成绩
)
From 成绩表 a

3.查询外部数据库
Select a.*
From OpenRowSet('Microsoft.Jet.OLEDB.4.0','c:\test.mdb';'admin';'',Table1) a

4.查询Excel文件
Select *
From OpenDataSource('Microsoft.Jet.OLEDB.4.0','Data Source="c:\test.xls";User ID=Admin;Password=;Extended properties=Excel 8.0')...Sheet1$

5.在查询中指定排序规则
Select * From Table1 Order By Field1 COLLATE Chinese_PRC_BIN
为什么要指定排序规则呢?参见:
http://www.delphibbs.com/delphibbs/dispq.asp?lid=1633985
例,检查数据库中的Pub_Users表中是否存在指定的用户:
Select Count(*) From Pub_Users Where [UserName]='admin' And [PassWord]='aaa' COLLATE Chinese_PRC_BIN
默认比较是不区分大小写的,如果不加COLLATE Chinese_PRC_BIN,那么密码aaa与AAA是等效的,这当然与实际不符.注意的是,每个条件都要指定排序规则,上例中用户名就不区分大小写.
6.Order By的一个小技巧
Order By可以指定列序而不用指定列名,在下面的例子里说明它的用处(注意,第三列未指定别名)
Select a.ID,a.Name,(Select Count(*) From TableB b Where a.ID=b.PID) From TableA a Order By 3
SQLSERVER中快速获海量数据的记录总数
2月份 曾写过一篇sqlserver 优化海量查询的方法http://blog.csdn.net/great_domino/archive/2005/02/01/275839.aspx
最近有同事遇到sqlserver统计记百万条以上记录条数太慢的问题,sp经常会遇到统计大量数据问题,或许是巧合的原因,找到一个很简单的方法!
写了一篇文章
我们在统计记录的时候通常的做法是:select count(*) as c from table 。然而对于记录数巨大的表,上述做法将会非常耗时。在DELL 4400 服务器上做试验,MS Sqlserver 2000 数据库对于100万记录的简单数据表执行上述语句,时间在1分钟以上。如果在表的某个字段上做聚簇索引,第一次执行该语句的时间和没有索引的时间差不多,之后执行上述语句,速度很快,在1秒中以内,但当表的记录数发生较大变化后,再执行该语句又会经历一次耗时的过程。而且不是每个表都适合做聚簇索引的,对于数量巨大的表,如果需要经常增删操作,建聚簇索引是一个很不明智的做法,将会极大的影响增删的速度。那么有没有一个比较简单的方法快速获取表的记录总数呢?答案是有的。
 在MS SQL 数据库中每个表都在sysindexes 系统表中拥有至少一条记录,该记录中的rows 字段会定时记录表的记录总数。下面是sysindexes 表的相关记录的含义:
列名      数据类型             描述
id            int                        表ID(如果 indid = 0 或255)。否则为索引所属表的ID
Indid       smallint                索引ID:
                                         0=表
                                         1=聚簇索引
                                         >1=非聚簇索引
                                        255=具有text或image数据的表条目。
rows       int                       基于indid=0 和 indid=1地数据级行数,该值对于indid>1重 复。如果indid=255,rows设置为0。
    当表没有聚簇索引时,Indid = 0 否则为 1。
四种数据库,取随机记录的方法
mysql:select * from tablename order by rand() limit 10
sqlserver:select top 10 * from tablename order by NEWID()
ORACLE:使用 dbms random value的一种方法
SQL> select *from (select *from t order by dbms_random.value) where rownum<10;

         A
----------
        39
       101
       134
         5
        83
        97
        96
       140
        81
已选择9行。
SQL> select *from (select *from t order by dbms_random.value) where rownum<10;
         A
----------
        27
       118
       141
       103
       128
        10
       142
        68
        74 
有人说这是一种效率最差的方法,恳请告知比这更好的解决方案!
ACCESS(一):
yourstr="*1*3*4*6*12*...."
sql="select top 10 * form yourdb where instr('*'&id&'*','"&yourstr&"')<>0
ACCESS(二):
<%
   n=10    ''取任意10条记录
   set rs = server.CreateObject ("adodb.recordset")
      sql = "select * from table"
      rs.open sql,conn,1,1
      count=rs.recordcount   ''记录总数
      IF Count<>empty Then
         Randomize      
        for i = 1 to n       ''循环n次
           num=Fix(Rnd*count) ''num便是随机产生的记录行数,用Fix(),使其不会大于count值。
           rs.move num    ''移到改随机行
           Response.write rs(0)   ''出该条记录
        rs.movefirst     ''别忘了再把指针移到第一条
        next
      End IF
      rs.close
   set rs = nothing
%>
SQL> select *from (select *from t order by dbms_random.value) where rownum<10;
         A
----------
        39
       101
       134
         5
        83
        97
        96
       140
        81
已选择9行。
SQL> select *from (select *from t order by dbms_random.value) where rownum<10;
         A
----------
        27
       118
       141
       103
       128
        10
       142
        68
        74 
有人说这是一种效率最差的方法,恳请告知比这更好的解决方案!
ACCESS(一):
yourstr="*1*3*4*6*12*...."
sql="select top 10 * form yourdb where instr('*'&id&'*','"&yourstr&"')<>0
ACCESS(二):
<%
   n=10    ''取任意10条记录
   set rs = server.CreateObject ("adodb.recordset")
      sql = "select * from table"
      rs.open sql,conn,1,1
      count=rs.recordcount   ''记录总数
      IF Count<>empty Then
         Randomize      
        for i = 1 to n       ''循环n次
           num=Fix(Rnd*count) ''num便是随机产生的记录行数,用Fix(),使其不会大于count值。
           rs.move num    ''移到改随机行
           Response.write rs(0)   ''出该条记录
        rs.movefirst     ''别忘了再把指针移到第一条
        next
      End IF
      rs.close
   set rs = nothing
%>
oracle数据库开发的一些经验积累(二)
1、分析表
analyze table mzbs.db_code ESTIMATE STATISTICS SAMPLE 20 PERCENT;
2、表空间管理和用户管理
--查看表空间和数据文件
select file_name,tablespace_name,autoextensible from dba_data_files;
--数据表空间
CREATE TABLESPACE USER_DATA
    LOGGING
    DATAFILE 'D:\ORACLE\ORADATA\ORCL\test.DBF' SIZE 50m REUSE ,
             'c:\USERS01112.DBF' SIZE 50m REUSE 
    AUTOEXTEND
    ON NEXT  1280K MAXSIZE  16383M EXTENT MANAGEMENT LOCAL
--修改表空间数据文件的路径
ALTER TABLESPACE app_data
  RENAME
    DATAFILE '/DISK4/app_data_01.dbf'
    TO   '/DISK5/app_data_01.dbf';
ALTER DATABASE
  RENAME FILE '/DISK1/system_01.dbf'
    TO '/DISK2/system_01.dbf';
--临时表空间
CREATE TEMPORARY
    TABLESPACE  USER_DATA_TEMP TEMPFILE 'D:\TEMP0111.DBF'
    SIZE 50M REUSE AUTOEXTEND
    ON NEXT  1024K MAXSIZE  16383M EXTENT MANAGEMENT LOCAL UNIFORM
    SIZE 1024K
--增加数据文件

ALTER TABLESPACE  USER_DATA
  ADD DATAFILE 'c:\USERS01113.DBF' SIZE 50M;

ALTER TABLESPACE USER_DATA
  ADD DATAFILE 'c:\USERS01114.DBF'  SIZE 50M
  AUTOEXTEND ON
;


--删除表空间

DROP TABLESPACE USER_DATA INCLUDING CONTENTS;

 

--修改表空间的存储参数

ALTER TABLESPACE tablespacename
  MINIMUM EXTENT 2M;


ALTER TABLESPACE tablespacename
  DEFAULT STORAGE (
    INITIAL 2M
    NEXT 2M
    MAXEXTENTS 999 );


--表空间联机/脱机/只读

ALTER TABLESPACE tablespacename OFFLINE/ONLINE/READ ONLY;

 

--修改数据文件大小
 ALTER DATABASE
 DATAFILE 'c:\USERS01113.DBF' RESIZE 40M;

--创建用户、赋予权限

CREATE USER USER_DATA PROFILE DEFAULT IDENTIFIED BY  USER_DATA
    DEFAULT
    TABLESPACE USER_DATA  TEMPORARY
    TABLESPACE USER_DATA  ACCOUNT UNLOCK;
 
GRANT CONNECT TO USER_DATA;
GRANT RESOURCE TO USER_DATA;

 

3、表的管理

--创建表

CREAE TABLE TABLENAME
(COLUMN1 COLUTYPE DEFAULT(VALUE) NOT NULL)
(COLUMN2 COLUTYPE DEFAULT(VALUE) NOT NULL);


--建表的索引存储分配


CREATE TABLE summit.employee(id NUMBER(7) CONSTRAINT employee_id_pk PRIMARY KEY DEFERRABLE USING INDEX  STORAGE(INITIAL 100K NEXT 100K)
TABLESPACE indx,
last_name VARCHAR2(25) CONSTRAINT employee_last_name_nn NOT NULL,
dept_id NUMBER(7))
TABLESPACE data;

--修改表的存储分配

ALTER TABLE tablename
PCTFREE 30
PCTUSED 50
STORAGE(NEXT 500K
MINEXTENTS 2
MAXEXTENTS 100);

ALTER TABLE tablename
ALLOCATE EXTENT(SIZE 500K
DATAFILE '/DISK3/DATA01.DBF');

--把表移到另一个表空间

ALTER TABLE TABLENAME MOVE TABLESPACE TABLESPACENAME;


--回收空闲的空间(回收到High-water mark)
  全部回收需要TRUNCATE TABLE tablename

ALTER TABLE tablename
DEALLOCATE UNUSED;

--删除表(连同所用constraint)

DROP TABLE tablename
CASCADE CONSTRAINTS;


--给表增加列

ALTER TABLE TABLENAME
ADD COLUMN COLUTYPE DEFAULT(VALUE) NOT NULL;


--删除表中的列

ALTER TABLE tablename
DROP COLUMN columnname;


ALTER TABLE tablename
DROP COLUMN columnname
CASCADE CONSTRAINTS CHECKPOINT 1000;


--标记列不可用

ALTER TABLE tablename
SET UNUSED COLUMN columnname
CASCADE CONSTRAINTS;

--删除标记为不可用的列

ALTER TABLE tablename
DROP UNUSED COLUMNS CHECKPOINT 1000;

--继续删除列选项

ALTER TABLE tablename
DROP COLUMNS CONTINUE CHECKPOINT 1000;

--把表放到BUFFER_POOL中去

ALTER TABLE tablename
  STORAGE (BUFFER_POOL RECYCLE);

--避免动态分配EXTENT

ALTER TABLE tablename ALLOCATE EXTENT;


--把表放到CACHE中去

ALTER TABLE tablename ALLOCATE CACHE/NOCACHE;


4、索引管理


--创建索引

CREATE INDEX indexname ON TABLENAME(COLUMNNAME);

CREATE INDEX indexname ON TABLENAME(COLUMNNAME) TABLESPACE TABLESPACENAME;

--重新建立索引

ALTER INDEX indexname REBUILD TABLESPACE  TABLESPACE;


--索引分配参数

ALTER INDEX indexname
STORAGE(NEXT 400K
 MAXEXTENTS 100);


--释放索引空间

ALTER INDEX indexname
ALLOCATE EXTENT (SIZE 200K
DATAFILE '/DISK6/indx01.dbf');

ALTER INDEX indexname
DEALLOCATE UNUSED;

--重新整理索引表空间碎片

ALTER INDEX indexname COALESCE;

--删除索引

DROP INDEX indexname


--把索引放到BUFFER_POOL中

ALTER INDEX cust_name_idx
  REBUILD
  STORAGE (BUFFER_POOL KEEP);


5、约束管理


--建立主键

ALTER TABLE TABLENAME
ADD CONSTRAINT CONSTRAINTNAME PRIMARY KEY(COLUMN1,COLUMN2)


--使约束无效

ALTER TABLE TABLENAME ENABLE NOVALIDATE CONSTRAINT constraintname;

ALTER TABLE TABLENAME ENABLE VALIDATE CONSTRAINT constraintname;

--删除约束

ALTER TABLE tablename  DROP CONSTRAINT constraintname;

DROP TABLE tablename CASCADE CONSTRAINTS;(删除表后将所用的外键删除)


--给列增加缺省值

ALTER TABLE TABLENAME
MODIFY columnname  DEFAULT(value) NOT NULL;


--给表增加外键
 ALTER TABLE  tablename
 ADD CONSTRAINT  constraintname
 FOREIGN KEY(column) REFERENCES table1name(column1);


6、安全策略

--加密传输

把客户端环境变量ora_encrypt_login设为true
把服务器端参数dblink_encypt_login设为true

--数据库管理员安全策略

a、建库后立即修改SYS/SYSTEM的口令(9.2后必须修改其口令)
b、只有数据库管理员才能以SYSDBA登录系统
c、建立不同角色的管理员,分配不同的权限

   比如:对象创建于维护
         数据库的调整与维护
         创建用户分配角色
         启动关闭
         恢复备份
        
--应用开发者的安全策略

a、开发者的特权只能在测试开发的数据库中赋予权限
b、自由开发者、受控开发者
   自由开发者:create table\index\procedure\package
   受控开发者:没有以上权限


7、日志文件管理

--切换日志文件

ALTER SYSTEM SWITCH LOGFILE;

--增加日志文件

ALTER DATABASE ADD LOGFILE
('/DISK3/log3a.rdo',
'/DISK4/log3b.rdo') size 1M;

--增加日志成员

ALTER DATABASE ADD LOGFILE MEMBER
'/DISK4/log1b.rdo' TO GROUP 1
'/DISK4/log2b.rdo' TO GROUP 2;

--删除日志文件

ALTER DATABASE DROP LOGFILE GROUP 3;

--删除日志成员

ALTER DATABASE DROP LOGFILE MEMBER '/DISK4/log2b.dbf';

--清除日志文件内容

ALTER DATABASE CLEAR LOGFILE '/DISK3/log2a.rdo';

oracle数据库开发的一些经验积累(一)
1、不安装Oracle客户连接Oracle 8的方法
请将以下文件拷贝到运行文件所在目录

一、ODBC动态库 :

ctl3d32.dll msvcrt40.dll odbc16gt.dll odbc32.dll odbc32gt.dll odbccp32.dll odbccr32.dll odbcint.dll

二、建立EXTRA子目录,将MSVCRT.DLL文件拷贝到该子目录下

EXTRA\MSVCRT.DLL

三、ORACLE动态库及配置文件

Tnsnames.ora CORE35O.DLL NASNSNT.DLL NAUNTSNT.DLL NCRNT.DLL Nlnt.dll NLSRTL32.DLL Nnfdnt.dll NNFNNT.DLL NSNT.DLL NTNT.DLL NTTNT.DLL CIW32.DLL Ora73.dll OTRACE73.DLL Sqlnet.ora Sqltnsnt.dll CORE35.DLL

四、PB动态库

pbvm70.dll pbdwe70.dll Pbo7370.dll PBO8470.DLL pbodb70.dll libjcc.dll


Oracle的客户端不安装让pb连上,我记得以前有帖子的,你可以搜索一下。
具体步骤。
(1).先在某机器上安装好客户端(最好安装在c盘);
(2).复制此客户端oracle目录下的所有文件作为独立的oracle安装文件;
(3).搜索注册表,找到 HKey_Local_machine\software\oracle,把此项目及分支全部导出。
(4).打包好你的pb程序,并独立打包好oracle客户端和注册表导出文件。
(5).到干净的客户端,解开两个包,导入注册表文件,然后加入路径支持:
  path=%path%;"c:\Ora817\bin"
这样处理,应该没有问题,因为我就是这样快速处理了几十个机器。

若不想搞注册表,你可以在程序中自己写注册表,构成Oracle客户端必要的注册表支持,至于路径,手工添加应该不难。

至于Oracle客户端那些文件不需要,这个不好说,你可以把那些bin目录下的所有exe删除,Oracle Document删除(7x兆)

至于定义Oracle服务,找到 Ora817\net80\admin\TnsName.ora,参照格式,程序中生成一个也不麻烦。

=======================================================
2、在ORACLE中返回游标结果集

你需要写到一个包中:
create or replace package pag_cs_power as

    type c_Type is ref cursor;
 
FUNCTION FUN_CS_GETDICTLIST(
  v_DictIndex in  varchar2) return c_Type;

end pag_cs_power;

函数代码:

FUNCTION FUN_CS_GETDICTLIST(
  v_DictIndex in  varchar2) return c_Type
     as
        c_cursor            c_Type;
begin
   open c_cursor for
      select DICTID,DICTNAME FROM SYS_DICT WHERE DICTINDEX = v_DictIndex;
   return c_cursor;
end FUN_CS_GETDICTLIST;
----------------------------------------------------------------------
3、P4机器安装ORACLE

(1)、将ORACLE安装软件拷贝到硬盘。
(2)、将  硬盘目录文件\stage\Components\oracle.swd.jre\1.1.7.30/1
\DataFiles\Expanded\jre\win32\bin\symcjit.dll的文件改名为symcjit.old
(3).再运行SETUP.exe  文件进行安装。


-----------------------------------------------------------------------
4、单引号的插入问题

SQL> insert into a values('i''m good');       --两个''可以表示一个'

SQL> insert into a values('i'||chr(39)||'m good'); --chr(39)代表字符'

SQL> insert into a values('a'||'&'||'b');     

-----------------------------------------------------------------------
5、全数据库的导入与导出

exp username/password full=y file=yourdata.dmp grants=y rows=y
imp username/password full=y ignore=y file=yourdata.dmp grants=y

6、exp与imp的具体用法

exp username/password@mzbs_61 full=y file=yourdata.dmp grants=y rows=y
imp username/password full=y ignore=y file=yourdata.dmp grants=y

exp mzbs/mzbs@mzbs_61 file = c:\zzzzzzz.dmp grants = y rows = y
imp mzbs/mzbs@mzbs_61 file = c:\zzzzzzz.dmp grants = y ignore=y  FULL=Y


(1)

exp参数:
关键字   说明(默认)  
----------------------------------------------
USERID   用户名/口令
FULL   导出整个文件 (N)
BUFFER   数据缓冲区的大小
OWNER   所有者用户名列表
FILE   输出文件 (EXPDAT.DMP)
TABLES   表名列表
COMPRESS  导入一个范围 (Y)
RECORDLENGTH  IO 记录的长度
GRANTS   导出权限 (Y)
INCTYPE   增量导出类型
INDEXES   导出索引 (Y)
RECORD   跟踪增量导出 (Y)
ROWS   导出数据行 (Y)
PARFILE   参数文件名
CONSTRAINTS  导出限制 (Y)
CONSISTENT  交叉表一致性
LOG   屏幕输出的日志文件
STATISTICS  分析对象 (ESTIMATE)
DIRECT   直接路径 (N)
TRIGGERS  导出触发器 (Y)
FEEDBACK  显示每 x 行 (0) 的进度
FILESIZE  各转储文件的最大尺寸
QUERY   选定导出表子集的子句

imp参数:
关键字   说明(默认)  
----------------------------------------------
USERID   用户名/口令
FULL   导入整个文件 (N)
BUFFER   数据缓冲区大小
FROMUSER  所有人用户名列表
FILE   输入文件 (EXPDAT.DMP)
TOUSER   用户名列表
SHOW   只列出文件内容 (N)
TABLES   表名列表
IGNORE   忽略创建错误 (N)
RECORDLENGTH  IO 记录的长度
GRANTS   导入权限 (Y)
INCTYPE   增量导入类型
INDEXES   导入索引 (Y)
COMMIT   提交数组插入 (N)
ROWS   导入数据行 (Y)
PARFILE   参数文件名
LOG   屏幕输出的日志文件
CONSTRAINTS  导入限制 (Y)
DESTROY   覆盖表空间数据文件 (N)
INDEXFILE  将表/索引信息写入指定的文件
SKIP_UNUSABLE_INDEXES 跳过不可用索引的维护 (N)
ANALYZE   执行转储文件中的 ANALYZE 语句 (Y)
FEEDBACK  显示每 x 行 (0) 的进度
TOID_NOVALIDATE  跳过指定类型 id 的校验
FILESIZE  各转储文件的最大尺寸
RECALCULATE_STATISTICS 重新计算统计值 (N)

(2)

一、建立一个expdata.sql文件

USERID=RMTAFIS/3       这里写你的用户名和密码
BUFFER=32768
OWNER=RMTAFIS         这里写导出的用户
FILE=E:\Exp\RMTAFIS.DMP      导出的文件,可以是相对路径
ROWs=Y
GRANTS=Y
COMPRESS=Y
CONSISTENT=Y

二、建立一个expdata.bat
exp parfile=expdata.sql
如果是805
exp80 parfile=expdata.sql
双击expdata.bat就导出数据了


7、如果在like的变量中,是以‘%’开头的话,是不会使用index的。反之,不是以‘%‘开头,而又有相应的index,是会使用index的。具体可以用plain plan来看一下。

8、复制空表结构
   create table new_table
as select * from old_table where 1=2;
   复制表(含记录)
   create table new_table
as select * from old_table ;

9、把一个用户下的表导入到另一个用户下,但需要改名

先用exp导出所有的表;
用imp将导出的表导入到新用户;
在新用户下,执行
  select 'RENAME TABLE '||tname||' TO NEW_'||tname||';'
    from tab
   where tabtype='TABLE';
将上面的查询结果保存到一个sql文件中,处理后执行就可以了。


10、审计步骤

 修改参数文件init.ora,参数audit_trail值为true;
 重新启动数据库;
 打开审计audit session; (audit session by username)
 执行登录操作;
 察看审计结果:
   select * from dba_audit_session;
   select * from sys.aud$;
   select * from dba_audit_trail;
   select * from dba_audit_exists;
 关于审计:

   为了使oracle8i的审计功能可用,必须在数据库参数文件中修改audit_trail初始参数,而这个修改并不支配oracle8i把生成的审计记录记入审计痕迹中,
由于状态,特权和模式对象已被修改,因而审计的默认值不可用,其参数应设置为none.下面列出了audit_trail 可用的参数

db_使数据库审计和全部直属审计记录到数据库审计的痕迹中
os_是数据库审计依据直属审计记入到操作系统的审计很集中
none_不可用

11、BFILE的用法

(1)、create or replace directory
BFILE_TEST
as
'/oracle/oradata/bfiles';

(2)、grant read on directory BFILE_TEST to SCOTT;

(3)、host ls -l /oracle/oradata/bfiles/1.TXT

(4)、connect SCOTT/TIGER
create table BFILES (ID number, TEXT bfile );

(5)、insert into BFILES values ( 1,
bfilename ( 'BFILE_TEST', '1.TXT' ) );

posted on 2006-03-04 16:15  Sanle  阅读(395)  评论(0编辑  收藏  举报

导航