본문 바로가기

SQL문장의정리2

database by 낼스 2019. 7. 16.

아래의 쿼리는 세개의 필드를 합하는것인데 
LONGTIME테이블에는 필드가 세개 존재하지만, PROSPECT테이블에는 두개의 
필드 밖에 존재하진않습니다..  그러므로  0이라는 리터럴을 추가함으로써
값을 할당합니다..

SQL> SELECT NAME , LODGING, AGE FROM LONGTIME
  2  UNION
  3  SELECT NAME, ADDRESS, 0 FROM PROSPECT;

NAME                      LODGING                                   AGE
------------------------- ----------------------------------- ---------
ADAH TALBOT               23 ZWING, EDMESTON                          0
ADAH TALBOT               PAPA KING                                  23
DICK JONES                ROSE HILL                                  18
DONALD ROLLO              MATTS                                      16
DORY KENSON               GEN. DEL., BAYBAC                           0
ELBERT TALBOT             3 MILE ROAD, WALPOLE                        0
ELBERT TALBOT             WEITBROCHT                                 43
GEORGE OSCAR              ROSE HILL                                  41
GEORGE PHEPPS             206 POLE, KINGSLEY                          0
JED HOPKINS               GEN. DEL., TURBOW                           0
PAT LAVAY                 1 EASY ST, JACKSON                          0
PAT LAVAY                 ROSE HILL                                  21
PETER LAWSON              CRANMER                                    25
TED BUCHER                RFD 1, BRIGHTON                             0
WILFRED LOWELL                                                        0
WILFRED LOWELL                                                       67

16 개의 행이 선택되었습니다.


SQL> SELECT COW,BULL,LPAD(' ',6*(LEVEL-1))||OFFSPRING OFFSPRING,SEX,BIRTHDATE FROM BREEDING
  2  START WITH OFFSPRING = 'EVE' CONNECT BY COW = PRIOR OFFSPRING;
