posted by 구름너머 2013. 3. 26. 21:43

Index monitoring usage

A. Hr 스키마내 employees 테이블에 지정된 모든 인덱스에 대한 정보를 확인하는데 인덱스 이름, 컬럼이름, 순서를 조회하시오

SQL> conn hr/hr

Connected.

SQL> col column_name for a20

SQL> select index_name, column_name, column_position from user_ind_columns

where table_name = 'EMPLOYEES' order by 1;

INDEX_NAME COLUMN_NAME COLUMN_POSITION

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

EMP_DEPARTMENT_IX DEPARTMENT_ID 1

EMP_EMAIL_UK EMAIL 1

EMP_EMP_ID_PK EMPLOYEE_ID 1

EMP_EMP_ID_SAL_IX SALARY 2

EMP_EMP_ID_SAL_IX EMPLOYEE_ID 1

EMP_JOB_IX JOB_ID 1

EMP_MANAGER_IX MANAGER_ID 1

EMP_NAME_IX LAST_NAME 1

EMP_NAME_IX FIRST_NAME 2

9 rows selected.

B. Hr.employees 테이블의 인덱스 중 last_name, first_name에 지정된 인덱스에 대해서 monitoring usage 기능을 활성화하시오

인덱스 찾기 : ALL_IND_COLUMNS

SQL> select * from ALL_ind_columns where table_name = 'EMPLOYEES' ORDER BY INDEX_NAME;

SQL> alter index hr.EMP_NAME_IX monitoring usage;

Index altered.

SQL> select index_name, start_monitoring, end_monitoring, used from v$object_usage;

INDEX_NAME START_MONITORING END_MONITORING USE

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

EMP_NAME_IX 01/02/2013 14:48:47 NO

C. 다음의 쿼리문을 수행하시오

Select * from employees where last_name = 'Whalen';

Select * from employees where first_name = 'Susan';

D. B에서 지정한 monitoring usage를 비활성화하시오

SQL> alter index EMP_NAME_IX nomonitoring usage;

Index altered.

E. 인덱스 사용에 대한 정보를 조회하시오. 이 때 hr 세션에서 조회하시오. 만약 sys에서 조회하면 결과는? 이유는? 해결방법은?

인덱스 사용에 대한 정보를 조회

SQL> select index_name, start_monitoring, end_monitoring, used from v$object_usage;

INDEX_NAME START_MONITORING END_MONITORING USE

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

EMP_NAME_IX 01/02/2013 14:48:47 01/02/2013 20:31:52 YES

Sys에서 조회

SQL> conn /as sysdba

Connected.

SQL> select index_name, start_monitoring, end_monitoring, used from v$object_usage;

no rows selected

è 데이터가 조회되지 않는다.

SQL> set long 30000

SQL> select text from dba_views where view_name = upper('v$object_usage');

TEXT

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

select io.name, t.name,

decode(bitand(i.flags, 65536), 0, 'NO', 'YES'),

decode(bitand(ou.flags, 1), 0, 'NO', 'YES'),

ou.start_monitoring,

ou.end_monitoring

from sys.obj$ io, sys.obj$ t, sys.ind$ i, sys.object_usage ou

where io.owner# = userenv('SCHEMAID')

and i.obj# = ou.obj#

and io.obj# = ou.obj#

and t.obj# = i.bo#

è 조회되지 않음. 이유는 v$object_usageuserenv('SCHEMAID')로 조회하는데 index owneruserenv('SCHEMAID')는 다르기 때문

è 해결하기 위해 새로운 view 생성

SQL> create view V$ALL_OBJECT_USAGE

(owner, INDEX_NAME, TABLE_NAME, MONITORING, USED, START_MONITORING, END_MONITORING)

as select u.name, io.name, t.name,

decode(bitand(i.flags, 65536), 0, 'NO', 'YES'),

decode(bitand(ou.flags, 1), 0, 'NO', 'YES'),

ou.start_monitoring,

ou.end_monitoring

from sys.user$ u, sys.obj$ io, sys.obj$ t, sys.ind$ i, sys.object_usage ou

where i.obj# = ou.obj#

and io.obj# = ou.obj#

and t.obj# = i.bo#

and io.owner# = u.user#;

View created.

SQL> select * from v$all_object_usage;

OWNER INDEX_NAME TABLE_NAME MONUSE START_MONITORING END_MONITORING

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

HR EMP_NAME_IX EMPLOYEES NO YES 01/02/2013 14:48:47 01/02/2013 20:31:52

hr에서 조회

SQL> conn hr/hr

Connected.

SQL> select * from v$all_object_usage;

select * from v$all_object_usage

*

ERROR at line 1:

