您的位置:jsp学习站首页 >> 数据库 >> ORACLE >> Oracle FAQ

Oracle FAQ (1)

[ 来源:互网络 | 更新日期:2007-09-22 09:31:41 | 浏览次数:12025]
简介:快速整理破碎的表(在Oracle8i里边才可以这样使用)ALTER TABLE table_name MOVE ( TABLESPACE XXX);如何移动一张表所在的表空间方法一:1. Export 这张表2. Drop这张表3. Create table xxx tablespace xxx;4. Imp Ignore=y还要注意的一点是,所有要读取这张表的PL/SQL储存过程都会失效。需要重新编译。1. SELECT * FROM DBA_OBJECTS WHERE STATUS = ’INVALID’;2. 对这些包,函数,过程重新编译。方法二:仅对Oracle8i适用。使用下面的语句:ALTER TABLE table_name MOVE TABLESPACE new_tablespace;这样的话,所有的约束、索引、触发器都不会受到影响。但是需要rebuild这个标上的所有索引。2
1.快速整理破碎的表(在Oracle8i里边才可以这样使用)

ALTER TABLE table_name MOVE ( TABLESPACE XXX);
如何移动一张表所在的表空间

方法一:

1. Export 这张表

2. Drop这张表

3. Create table xxx tablespace xxx;

4. Imp Ignore=y

还要注意的一点是,所有要读取这张表的PL/SQL储存过程都会失效。需要重新编译。

1. SELECT * FROM DBA_OBJECTS WHERE STATUS = ’INVALID’;

2. 对这些包,函数,过程重新编译。
方法二:

仅对Oracle8i适用。

使用下面的语句:

ALTER TABLE table_name MOVE

TABLESPACE new_tablespace;

这样的话,所有的约束、索引、触发器都不会受到影响。

但是需要rebuild这个标上的所有索引。

2.怎样直接进入sql*plus而不用输入用户名,密码:

sqlplus /nolog;

sqlplus username/password@connect_string



3.怎样快速重建索引:

alter index xxx rebuild storage();

alter index xxx coalesce;
4. 为什么我看不到dbms_output的结果?

SET SERVEROUTPUT ON

5. 进行一次大的事务以后,已经COMMIT了,但为什么我的回滚段还是那样大?
因为没有设置OPTIMAL的值,所以不会自动收缩。

可以用alter rollback segment shrink to Xm;来手工进行收缩。
6. 为什么要使用VARCHAR2,而不用CHAR?

A.CHAR只支持2000字节长,而VARCHAR2支持4000字节的长度,适用性更好

B. CHAR 占用更多的存储空间,定义多长,它就占用多长的空间,插入字符后面自动加空格填充;而VARCHAR2不论定义多长,都只使用实际插入的长度。

7. 为什么从不同的数据字典看,表/索引所占用的空间不一样?

SQL> select blocks , empty_blocks from dba_tables where table_name=’表名’;



BLOCKS EMPTY_BLOCKS

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

1575 1524

SQL> select bytes,blocks,extents from dba_segments where segment_name=’表名’;



BYTES BLOCKS EXTENTS

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

6348800 3100 1

这是因为第一个数据库视图DBA_TABLES的BLOCKS列是指实际上使用的BLOCK数目,还有一些BLOCK虽然被占用了,但是没有数据存在,不计入里边。而在DBA_SEGMENTS这个数据库视图里边,BLOCKS列是指这个表总共占用的BLOCK的数目,包括有数据和没有数据的BLOCK总量。如果把第一个视图里边的BLOCKS和EMPTY_BLOCKS地总和加起来,正好等于第二个视图的BLOCKS列的大小。

8. 怎样把数据库的一张,多张表存为一个普通的文本文件?

可以在SQL*Plus里边用SPOOL命令把选出来的数据保存在SPOOL指定的文件里边。

9. 怎样从一张表里删除重复的记录

SQL> SELECT * FROM EMP;

EMP_ID OFFICE_ID EMPNAME

305 12 ELLISON, GEORGE

305 12 MERCURIO, JASON

128 17 SIMPSON, LINDA

305 22 JACKSON, DREW

使用下面的SQL语句来识别那些重复的记录:

SQL> SELECT COUNT(*), EMP_ID, OFFICE_ID

FROM EMP

GROUP BY EMP_ID, OFFICE_ID

HAVING COUNT(*) > 1;

结果如下:

COUNT(*) EMP_ID OFFICE_ID

2 305 12

Table Example, with duplicate values:

SQL> SELECT * FROM EMP;

EMP_ID OFFICE_ID EMPNAME

305 12 ELLISON, GEORGE

305 12 MERCURIO, JASON

128 17 SIMPSON,
[1] [2] [3] [4] [5]
Tags:关键字:Oracle FAQ
责任编辑:glen