이 문장이 이해가 안가면 계속 봐야 할것 같은데요
노드 나무를 생각하세요 나무는 뿌리가 있고 그것들에는  가지들이 달려있습니다.
가지가 뻣쳐 나가다가. 또다른 세끼 가지들을 만들지요 이런 가지들을 노드라고 합니다.
그렇다면 LEVEL은 뭉었을까요 제가 보기에는 CONNECT BY문장이 사용될때만 
나타난는 내부적인 값으로 생각 되어집니다. 
루트(START WITH)를 설정하고 
그것을 역어 나가기위한 루트를 설정합니다.(CONNECT BY COW(열이름")  
그 다음에 = PRIOR OFFSPRING(열이름) 가 있는데 저두 잘 모르겠네요! 이것은
뭘까요 음 !!! OFFSPRING열의 연결고리를 COW 로 주었으니까,..
그것과 같은것을 역기 위한것이라고 생각하면 쉽지 않을까요
그래서 PRIOR를 빼버리고 생각 하면 쉽겠네요
COW = OFFSPRING 이 두열이 같은것을 찾는것이네요
COW    BULL   OFFSPRING                           SEX BIRTHDATE
------ ------ ----------------------------------- --- ----------------
              EVE                                 F
EVE    ADAM         BETSY                         F   02/01/01
BETSY  BANDIT             NOVI                    F   04/12/03
BETSY  BANDIT             TEDDI                   F   12/09/05
EVE    ADAM         POCO                          M   15/06/01
POCO   BANDIT             GINNY                   F   09/02/03
GINNY  DUKE                     SUZY              F   03/04/06
SUZY   BANDIT                         DELLA       F   11/10/08
GINNY  DUKE                     RUTH              F   25/12/06
EVE    BANDIT       GRETA                         F   12/03/01
EVE    POCO         MANDY                         F   22/09/02
MANDY  BANDIT             DUKE                    M   24/06/04
MANDY  POCO               PAULA                   F   21/12/06
EVE    POCO         CINDY                         F   09/02/03

14 개의 행이 선택되었습니다.


310page의 리포트 작성에 따른 내용입니다.

column user noprint
컬럼을정의하는데 user라는 컬럼을 정의합니다.


column partofind heading 'part|of ind' format 999.90
컬럼 partofind를 part|of ind로 나내주고 형식은 위와 같이 합니다.
column today NEW_VALUE xtoday noprint format a1 trunc
today 커럼의 세로운 이름으로 xtoday라 지정을 하고 고 길이는 a1자리 만큼으로해서 
나머지는 잘라내라는 말인가!??
ttitle  left 'current portfolio'-
        right xindustry  skip 1-
위에서 지정한 xindustry 즉 아래에 나오게될 industry 컬럼을 새롭게 
        지정한 이름일것입니다. 이것을 찍고 한칸을 띄움니다.
center 'Industry  Listing ' skip 4
Industry  Listing를 찍고  4칸을 띄움니다.
btitle left 'portfoli' xtoday-
       right 'page   ' format 999 sql.pno
  여기가 중요한것 같은데요  page를 출력하는데 sql.pno라는 부분을 주목하싶시요
여기에 page가 할당되게 됩니다.  그것을 써주면 자동으로 page가 카운터 됩니다.
clear breaks ==>
break on 아시죠 이것을 해지할경우에 사용합니다..
컬럼이름을 지정하고 그 컬럼의 내용이 변화가 생기게 되면  구분이 되게 출력이 이루어질수있읍니다.
지정한 열이름을 만날때 다음 페이지글 요구하게 됩니다.
group by 에서 사용한 컬럼을 만날경우에 그것이 적용이 될수있겠고.
order by 로 정열을 한 경우에되 반복적으로 같은 이름의 자료들이 산출 될수있다.
 이때에  적용 될수있다.
어떤 그룹을 이루어 자료들이 출력이 이루어질때 break on column, row, page, report
clear computes

 break on report on industry
 compute sum of volume on report industry
 compute avg of net percent on industryd
 compute avg of net percent partofind on report
 
=>break on  어쩌구 저쩌구하고
  compute 어쩌구 저쩌구는 함께 사용되어짐니다.
  break를 걸면서 그 시점에 알맞는 compute의 결과가 출력이된다.
  report전체에서와 industry에서 break가  걸리므로 이 시점에 적합한 compute의 결과가 출력된다.
select industry ,company, closeyesterday,closetoday, (closeyesterday - closetoday)*100 - 100 percent, volume, 
sysdate xtoday from stock order by industry

column user noprint
column partofind heading 'partof ind' format 999.90
column today NEW_VALUE xtoday noprint format a1 trunc
ttitle  left 'current portfolio'-
        right xindustry  skip 1-
center 'Industry  Listing ' skip 4
btitle left 'portfoli' xtoday-
       right 'page   ' format 999 sql.pno
 clear breaks
 clear computes
 break on report page on industry page
 compute sum of volume on report industry
 compute avg of net percent on industryd
 compute avg of net percent partofind on report
 
select industry ,company, closeyesterday,closetoday, (closeyesterday - closetoday)*100 - 100 percent, volume, 
sysdate today from stock order by industry


SET TREMOUT OFF, SETTERMOUT ON
이 명령어는 SPOOL 명령어 사용시에 사용된다. 
화면에 출력되는 결과를 보이지 않고 곧바로 화일로써 출력을 하기를원한다면
@화일명 이렇게해서 실행을 시킬경우에 실행결과가 보이는 여부를결정하는것이다.
SET TERMOUT off로 설정을 하면 화면에 자료가 보여지지않는다.
SET TERMOUT on늘 해주면 하면에 자료가 출력된다.
형식은 이와 같이 사용하면 될것이다.
set termout off
spool kim.lst
쭉 나머지를 작성합니다.
spool  off
set termout off

 column closetoday heading 'close|today' format 999.90
   ===>  closetoday라는 컬럼의 헤딩을 closetoday로 이름짓는다. 근데 
   ===>  그 사이에 |이게  보일것이다. 이것은 set headsep으로 지정한 문자를 쓰면된다.
보려면 show headsep을 사용합니다.
 column closeyesterdat heading 'close|yest' format 999.90
 column Volume format 999,9999,999
 accept xcompany prompt 'Enter  Company Name : '
  입력을 받을 변수를 xcompany로 지정을 하고 그것의 프롬프트이름은 Enter Company name :으로지정합니다.
 select company, closeyesterday, closetoday, volume
 from stock  where company = '&xcompany';
입력으로 사용할 변수는 &변수이름 이렇게 지정합니다.


 직접 변수에 값을 지정하려면 DEFINE XCOMPANY  = "IDK" 이렇게 하면 됩니다.

SET ECHO OFF/ON 은 실행 문장을 화면에 출력하느냐 안하느냐를 결정한다.
  OFF시에는 화면에 출력하지 않고 ON시에만 화면에 출력한다.
SET VERIFY OFF  은 예제를 보고 살펴보도록 하겠다.
SQL> SET VERIFY ON
SQL> @321_PAGE
Enter  Company Name : IDK
구   2:  from stock  where company = '&xcompany'
신   2:  from stock  where company = 'IDK'

COMPANY              CLOSEYESTERDAY close|today        VOLUME
-------------------- -------------- ----------- -------------
IDK                              95       95.25      9443,523
ON으로 한결과 구,신 전에 입력한 값에대해서 출력을 하였다.........
OFF시에는 이런 값들을 출력하지 않느다. 까먹지 말기를...


SELECT LEVEL,COW,BULL,LPAD(' ',6*(LEVEL-1)) || OFFSPRING OFFSPRING,SEX,BIRTHDATE 
FROM BREEDING
START WITH OFFSPRING ='EVE'
CONNECT BY COW = PRIOR OFFSPRING
ORDER BY LEVEL 

START WITH OFFSPRING ='EVE'
이부분이 중요하다...   OFFSPRING 가  = EVE 인것 부터 시작을 해라 이 말인데 
그 것은 EVE 와 같은것으로  연결이 되는 것이다.
열이름1에서 EVE인것을 찾아본다.  찾는 자료가 있으면 열이름2로 연결이되어 꼬리에 꼬리를 물고 
해당열을 찾는것이다...
 -----------------------------------------------
           A                 |             B
 -----------------------------------------------
   CONNECT BY 열이름1        =   PRIOR 열이름2 
   CONNECT BY PRIOR 열이름2  =   열이름1

=>>> 이렇게 순서가 바뀌어도 아무런 상관이없다.
PRIOR는 자석과 같다.....
자료를 찾아 가는 방향을 결정한다.......PRIOR가 있는 쪽으로 자료를 찾아간다.
지금은 열이름1에서 열이름2로 연결이 된다...


noprint 란 ?
column user noprint 컬럼을 화면에는 출력하지 않기 위함 입니다..

decode함수의는 
어떤 열의 수치들에 대해서 값들이 어떤 것이면 어떤 값을 할당하고 
또 어떤 값이면 어떤 다른 값을 할당하는 함수이다..
이것은 단순이 equal일때만 처리가 이루어지는것으로 이해 할수있지만..
 
더 큰값 더 작은값 그리고 같은값에 대한 처리를 할수있다..
그것은 값의 부호르 반환하는 sign함수를 사용하는것으로 가능하다..

select decode( sign((열이름 - 1(비교를 원하는 값)),1,할당값설정,-1, 할당값설정,0,할당값설정)
 from 테이블이름

페이지 385 참조 하기 바랍니다.

어떤 값에서 -10을 뺀 값이 양수이라면 이값은 10보다는 큰값으로 인식을 할수있습니다.
                          음수이라면 이값은 10보다는 작은 값이라는것을 알수있습니다.
   0이라면    10과 같은값이 됩니다...
위에서 decode함수와 sign함수를 이용하면 이런 처리가 가능합니다.

가상열에 대해서 
sysdate, UID,User,Userenv,currval,Nextval,Level,Rownum,rowid
SQL> SELECT ROWID,SUBSTR(ROWID,  15,  4)  AS  "FILE", 
SUBSTR(ROWID,    1,  8)  AS  "BLOCK" ,
SUBSTR(ROWID,  10,  4)  AS  "ROW" FROM  dual;
ROWID              FILE     BLOCK            ROW
------------------ -------- ---------------- --------
000001F1.0001.0001 0001     000001F1         0001
+> 블록   row   파일

ROWNUM  란 ?
각열의 행의 번호가 자료가 검색이됩에 따라 출력이 되게된다.. 
이번호는 내부적으로 존재하는값이며.. 테이블에 포함되어지는것이 아니고 
오라클 내부적인 상수이다... 
예제)
SQL> select rownum, name, decode(mod(rownum,5),0,'$',null) a from worker;

   ROWNUM NAME                      A
--------- ------------------------- -
        1 BART SARJEANT
        2 ELBERT TALBOT
        3 DONALD ROLLO
        4 JED HOPKINS
        5 WILLIAM SWING             $
        6 JOHN PEARSON
        7 GEORGE OSCAR
        8 KAY AND PALMER WALLBOM
        9 PAT LAVAY
       10 RICHARD KOCH AND BROTHERS $
       11 DICK JONES
       12 ADAH TALBOT
       13 ROLAND BRANDT
       14 PETER LAWSON
       15 VICTORIA LYNN             $
       16 WILFRED LOWELL
       17 HELEN BRANDT
       18 GERHARDT KENTGEN
       19 ANDREW DYE
       20 ANDREW DYE                $
20 개의 행이 선택되었습니다.


뷰에대해서 : 뷰란 테이블에 존재하는 데이터베이스들을  select문을 이용하여 생성된
     새로운 질의 테이블을 만드는것을 말한다.


후보키(candidate key)이키로 지정을하는방법은 not null로 지정을 하는것으로 할수있습니다.
not null로 지정하고 기본키인 열들에 의미를 두기위해서 사용되어집니다.

기본키(primay key)는 몇가지 특성을 부영한 후보키의 일종입니다.
   단하나의 기본키를 가질수도 있고 다수의 기본키를 가질수도있습니다. 
기본키열은 null을 가질수도 없습니다. 
테이블의 생성을위한 문장에서 unique 제약 조건을 가질수 있지만 단  하나의 primay key 제약 조건만을 
가진다는것만 제외하면 이전의 것과 동일하다고 할수있습니다.

외래키(foreign key)
이것은 다른 테이블의 기본키 항목에 기초하여 생성이 될수있는 키입니다.
기본키 항목으로 지정이된 열의 값에 존재하는 값 만이 외래키를 정의한 테이블에 추가되어질수있습니다.
이것을 무결성이라고 합니다. . 

Create table  worker(
name varchar2(25) primary key,
age number,
lodging varchar2(15) references lodging(lodging)
);

이 테이블을 잘 살펴 보자.. 
외래키를 지정하는데는 lodging varchar2(15) references lodging(lodging) 이렇게 사용하였다..
이 의미는 lodging 라는 열을 선언하는데  varchar2형으로 15자리를 잡고
이것은 참조 되어지는데 lodging테이블의 lodging필드 기본키 항목에 의거해서 
외래키로 선언이 된것이다..

   형식 ::>  references 테이블명(필드명)

검사 제약 조건(check constraint)
많은 열이 반드시 특정 범위 내에 들거나 혹은 특정 조건을 만족해야 합니다..
 검사 제약 사항을 사용하면 테이블에 있는 모든 행에 대해 항상 참이어야한다.
 예를 들면 talbot이 나이가 18세 에서 65세 사이인 근로자들을 찾고자한다면 제약 조건을 지정할때 
아래와 같은 제약을 둘수있습니다.

create table worker (
name char(25) primary key,
age number check (age between 18 and 65)
lodging char(15) reference lodging(lodging)
);
형식 ::>  check (열이름 between A and B)

테이블의 삭제는 테이블의 사용이 불필요할때에 이루어집니다.

형식 ::>  drop table 테이블명;

테이블에 대한 정의를 삭제하지 않고도 테이블에 있는 모든 행을 삭제하고
이들 공간을 다른 용도로 사용할수있습니다.

 truncate table trobule;

ALTER TABLE 란?
 형식 ::>  alter talbe 테이블명 add( 열이름  데이터형)
    modify(열이름  데이터형)
테이블의 이름이나 데이터형을 수정, 추가 할수있다.

오라클 에서는 리두로그 엔트리를 
(데이터 베이스 복구시 사용되는 시간별 데이터 베이스 처리의 기록)
를 작성하지 않는 조회를 기초로하여 테이블을 작성할수잇습니다.
이들 엔트리의 작성을 피하려면 create table명령에 키워드 unrecoverable을 사용하면 됩니다.
리두 엔트리들이 이런식으로 순환한다면 처리해야할 작업이 줄어들기 때문에 
create table 명령의 퍼포먼스는 향상이 될것입니다.
새로운 테이블을 작성에 대한 내용이 데이터베이스를 복수하기 우해 사용되는 
리두로그 파일에 존재하지 않기 때문에  해당 테이블은 데이터베이스 파손시 재작성 되지 못합니다.
따라서 선택 사항 Unrecoverable을 사용하였고 해당 

****** unrecoverable을 사용하면,  데이터 베이스 복구시에 사용되는 시간별 데이터 베이스처리 기록
을 작성하지 않기 때문에 수행시간을 절약 할수있다..


권한 ( Grant )
정보라는것은 성공을 위해 필수적인것이다. 그렇지만 손상을 입거나 잘못 처리하면 성공을 위협할수도 있습니다.
Oracle은 허가 없이 내용을 검색하는 것부터 고의적이거나 부주의로 인한 손상에 이르기 까지  정보를 보호하기위한 광범위한 
보안 기능을 제공합니다. 이러한 보안기능은 사용자 및 특권 단위로 부여 혹은 취소 가능합니다.
  오라클은 create user,create role, 그리고 grant 명령을 사용하여 데이터에 대한 접근을 제어합니다.

모든  oracle사용자는 자신이 작성한 테이블 , 뷰 그리고 기타 여러 자원을 소유할수있으며 , 사용자 암호를 가지고 있습니다.

 Role 이란?  특권을 가진 하나의 집합입니다.  특정한 권한을 롤에 부여할수있으며 그런후 이롤을 적절한 사용자에게 지정할 수있습니다.
사용자도 다른 사용자에게 직접  특권을 주여할수있습니다.
데이터 베이스 시스템 특권은 특정 명령의 집합을 실행할 수있게 해줍니다.
예를들면 Create Table 특권은 테이블을 작성할수있게 해줍니다.
GRANT ANY PRIVILEGE특권은 어떤 시스템 특권이든지 다른 사용자에게 수여할수있도록 허용합니다..
 
사용자의 작성 !
create user user identified (by password | externally);
이명령으로 지정할수있는 다른 특권들이 많습니다...........
 create user george identified  by avocado
 형식 ::> Create 사용자이름 identified by 암호
이제 Georege의 계정이 존재하고 암호에 의해 보호됩니다.

사용자의 암호를 변경합니다.
alter use george  identified by  psyche
형식 ::>  alter use  사용자이름 indentified by 암호
이렇게 하면 암호가 변경이 됩니다.

그렇지만 George가 오라클에  대해서 할수잇는 일은 무엇일까요??
지금으로써는 시스템 관련 특권을 가진것이없습니다.
오라클은 이전 버전의   CONNECT,REWOURCE,DBA특권과의 호환성을 위해 세개의 
표준 롤을 제공합니다.

connect 롤 
테이블을 작성할 필요가 없는 사용자는 Connect롤 특권만을 가집니다.  이권한은 
타인 소유의 특정 테이블에 대한 액세스 권한과 이 테이블에 대한 select,insert,update,delete할수있는 권한을 가집니다.
 connect 롤을 소유한 사용자는  create tables,view sequences,clusters ,synonyms,sessions, 그리고 데이터 베이스로의 links 처리를 수행할수잇습니다.

Resource 롤 
좀더 숙련된 사용자에게는 Resource롤을 부여할수있습니다.  resource는 사용자로 하여금 추가로 자신의 테이블,시퀀스 ,프로시저, 트리거, 인덱스, 및 클러스터를 
생성할 수 있는권한을 가집니다.

DBA 롤 
무제한 쿼터 사용 그리고 각종 특권을 다른 사용자에게 부여할수있는 권한 짱입니다..

Grant 명령의 포맷

형식 ::> grant {system privilege| role}
[,system privilege | role},.  .  .]
to {user | role} [, {user | role} ] .  .  .
[with admin option]
예제 1) 
  Create user softmind identified by 1742;