ORA-00942: table or view does not exist

SQL> conn /as sysdba

Connected.

SQL> grant select on sys.v$all_object_usage to public;

Grant succeeded.

SQL> create public synonym v$all_object_usage for sys.v$all_object_usage;

Synonym created.

SQL> conn hr/hr

Connected.

SQL> select * from v$all_object_usage;

OWNER INDEX_NAME TABLE_NAME MON USE START_MONITORING END_MONITORING

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

HR EMP_NAME_IX EMPLOYEES NO YES 01/02/2013 14:48:47 01/02/2013 20:31:52

è hr에서도 v$all_object_usage로 조회 가능

'ORACLE' 카테고리의 다른 글

MATERIALIZED VIEW 생성  (0) 2013.03.28
trace and mview  (0) 2013.03.28
INDEX 분석  (0) 2013.03.26
오라클 falshback  (0) 2013.03.16
오라클 awr 리포트 뽑기  (0) 2013.03.13
posted by 구름너머 2013. 3. 26. 21:18

INDEX 분석

20% 이상이면 성능저하 => 리빌드 필요!


SQL> create table test as select * from big_emp;
SQL> create index i_test_empno on test(empno);
SQL> select * from user_indexes where index_name = 'I_TEST_EMPNO';
SQL> ANALYZE INDEX I_TEST_EMPNO VALIDATE STRUCTURE;
SQL> SELECT (DEL_LF_ROWS_LEN/LF_ROWS_LEN)*100 BALACE FROM INDEX_STATS;
SQL> DELETE FROM TEST WHERE EMPNO > 1 AND EMPNO < 7500;
SQL> COMMIT;
SQL> ANALYZE INDEX I_TEST_EMPNO VALIDATE STRUCTURE;  INDEX 구조 분석
SQL> SELECT DEL_LF_ROWS_LEN ,LF_ROWS_LEN, (DEL_LF_ROWS_LEN/LF_ROWS_LEN)*100 BALACE FROM INDEX_STATS;
DEL_LF_ROWS_LEN LF_ROWS_LEN BALACE
--------------- ----------- --------------
103510 453512 22.8
SQL> ALTER INDEX I_TEST_EMPNO REBUILD NOLOGGING PARALLEL 2;
SQL> ANALYZE INDEX I_TEST_EMPNO VALIDATE STRUCTURE;
SQL> SELECT DEL_LF_ROWS_LEN ,LF_ROWS_LEN, (DEL_LF_ROWS_LEN/LF_ROWS_LEN)*100 BALACE FROM INDEX_STATS;
DEL_LF_ROWS_LEN LF_ROWS_LEN BALACE
--------------- ----------- --------------
0 350002 0

 

'ORACLE' 카테고리의 다른 글

trace and mview  (0) 2013.03.28
Index monitoring usage  (0) 2013.03.26
오라클 falshback  (0) 2013.03.16
오라클 awr 리포트 뽑기  (0) 2013.03.13
Oracle 수업내용  (0) 2013.03.11
posted by 구름너머 2013. 3. 16. 16:53

# flashback table : 휴지통에서 테이블 복구


[hirasvr1:/SYSTEM/oraswno_datafile/DEVDB_DATA]$sqlplus '/as sysdba'

SQL*Plus: Release 10.2.0.2.0 - Production on Mon Dec 29 15:25:04 2008

Copyright (c) 1982, 2005, Oracle. All Rights Reserved.


Connected to:
Oracle Database 10g Enterprise Edition Release 10.2.0.2.0 - 64bit Production
With the Partitioning, OLAP and Data Mining options

SQL> grant dba to hr ;


SQL> conn hr/hr
Connected.
SQL> create table emp1 (
2 ename varchar2(10),
3 id number(10)) ;

Table created.

SQL> insert into emp1 values ('aaa', 1) ;

1 row created.

SQL> insert into emp1 values ('bbb', 2) ;

1 row created.

SQL> commit ;

Commit complete.

SQL> drop table emp1 ;

Table dropped.

SQL> show recyclebin <- 문제1) 무슨 명령어?
ORIGINAL NAME RECYCLEBIN NAME OBJECT TYPE DROP TIME
---------------- ------------------------------ ------------ -------------------
EMP1 BIN$XymNUHIAK3vgRAAAAAAAAA==$0 TABLE 2008-12-29:15:26:16

SQL> purge recyclebin; <- 문제2) 무슨 명령어?

Recyclebin purged.

SQL>
SQL> show recyclebin <-- 휴지통에 아무것도 없으니깐 아무것도 안나옴 ^^
SQL>

SQL> create table emp1 (
2 ename varchar2(10),
3 id number(10)) ;

Table created.

SQL> insert into emp1 values ('aaa', 1) ;

1 row created.

SQL> insert into emp1 values ('bbb', 2) ;

1 row created.

SQL> commit ;

Commit complete.

SQL> drop table emp1 ;

Table dropped.

SQL> show recyclebin
ORIGINAL NAME RECYCLEBIN NAME OBJECT TYPE DROP TIME
---------------- ------------------------------ ------------ -------------------
EMP1 BIN$XymNUHIBK3vgRAAAAAAAAA==$0 TABLE 2008-12-29:15:33:13

SQL> flashback table emp1 to before drop;

Flashback complete.

SQL> select * from emp1 ;

ENAME ID
---------- ----------
aaa 1
bbb 2

SQL>
SQL> purge recyclebin;

Recyclebin purged.

SQL>
SQL> create table emp2 (
2 ename varchar2(10),
3 id number(10)) ;

Table created.

SQL> insert into emp2 values ('aaa', 1) ;

1 row created.

SQL> commit ;

Commit complete.

SQL> drop table emp2 purge ; <- 문제3) 무슨 명령어?

Table dropped.

SQL> show recyclebin
SQL>

SQL> create table emp3 (
2 ename varchar2(10),
3 id number(10)) ;

Table created.

SQL> insert into emp3 values ('aaa', 1) ;

1 row created.

SQL> commit ;

Commit complete.

SQL> create index index_emp3 on emp3(ename) ;

Index created.

SQL> select index_name from user_indexes where table_name = 'EMP3' ;

INDEX_NAME
------------------------------
INDEX_EMP3

SQL> drop table emp3 ;

Table dropped.

SQL> show recyclebin ;
ORIGINAL NAME RECYCLEBIN NAME OBJECT TYPE DROP TIME
---------------- ------------------------------ ------------ -------------------
EMP3 BIN$XymNUHIEK3vgRAAAAAAAAA==$0 TABLE 2008-12-29:15:55:10
SQL>
SQL> flashback table emp3 to before drop;

Flashback complete.

SQL> select * from emp3 ;

ENAME ID
---------- ----------
aaa 1

SQL> select index_name from user_indexes where table_name = 'EMP3' ;

INDEX_NAME
------------------------------
BIN$XymNUHIDK3vgRAAAAAAAAA==$0 <- 문제4) 이것은 무엇인가?

SQL> alter index "BIN$XymNUHIDK3vgRAAAAAAAAA==$0" rename to index_emp3 ; <- 문제5) 무슨 명령어?

Index altered.

SQL> select index_name from user_indexes where table_name = 'EMP3' ;

INDEX_NAME
------------------------------
INDEX_EMP3

SQL>


===========================================================================================
# flashback query : 과거 특정 시점의 데이터를 확인하고 그때로 돌아가자 ^^

-- 현제 시간과 DB 시간이 다를수 있으니, DB시간을 확인하고 DB시간에 맞춰 작업하세요 ^^

SQL> select to_char(sysdate, 'YYYY/MM/DD HH24:MI') from dual ;

SQL> select systimestamp from dual;

SYSTIMESTAMP
---------------------------------------------------------------------------
29-DEC-08 04.28.16.798523 PM +09:00

SQL> create table emp4 (
2 ename varchar2(10),
3 salary number(10)) ;

Table created.

SQL> insert into emp4 values ('namwon', 100) ;

1 row created.

SQL> commit ;

Commit complete.

SQL> select systimestamp from dual;

SYSTIMESTAMP
---------------------------------------------------------------------------
29-DEC-08 04.31.08.784948 PM +09:00

SQL> select * from emp4 ;

ENAME SALARY
---------- ----------
namwon 100


SQL> update emp4
2 set salary=500
3 where ename='namwon' ;

1 row updated.

SQL> commit ;

Commit complete.

SQL> select * from emp4 ; <- 헉, 정남원을 급여가 100만원을 줘야 하는데 실수로 500만원을 줬다. 큰일큰일 ^^

ENAME SALARY
---------- ----------
namwon 500


SQL> select * from emp4 as of timestamp to_timestamp('2008-12-29 16:31','YYYY/MM/DD HH24:MI') ;

ENAME SALARY
---------- ----------
namwon 100


SQL> select * from emp4 as of timestamp to_timestamp('2008-12-29 16:35','YYYY/MM/DD HH24:MI') ;

ENAME SALARY
---------- ----------
namwon 100

SQL> select * from emp4 as of timestamp to_timestamp('2008-12-29 16:38','YYYY/MM/DD HH24:MI') ; <- 이 시간에 실수로 update 했구나.

ENAME SALARY
---------- ----------
namwon 500