grant CONNECT to softmind;
::> 사용자 softmind 를 생성하고 CONNECT롤 특권을 부여합니다.
grant CONNECT,RESOURCE to softmind
::> 사용자 softmind 를 생성하고 CONNECT롤,RESORCE 특권을 부여합니다.
수여한 명령의 박탈에 사용하는 명령어!
형식 ::> revoke {system privilege |role}
[, {system privilege | role},.  .  .]
from {user |  role} [, {user | role}]

 개개의 DBA롤은 다른 DBA를 포함하여 모든 사용자 소유의 connect, resource,및 DBA특권을 포함한 어떤 특권이라도 취소할수있습니다.
 물론 이것은 상당히 위험한 것이며,바로 DBA 특권이 정말로 필요한 극소수의 사용자 외에는 절대 부여하면 안되는 이유입니다. 

어떤 사용자에게서 각종 특권을 취소 한다고해서 이 사용자가 Oracle에서 삭제 되거나 소유한 모든 테이블이 삭제되는것은 아닙니다.
이것은 단순히 해당 사용자로 부터 지정된 권한만을 제한하는것입니다.
이 사용자 소유의 테이블에 대한 액세스 권한을 가진 다른 사용자는 여전히 기존에 가졌던 특권을 그대로 사용할수있습니다.