SQL> update emp4 set salary = ( select salary from emp4
2 as of timestamp to_timestamp('2008-12-29 16:31','YYYY/MM/DD HH24:MI')
3 where ename='namwon' )
4 where ename='namwon';
<- 16:31 으로 빨리 돌아가자 ^^ 남원 급여는 100만원이야.ㅋㅋ

1 row updated.

SQL> commit ;

Commit complete.

SQL> select * from emp4 ;

ENAME SALARY
---------- ----------
namwon 100 <-- 정상적으로 100만원으로 돌아갔음 ^^

SQL>

=================================================================================================

# flashback version query : 과거 특정 기간(시간, SCN)의 이력 데이터 확인 및 그시점으로 flashback

SQL> conn hr/hr
Connected.
SQL> create table emp5 (
2 ename varchar2(10),
3 salary number(10)) ;

Table created.

SQL> insert into emp5 values ('NAMWON', 100);

1 row created.

SQL> insert into emp5 values ('KING', 1000) ;

1 row created.

SQL> commit ;

Commit complete.

SQL> select * from emp5 ;

ENAME SALARY
---------- ----------
NAMWON 100
KING 1000

SQL> update emp5
2 set salary=200
3 where ename='NAMWON';

1 row updated.

SQL> update emp5
2 set salary=2000
3 where ename='KING' ;

1 row updated.

SQL> commit ;
Commit complete.

SQL> select * from emp5 ;

ENAME SALARY
---------- ----------
NAMWON 200
KING 2000


SQL> delete from emp5 ;

2 rows deleted.

SQL> commit ;

Commit complete.

SQL> select versions_startscn, versions_endscn, versions_operation, salary, ename
2 from emp5 versions between scn minvalue and maxvalue;

VERSIONS_STARTSCN VERSIONS_ENDSCN V SALARY ENAME
----------------- --------------- - ---------- ----------
968877 D 2000 KING
968877 D 200 NAMWON
967905 968877 U 2000 KING
967905 968877 U 200 NAMWON
967846 967905 I 1000 KING
967846 967905 I 100 NAMWON

6 rows selected.

SQL> alter table emp5 enable row movement ; <- rowid를 보전하지 않기 때문에 row movement 기능 활성화 되어 있어야함.

Table altered.

SQL> flashback table emp5 to scn 967846 ; <- 돌아가고 싶은 VERSIONS_STARTSCN 을 적으면 된다

Flashback complete.

SQL> select * from emp5 ;

ENAME SALARY
---------- ----------
NAMWON 100
KING 1000

SQL> flashback table emp5 to scn 967905 ;

Flashback complete.

SQL> select * from emp5 ;

ENAME SALARY
---------- ----------
NAMWON 200
KING 2000

SQL> flashback table emp5 to scn 968877 ;

Flashback complete.

SQL> select * from emp5 ;

no rows selected

SQL>

# flashback transaction query : 과거의 어떤 시간이나 SCN 사이의 존재 했던 행들의 값을 질의
트랜잭션에 의해 변화한 행들의 이력을 보여줌

SQL> conn hr/hr
Connected.

SQL> select supplemental_log_data_min from v$database;
SUPPLEME
--------
NO

SQL> alter database add supplemental log data;
Database altered.


SQL> select supplemental_log_data_min from v$database;
SUPPLEME
--------
YES

SQL> select current_scn from v$database;

CURRENT_SCN
-----------
972858


SQL> create table emp6(
2 ename varchar2(10),
3 salary number(10));

Table created.

SQL> insert into emp6 values ('NAMWON', 100) ;

1 row created.

SQL> insert into emp6 values ('KING', 1000);

1 row created.

SQL> insert into emp6 values ('ALICE', 300) ;

1 row created.

SQL> COMMIT ;

Commit complete.

SQL> update emp6
2 set salary=300
3 where ename='NAMWON' ;

1 row updated.

SQL> update emp6
2 set salary=3000
3 where ename='KING' ;

1 row updated.

SQL> commit ;

Commit complete.

SQL> delete from emp6 ;

3 rows deleted.

SQL> commit ;

Commit complete.

SQL> select versions_startscn, versions_endscn, versions_operation, salary, ename
2 from emp6 versions between scn minvalue and maxvalue;

VERSIONS_STARTSCN VERSIONS_ENDSCN V SALARY ENAME
----------------- --------------- - ---------- ----------
973006 D 300 ALICE
973006 D 3000 KING
973006 D 300 NAMWON
972999 973006 U 3000 KING
972999 973006 U 300 NAMWON
972964 973006 I 300 ALICE
972964 972999 I 1000 KING
972964 972999 I 100 NAMWON

8 rows selected.

SQL> select undo_sql from flashback_transaction_query
2 where table_name='EMP6'
3 and commit_scn between 972999 and 973006
4 order by start_timestamp desc;

UNDO_SQL
--------------------------------------------------------------------------------
insert into "HR"."EMP6"("ENAME","SALARY") values ('ALICE','300');
insert into "HR"."EMP6"("ENAME","SALARY") values ('KING','3000');
insert into "HR"."EMP6"("ENAME","SALARY") values ('NAMWON','300');
update "HR"."EMP6" set "SALARY" = '100' where ROWID = 'AAAM4tAAEAAABFEAAA';
update "HR"."EMP6" set "SALARY" = '1000' where ROWID = 'AAAM4tAAEAAABFEAAB';

SQL>


=================================================================================================

# flashback database : 전체 데이터베이스를 과거의 특정 시점으로 돌림

SQL> select flashback_on from v$database;

FLASHBACK_ON
------------------
NO

SQL> shutdown immediate
ORA-01031: insufficient privileges

SQL> exit
Disconnected from Oracle Database 10g Enterprise Edition Release 10.2.0.1.0 - Production
With the Partitioning, OLAP and Data Mining options
[oracle@oracle ~]$ sqlplus '/as sysdba'

SQL*Plus: Release 10.2.0.1.0 - Production on Mon Dec 29 23:19:13 2008

Copyright (c) 1982, 2005, Oracle. All rights reserved.


Connected to:
Oracle Database 10g Enterprise Edition Release 10.2.0.1.0 - Production
With the Partitioning, OLAP and Data Mining options

SQL> shutdown immediate
Database closed.
Database dismounted.
ORACLE instance shut down.
SQL> startup mount
ORACLE instance started.

Total System Global Area 167772160 bytes
Fixed Size 1218316 bytes
Variable Size 79694068 bytes
Database Buffers 83886080 bytes
Redo Buffers 2973696 bytes
Database mounted.
SQL> alter database flashback on ;

Database altered.

SQL> alter database open ;

Database altered.

SQL> select flashback_on from v$database;

FLASHBACK_ON
------------------
YES

SQL> alter system switch logfile ;

System altered.

SQL> select current_scn from v$database;

CURRENT_SCN
-----------
974236

SQL> drop user hr cascade ; <- 제가 젤로 아끼는 hr 유저 drop

User dropped.

SQL> conn hr/hr <- hr 유저가 drop 되서 접속 안됨 ㅠㅠ
ERROR:
ORA-01017: invalid username/password; logon denied

SQL> exit
[oracle@oracle ~]$ sqlplus '/as sysdba'

SQL*Plus: Release 10.2.0.1.0 - Production on Mon Dec 29 23:23:13 2008

Copyright (c) 1982, 2005, Oracle. All rights reserved.


Connected to:
Oracle Database 10g Enterprise Edition Release 10.2.0.1.0 - Production
With the Partitioning, OLAP and Data Mining options

SQL> shutdown immediate
Database closed.
Database dismounted.
ORACLE instance shut down.
SQL>
SQL> startup monut
SP2-0714: invalid combination of STARTUP options
SQL> startup mount
ORACLE instance started.

Total System Global Area 167772160 bytes
Fixed Size 1218316 bytes
Variable Size 88082676 bytes
Database Buffers 75497472 bytes
Redo Buffers 2973696 bytes
Database mounted.
SQL> flashback database to scn 974236 ; <- hr 유저 drop전 SCN번호 입력 (각자 환경마다 틀림 ^^)

Flashback complete.

SQL> alter database open resetlogs ;

Database altered.

SQL> conn hr/hr <- hr 유저 복원 ^^
Connected.
SQL>

====================================================================================

해답

SQL> show recyclebin <- 문제1) 무슨 명령어?
답) 휴지통 내용보기

SQL> purge recyclebin; <- 문제2) 무슨 명령어?
답) 휴지통 비우기(휴지통 삭제)

SQL> drop table emp2 purge ; <- 문제3) 무슨 명령어?
답) 테이블 drop 하면서 휴지통에도 동시에 삭제 (flashback 으로 복구 불가 ^^)

INDEX_NAME
------------------------------
BIN$XymNUHIDK3vgRAAAAAAAAA==$0 <- 문제4) 이것은 무엇인가?
답) 테이블이 삭제된후 휴지통으로 들어가면 인덱스명이 바뀐다. 그래서 원래 이름으로 rename 해야 한다 ^^

SQL> alter index "BIN$XymNUHIDK3vgRAAAAAAAAA==$0" rename to index_emp3 ; <- 문제5) 무슨 명령어?
답) 인덱스 이름 바꾸는 명령어

 