사용자 없애 버리기

형식 ::>    drop user 사용자명 [cascade]; 
cascade옵션은  해당 사용자를 참조 무결성 제약조건을 포함하여 소유한 모든 오브젝트를 삭제합니다.
cascade옵션은 삭제된 사용자의 스키마에 있는 오브젝트를 액세스하는 뷰, 동의어 , 저장 프로시저,함수,혹은 팩키지들을 무효로 만즐어 버립니다. 
cascade옵션을 사용하지 않으면 , 그리고 여전히 해당 사용자 소유의 오브젝트가 존재한다면 , 오라클은 사용자를 삭제하지않습니다.


권한의 설정에 사용되는 Grant, revoke, ..
무언가를 생성할때는 Create .... 
변경할때            alter ....

grant select on worker to public;
모든 사용자에대해 worker테이블에 select 권한을 부여한다.

alter user bob;
quota 100M on users;
bob이 users테이블스페이스에 100M의 할당량에 대한 권하을 부여 받습니다.

사용자 영역 할당량은 사용자가 작성될때 Create user 명령을 통해 지정할수있습니다.


제가 그렇게도 궁금하게 여기던  인덱스에대해 나왔습니다...
인덱스라는것은 간단한 개념입니다. 일반적으로 이것은 주제에 따라 정보가 있는곳에 수반되는 키워드를 
나열한것입니다. 예를 들어 인덱스에 관한 정보를 찾으려면  이책자의 맨 뒤에 있는 인덱스에서 index를 찾습니다.
여기에는 현재 읽고있는  페이지가 표시되어있을 것입니다..   
단어 'index'가 키가 됩니다. 그리고 그곳에 표시되어있는 페이지 번호가 
이책자의 인덱스에 관한 논의를 하는 위치를 가리킬것입니다.
인덱스는 사용하면서 처리속도를 높일수있습니다. 예를들어  
인데스에 관한 정보가 필요할때, 
 이정보를 발견할 때 까지 책을 읽음으로써 찾는 방법이 있기는 하지만 
이것은 상당히 느리고 시간을 많이 소모하는 방법입니ㄷ. 
이책자의 뒷부분에 잇는 인덱스는 알파벳순으로 정돈되어있어서 "인덱스"가
있는곳을 알려주는 인덱스의 적절한 부분으로 신속하게 찾아갈수있기 
때문입니다.  분명히 이것은 책 전체를 처음부터 끝까지 읽어나가는것보다. 더 빠른방법입니다.
이와 같은 원리가 오라클의 인덱스에서 사용 되어집니다... 
hockey라는 테이블을 살펴봅시다.

Create index 인덱스이름 on 테이블명 (열명)

인덱스는 많은 양의 데이터가 다양하게 구성된 열에 대해 가장 유용합니다.
예를드면 어떤회사가 Y 혹은 N을 가진 고객이라는것을 표시하는 열은 인덱스를 
위해 좋지 못한 선택일수있습니다.
그리고 실제로 조회가 느려질수있습니다. 전화번호는 훌륭한 후보가 될수있습니다.
그중에서 지역번호 열은 특히 효과적일수있습니다.

기본키가 한 이상의 열을 포함하고 있을때에는 변화 많은 것을 기본키제약조건에서
먼저 위치시키는것이 좋습니다. 해당 열이 상대적으로 비슷한 정도의 다양성을 가진다면
가장 자주 액세스되는쪽을 먼저 위치시키도록하십시오.
크기가 작은 테이블은 기본키에서 유일성 제약조건을 지정한것이 아니라면 인덱스를 지정하지 않는 편이 
유리합니다.  여기서 작으 테이블이란 행의수가 30개 이하인것을 의미합니다. 실제로 애플리케이션에서는 100행이상도 
소규모로 취급될수있습니ㅏ. 그이상이라면 인덱스를 사용하는 편이 거의대부분의 경우에 생산적입니다.