'ORACLE' 카테고리의 다른 글

Index monitoring usage  (0) 2013.03.26
INDEX 분석  (0) 2013.03.26
오라클 awr 리포트 뽑기  (0) 2013.03.13
Oracle 수업내용  (0) 2013.03.11
오라클 분석함수 rank(), max(), sum()  (0) 2012.09.17
posted by 구름너머 2013. 3. 13. 21:50

 AWR 구동되도록 하는 명령:

select count(*)
from scott.emp;

select *
from dba_tables
where table_name = 'EMP';

exec

dbms_stats.gather_table_stats(ownname=>'SCOTT',

tabname=>'EMP', estimate_percent=>100,

cascade=>true, degree=>1);

truncate table scott.emp;

select count(*)
from scott.emp;

select *
from dba_tables
where table_name = 'EMP';

------------------------------------------------------
cd $ORACLE_HOME/rdbms/admin/
pwd ==>
/u01/app/oracle/product/10.2.0/db_1/rdbms/admin

sqlplus '/as sysdba'
SQL>@ awrrpt.sql

'ORACLE' 카테고리의 다른 글

INDEX 분석  (0) 2013.03.26
오라클 falshback  (0) 2013.03.16
Oracle 수업내용  (0) 2013.03.11
오라클 분석함수 rank(), max(), sum()  (0) 2012.09.17
뷰생성 후 다른계정에서 조회가 안될경우  (0) 2012.09.03
posted by 구름너머 2013. 3. 11. 21:57

-- 20130311

-- 오라클 데이터 딕션어리 뷰

select *
from dict ;

dba_     : (dba권한) DB 모든 정보 조회 가능
-> grant select_catalog_role to DB계정명 (딕션어리정보만 볼수 있는 권한)
all_       : DB 내가 만든 것 + DB 내가 권한 받은 것
user_    : DB 내가 만든 것
x$        : DB 성능 및 통계정보
v$        : DB 성능 및 통계정보

EX)
select *
from dba_tables ;     all_table ;        user_tables ;

--PK
1. not  null + 중복제거
2. pk컬럼은 자동으로 인덱스 생성
3. 1개 테이블에 pk는 존재 o (pk 1개만 생성), 존재 x
4. 1개 테이블에 1개 또는 여러개의 컬럼으로 pk는 1개 만들 수 있다.

--FK
1. 데이터는 부모없는 자식은 없다.
2. 데이터는 자식없는 부모는 있다.
3. 데이터의 변경 및 삭제는 자식부터 한다.

 

 

 

 


-- 테이블 생성 스크립트
CREATE TABLE 테이블명  (
   FILE_ID              VARCHAR2(25)                     NOT NULL,
   FILE_ID_FORM         VARCHAR2(6),
   RECP_DT              VARCHAR2(8),
   WRK_TYPE_SEQ         VARCHAR2(6),
   RECV_DT              VARCHAR2(8),
   CONSTRAINT PK_테이블명 PRIMARY KEY (FILE_ID)
   using index
   tablespace 테이블스페이스명
   storage( initial 1M next 1M maxextents unlimited pctincrease 0
freelists 10 freelist groups 2 )
)
tablespace 테이블스페이스명
storage( initial 1M next 1M maxextents unlimited pctincrease 0
freelists 10 freelist groups 2 )
/


 

-- NOT NULL을 NULL로 바꾸기
ALTER TABLE 테이블명 MODIFY (컬럼명 데이터타입 NULL ) ;

-- NULL을 NOT NULL로 바꾸기
ALTER TABLE 테이블명 MODIFY (컬럼명 데이터타입 NOT NULL ) ;

-- 컬럼 변경
ALTER TABLE 테이블명 MODIFY (컬럼명 VARCHAR2( 20 ) ) ;


-- 컬럼 추가
alter table 테이블명
add        (컬럼명  데이터타입);

-- 컬럼 삭제
alter table 테이블명
drop        column 컬럼명  ;

-- 테이블명 변경
alter table 변경전 테이블명 rename to 변경 후 테이블명 ;

-- 컬럼명 변경
alter table 테이블명 rename column 기존컬럼명 to 새로사용할컬럼명 ;

-- 테이블 삭제
drop table 테이블명 ;


-- 스퀸스 삭제
drop sequence 유저명.시퀀스명 ;

-- 스퀸스 생성
create sequence 유저명.시퀀스명
       increment by 1   -- 증가값
       start with 701     -- 시작값
       MINVALUE 701   -- 최소값
       MAXVALUE 799  -- 최대값
       cache 20           -- 메모리
       cycle ;
             
-- 스퀸스 MAX값 변경      
ALTER SEQUENCE 유저명.시퀀스명 MAXVALUE 99999;    

-- FK 생성시 enable validate 로 변경할때
alter table 테이블명 enable validate constraint  FK명 ;

--FK 생성
ALTER TABLE 자식테이블명 ADD (
  CONSTRAINT  FK명  FOREIGN KEY (컬럼명)
    REFERENCES 부모테이블명 (컬럼명));

--FK 삭제
alter table 자식테이블명 DROP CONSTRAINTS  FK명 ;


--인덱스 추가
CREATE INDEX 인덱스명 ON 테이블명
 (컬럼명)
tablespace 테이블스페이스명
storage(initial 1M next 1M pctincrease 0 maxextents unlimited freelists 10 freelist groups 2);

-- 인덱스 삭제
drop index 인덱스명 ;

-- 인덱스명 변경
alter index 변경전인덱스명 rename TO 변경후인덱스명 ;

-- pk 리빌드
alter index  PK명  rebuild ;

-- PK 변경
select * from dba_segments where segment_name like '%PK명%';

alter table 테이블명 drop primary key;
drop index PK명 ;

alter table 테이블명  add
   CONSTRAINT PK명  PRIMARY KEY (컬럼명)
   using index
   tablespace 테이블스페이스명
   storage( initial 1M next 1M maxextents unlimited pctincrease 0 freelists 10 freelist groups 2 );


-- PK 생성
ALTER TABLE 테이블명  add
   CONSTRAINT  PK명  PRIMARY KEY (컬럼명)
      using index
   tablespace 테이블스페이스명
   storage( initial 1M next 1M maxextents unlimited pctincrease 0 freelists 10 freelist groups 2 )
;
-- 주석 보기
-- 테이블 주석
dba_tab_comments
-- 컬럼 주석
dba_col_comments

'ORACLE' 카테고리의 다른 글

오라클 falshback  (0) 2013.03.16
오라클 awr 리포트 뽑기  (0) 2013.03.13
오라클 분석함수 rank(), max(), sum()  (0) 2012.09.17
뷰생성 후 다른계정에서 조회가 안될경우  (0) 2012.09.03
Oracle lock 확인 및 kill 방법  (0) 2012.08.08
posted by 구름너머 2012. 9. 17. 15:32

분석함수

함수이름(인자) over (partition by ~ order by ~ rows)
0개~3개 1 2 3
2 : 함수에따라 필수사용인경우있음
3 : 단독사용x 사용시 2번 지정

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

SELECT ename, deptno, sal
, rank() over (order by sal desc) 순위
, RANK() OVER (PARTITION BY deptno ORDER BY sal desc) 부서내순위
, DENSE_RANK() OVER (ORDER BY sal desc) 순위2
FROM EMP;
ORDER BY deptno;


RANK 공동등수가있을경우 다음등수는 공동등수인원수를 따로 적용한 등수가 적용
DENSE_RANK 공동등수가있을경우 다음등수가 순차적으로 적용

1. 집계함수로 사용된 max 쿼리오류
SELECT ename, sal, MAX(sal) FROM EMP;

2. 분석함수로 사용된 max 쿼리실행
SELECT ename, sal, MAX(sal) OVER () FROM EMP;

3. PARTITION BY 옵션의 의미(group by 와 비슷)
SELECT ename,sal,deptno, MAX(sal) OVER() 전체최대
, MAX(sal) OVER(PARTITION BY deptno) 부서최대
FROM EMP;

4. 사원이름, 급여, 각부서의 급여합계표시
SELECT ename, sal, SUM(sal) OVER (PARTITION BY deptno)
FROM EMP;

5. 해당 행의 앞1 뒤1 컬럼값의 합
SELECT ename,sal
, SUM(sal) OVER(ORDER BY sal ROWS BETWEEN 1 preceding AND 1 following) 부분합
FROM EMP;

6. 누적합
SELECT ename, sal
, SUM(sal) OVER(ORDER BY sal ROWS unbounded preceding) 누적합
FROM EMP;

파트별 누적합
SELECT ename, sal
, SUM(sal) OVER(ORDER BY sal ROWS unbounded preceding) 누적합
FROM EMP;

분석함수 특징 : 분석함수를 제외한 SELECT 문부터 수행한후
해당결과를 대상으로 분석함수 적용함.
ORDER BY 절의 제외하고는 제일마지막에 수행함.
(분석함수를 조건절에 사용못함)

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

분석함수중 현재 data기준 앞줄이나 뒷줄data를 가져올수있음

LEAD : 현제 행의 다음레코드값을 가져올때
SELECT ename, sal, LEAD(sal,1) OVER(ORDER BY sal) FROM EMP;