최대 인덱스의수
하나의 테이블에서  최고 16개 까지의 열에 대해 단일인덱스를 작성할수있습니다.
혹은 사용중이 오퍼레이팅 시스템에 따라 인덱스  당 최고 1000 에서 2000바이트를 점유할수있습니다.
너무 많은 열에 대해 인덱스를 지정하는 경우의 단점은 새로운 행의삽입 시의 속도입니다.
모든 인덱스는 어떤행이 insert될때 , 자신도 역시 하나의 엔트리를 가져야 되기 때문입니다.
 사용중인 테이블이 주로 조회를 위한것이라면 가능한 모든 인덱스를 가진데 따른 비용은 약간의 디스크 공간을 사용하는
것뿐입니ㄷ. 대부분의 경우 인덱스를 사용하는 것이 디스크 공간 사용에 따른 비용보다 더 효율적입니ㄷ.
클러스터 인덱스를 제외하고는 null인 열은 인덱스상에 나타나지 않습니다. 

이해가 잘 안돼요 !!
마치겠군요! 황당하기도 하구요!!
이런일이 우째!
특정 테이블 스페이스를 지정하여 어떤 테이블에 대한 인덱스를 데이터베이스내에서 어디에 위치시킬지를 결정할수있습니다.

테이블 스페이스란 ? 테이블과 인덱스가 저장되는 영역이며
하나의 데이터 베이스는 여러개의  테이블 스페이스를 독자적인 명칭과 함께 가질수있습니다.
인덱스는 물리적으로 데이터 테이블 스ㅍ;이스와는 분리된 별도의 테이블 스페이스에 저장하느것이 
좋습니다. 이렇게 하면 테이블 스페이스 파일간의 디스크 경합을 줄일수 있습니다.
인덱스를 위치시킬 테이블 스페이스를 지정하려면 다음과 같이 
create index 문다음에  tablespace라는 단어와 테이블 스페이스 명을 지정합니다.