LAG : 현제 행의 앞레코드값을 가져올때
SELECT ename, sal, LAG(sal,1) OVER(ORDER BY sal) FROM EMP;

[출처] 오라클 분석함수 rank(), max(), sum()|작성자 쫑이

 

 

 

참고1.조건에따른 누적합계 구하기 ==> http://www.oracleclub.com/lecture/2203

 

참고2.오라클 분석함수 사용예 및 정리된곳 ==>

http://www.java2s.com/Code/Oracle/Analytical-Functions/CatalogAnalytical-Functions.htm

 

posted by 구름너머 2012. 9. 3. 18:10

뷰생성 후 다른계정에서 조회가 안될경우

ORA-01031: 권한이 불충분합니다.

아래의 조치단계를 확인합니다.

1.조회하는 계정 즉 SEABILL, 조회가 안되는 계정에서

   뷰에서 조회하는 테이블,뷰,FUNCTION 들에대한 권한을 주었는지 확인합니다.

  안줬다면 조회하는 계정(SEABILL)에 권한주기.

GRANT SELECT ON TB_BUPC TO SEABILL ;

2.권한을 주었는데도 안된다면 뷰를 생성한 계정(BILLORG)에 with grant 권한추가로 추기

GRANT SELECT ON TB_BUPC TO BILORG WITH GRANT OPTION;

 

 

 

'ORACLE' 카테고리의 다른 글

Oracle 수업내용  (0) 2013.03.11
오라클 분석함수 rank(), max(), sum()  (0) 2012.09.17
Oracle lock 확인 및 kill 방법  (0) 2012.08.08
[ORACLE]SQL*Plus에서 특수문자 INSERT하기 (&)  (0) 2012.05.14
Oracle JDBC Drivers 받기...  (0) 2012.04.04
posted by 구름너머 2012. 8. 8. 09:48

Oracle lock 확인 및 kill 방법Oracle / Development

2010/02/23 10:17

복사http://blog.naver.com/steel_cat/40101605344

1. 먼저 lock 확인을 한다.

-- lock 걸린 SERIAL_NO,SESSION_ID, OBJECT
SELECT DISTINCT t1.session_id AS session_id
,t2.serial# AS serial_no
,t1.os_user_name AS os_user_name
,t1.oracle_username AS oracle_username
,t2.status AS status
,t3.object_name
,DECODE( locked_mode
,2, 'ROW SHARE'
,3, 'ROW EXCLUSIVE'
,4, 'SHARE'
,5, 'SHARE ROW EXCLUSIVE'
,6, 'EXCLUSIVE'
,'UNKNOWN'
) lock_mode
FROM v$locked_object t1, v$session t2, dba_objects t3
WHERE t1.session_id = t2.SID
AND t1.object_id = t3.object_id;

2. 위 쿼리에서 확인한 session_id를 *SESSION_ID*에 넣으면 어떤 sql을 사용해서 lock이 걸렸는지 확인 할 수있다.

-- lock 걸린 sql
SELECT b.username username
,c.SID AS session_id
,c.owner object_owner
,c.OBJECT OBJECT
,b.lockwait
,a.sql_text SQL
,piece
FROM v$sqltext a, v$session b, v$access c
WHERE a.address = b.sql_address
AND a.hash_value = b.sql_hash_value
AND b.SID = c.SID
AND c.owner != 'SYS'
and c.SID = '*SESSION_ID*'
ORDER BY b.username, c.SID, c.owner, c.OBJECT, piece;

3. 아래 쿼리 *SESSION_ID*,*SERIAL_NO* 부분에 위 1번 쿼리에서 확인한 session_id,serial_no을 사용하여 lock 걸린 session을 kill 한다.

-- lock 걸린 SESSION kill
alter system kill session '*SESSION_ID*,*SERIAL_NO*'

4. 3번의 alter system kill session을 사용하여도 죽지 않는 경우 아래 쿼리를 사용하여 PROCESS ID를 확인하여 unix에서 직접 PROCESSkill한다.
* 주의!!! 실수하기 쉽고 위험한 방법으로 lock걸린 내용을 정확히 알지 못할 경우 kill하지 말것!!!

-- lock 걸린 PROCESS ID 찾기
SELECT DISTINCT s.username "ORACLE USER"
,p.pid "PROCESS ID"
,s.SID "SESSION ID"
,s.serial#
,osuser "OS USER"
,p.spid "PROC SPID"
,s.process "SESS SPID"
,s.lockwait "LOCK WAIT"
FROM v$process p, v$session s, v$access a
WHERE a.SID = s.SID
AND p.addr = s.paddr
AND s.username != 'SYS'

-- unix에 로그인 하여 process kill
kill -9 프로세스아이디