create index workerskill_name on worker(name,skill)
tablespace gbtalbot;
gbtlabot은 테이터베이스 관리자에 의해 이전에 작성된 테이블스페이스의 명칭입니다.
이것의 사용은 대형 데이터베이스의 경우에  최적화나 공간 사용량이 중요시여겨질때 사용되어집니다.

기본키나 유일성 제약을 만들때 자동적으로 유일성을 보장하기위해 인덱스를 작성합니다.
별도로 지정하지 않는다면 테이블과 동일한 테이블 스페이스에 인덱스가 작성되어집니다.
제약조건은 테이블 스페이스에 대한 디폴트 영역 파라미터를 사용합니다.
왜냐하면 이영역 위치가 일반적으로 바람직하지  않기 때문에 기본키와 유일성 제약 조건을 작성할 때에는 
using index 절을 활용하여야 합니다.
using index절은 제약 조건을 작성할때에는 using index절을 활용해야 합니다.


이해가 안돼었는데 장전임님의 설명으로 느낌이 조금은 오는것 같다.
인덱스라고 하는녀석은 어떤 테이블을 대표할수있는 열을 선택하여 만들어진 부분집합 테이블이다.
그렇게 함으로써 많은 레코드들이 많은 열에 걸쳐 존재할경우에
where  조건을 사용해서 검색을 할때...  인덱스 테이블을 참고하여 검색이 이루어진후 그조건에 만족하는
ROWID를  얻을수있고 그 선택되어진 rowid를 찾는것으로 검색의 효율을 높일수있다.
자료가 많을 수록 검색 효율이 높아진다. 자료의 양이 적은경우에는 index를 생성하지 않는편이 더 나을지도 모른다.

constraint pk_stock primary key (company)
usgin index tablespace indexes 
storage (initial  20k next 20k),
constraint uo_stock unique (symbol)
using index tablespace INDEXES
storage (initial 20k next 20k)
1. 인덱스를 생성하는 방법은 여러가지가있다. 기본키를 설정을 하면 그것에대한 인덱스가 디펄트로 생성이 되어지며..
   이름은 오라클이 임으로 지정하게되는방법
2. create index 인덱스이름 on 테이블이름(열명,..)
   tablespace 테이블스페이스 이름
3. 테이블 생성시에 사용하는방법으로 
constraint 기본키명 primary key (열이름)
using index tablespace INDEXES
강제적으로 기본키나.. 대체키를 사용하여 열을 지정하후 그것을 
인덱스키로 사용한다.. 그리고 테이블 스페이스까지 지정이 가능하지요!
constraint pk_stock primary key (company)
usgin index tablespace indexes 
storage (initial  20k next 20k),
constraint uo_stock unique (symbol)
using index tablespace INDEXES
storage (initial 20k next 20k)

파일은 정보가 저장되어있는 디스크상에 있는장소이며 명칭을 가집니다. 이것의 크기는 대개 고정적이지않습니다.  파일에 정보를 추가하면
가능한 최대 크기에 이를 때까지 확장되며 서로 떨어져 있는 디스크에 작은 부분으로 나누어 보관하기도 합니다. 
오라클에서도 파일은 자신을 구성하는 체계의 한 부분으로 사용합니다. 그렇지만 이것의 논리적 구조는  파일의 개념을 초월합니다. 

테이블 스페이스는 많은 테이블, 인덱스 혹은 클러스터 등을 포함 할수있습니다.
왜냐하면 테이블스페이스는 고정된 크기를 가지며 내부에 잇는 테이블에 행이 추가 됩에 따라 가득 차게 될수있기 때문입니다.
이런일이  발생하면 , 테이블 스페이스는 DBA의 권한을 가진 누군가에 의해  확장 될수있습니다.
확장은 새로운 디스크 파일을 만들어서  이것을 해당 테이블에 추가하거나 혹은 오라클의 경우에는 이미 사용중인 
데이터 파일을 확장하는 방법에 의해서 처리됩니다.  그런다음 새로운 행들이 기존 테이블에 추가될수있으며 
따라서 이들 테이블은 양쪽 파일에서 행들응 가질수있습니다.
하나이상의 테이블 스페이스가 모여 하나의 데이터 베이스를 구성합니다.
각 테이블은 테이블 스페이스 내에 세그먼트라 불리는 하나의 디스크 영역을 가지고 있습니다.
 각 세그먼트는 차례로  initial extent라 불리는 테이블 스페이스에 잇는 영역을 초기 디스크 영역으로 가집니다.
일단 이 공간을 차지하면 next extent라 불리는 테이블 스페이스라고 하는 또 하나의 디스크 영역이 마련됩니다.. 
이런한 과정은 전체 테이블 스페이슬가 가득차게 될때 까지 모든 테이블 스페이슬에 추가하거나 혹은
테이블스페이스가 사용하는 파일을 확장해야합니다.


테이블 스페이스의작성
Create tablespace TALBOT datafile 'HOME.ONE' size 1000k
default storage (initial 25k next 10k
minextents 1 maxextents 100 pctincrease 0);

create tablespace 테이블명 datafile '파일명' size 1000k
default srorage (initial 25k next 10k minextents 1 maxextents 100
pctincrease 0);
여기서는 create table로 테이블을 생성할때 값을 지정하지 않은경우 
디펄트로 값을 할당하기 위한 부분입니다.

초기값은 25k바이트  다음 익스텐트는 10k바이트
최초로 테이블이 만들어질 때 추가의 익스텐트를 확보할수있게 해줍니다. 
이것들은 반드시 초기 익스텐트와 혹은 이들 서로간에 연속적 이어야 할필요는 없지만 적얻 공간은 확보
되어있어야합니다. 이말은 음... 테이블과테이블사이의 간격을두어 구분을하겠다는 의미도 될수잇겟네요
아닌가요 ... 그럼 최소의 테이블 사이즈 쯤으로 이해라면 되려나요..

그 옆의 maxextents는 뭘까요 ?  허용되는 추가 익스텐트의 한계치입니다.
초기값이 25가잡히고 이것을 다쓰면 10k바이트의 다음 익스텐트를 사용합니니다..
그것도 모자라다면  익스텐트의 추가가 이루어질수있습니다. 그것의 한계치를 정의한것입니다.

pctincreases는 익스텐트의 확장인수입니다.0이 아닌 값을 지정한 경우 각 점증 익스텐트는 그것 앞에 있는겁보다 더크게 지정이된 
백분율이 될것입니다.
이것은 점차증가 되는데  테이블에 의해사용되는 익스텐트의 수와  비연속적 공간을 감소시키는 효과가 잇습니다. 
영역에 대한 디폴트 값은 오퍼레이팅 시스템 고유 사항입니다. 

테이블 스페이스를 작성을하고 datafile '파일이름지정' size 1000K  : 이렇게하면
1000k 의 공간으로 지정된 화일이름의 테이블 스페이스가 작성이 됩니다. 
공간이 잡히면 default storage(테이블생성시 디펄트로 잡히는공간의지정)
   ::::>  초기화일25k 다음영역은 10k바이트씩 추가되어질수있고  ...
잘 이해가 안가는데 넘어가구요 다음..




 

'database' 카테고리의 다른 글

오라클 아우터조인  (0) 2019.07.16
sql 권한(grant)  (0) 2019.07.16
SQL문장의 정리  (0) 2019.07.16
Oracle SQL - DDL,DML,  (0) 2019.07.16
oracle tns 확인  (0) 2019.07.16

댓글