2013. 2. 13. 09:20

[Oracle] ROLLUP, GROUPING SETS

** ROLLUP

 

- 그룹조건에 따라 전체 행을 그룹화하고, 각 그룹에 대한 부분합을 구하는 연산자

 

- ROLLUP절에는 255개의 컬럼까지 가능

 

- ROLLUP절에 컬럼의 개수가 n개이면 그룹핑 조합은 n + 1개

 

 

** GROUPING SETS

 

- 동일한 퀴리에 대해서 다양한 그룹핑을 정의 가능

 

- 개별로 그룹핑하여 UNION ALL한 경우와 동일하나, 성능적인 면에서 뛰어남

 

 

SQL >

 SELECT JBDATE, BAYONG, SUM(CHARGE) CHARGE
   FROM INVCON
  WHERE JBDATE BETWEEN '2013-02-04' AND '2013-02-06'
    AND BAYONG IN ('BS01','BS03')
GROUP BY ROLLUP (JBDATE, BAYONG);

 

 

SQL >

 SELECT JBDATE, BAYONG, SUM(CHARGE) CHARGE
   FROM INVCON
  WHERE JBDATE BETWEEN '2013-02-04' AND '2013-02-06'
    AND BAYONG IN ('BS01','BS03')
  GROUP BY GROUPING SETS ((JBDATE, BAYONG), (JBDATE), ());

 

 

>> 동일한 결과 나옴

JBDATE     BAYO     CHARGE
---------- ---- ----------
2013-02-04 BS01      90508
2013-02-04 BS03     559711
2013-02-04            650219
2013-02-05 BS01     176733
2013-02-05 BS03     533863
2013-02-05            710596
2013-02-06 BS01      93938
2013-02-06 BS03     371616
2013-02-06            465554
                          1826369

 

 

SQL >

 SELECT JBDATE, BAYONG, SUM(CHARGE) CHARGE
   FROM INVCON
  WHERE JBDATE BETWEEN '2013-02-04' AND '2013-02-06'
    AND BAYONG IN ('BS01','BS03')
  GROUP BY GROUPING SETS ((JBDATE, BAYONG),());

 

 

>> JBDATE의 그룹핑은 제외

JBDATE     BAYO     CHARGE
---------- ---- ----------
2013-02-04 BS01      90508
2013-02-04 BS03     559711
2013-02-05 BS01     176733
2013-02-05 BS03     533863
2013-02-06 BS01      93938
2013-02-06 BS03     371616
                          1826369

 

 

2013. 2. 8. 10:47

[Oracle] Session Timeout

SQL> SELECT PROFILE, LIMIT FROM DBA_PROFILES WHERE RESOURCE_NAME = 'IDLE_TIME';

PROFILE                        LIMIT
------------------------------ ----------------------------------------
DEFAULT                        UNLIMITED

 

 

SQL> SELECT PROFILE FROM DBA_USERS WHERE USERNAME = USER;

PROFILE
------------------------------
DEFAULT

 

 

sqlnet.ora에도 timeout 설정하는 부분 있습니다. 그건 network단으로 idle time 조정하는 것입니다.


sqlnet.expire_time = 3   (단위 : 분)

 

 

'Database / Sql' 카테고리의 다른 글

[MSSQL] LOCK 확인 및 처리 방법  (0) 2013.03.05
[Oracle] ROLLUP, GROUPING SETS  (0) 2013.02.13
[Oracle] 테이블 하나만 복원하기  (0) 2013.02.07
[Oracle] SID와 Service Name의 차이  (0) 2013.01.25
[Oracle] ROWID 구성  (0) 2013.01.03
2013. 2. 7. 11:35

[Oracle] 테이블 하나만 복원하기

imp userid/userpass file = data_bak.dmp fromuser = kice tables = (PRGVER)

=> imp 유저아이디/패스워드 file = 덤프파일이름 fromuser = 덤프테이블유저이름 tables = ( 필요한테이블 여러개일때에는 , 로 )

 

복원할 테이블은 삭제해두어야 한다. 그렇지 않으면 이미 있는 객체라고 해서 오류 발생.

 

임시테이블 하나 만들어 놓고 복원할 테이블 DROP.

 

CREATE TABLE PRGVER_T AS ( SELECT * FROM PRGVER );

 

DROP TABLE PRGVER;

 

 

'Database / Sql' 카테고리의 다른 글

[Oracle] ROLLUP, GROUPING SETS  (0) 2013.02.13
[Oracle] Session Timeout  (0) 2013.02.08
[Oracle] SID와 Service Name의 차이  (0) 2013.01.25
[Oracle] ROWID 구성  (0) 2013.01.03
클러스터인덱스와 비클러스터인덱스 차이  (0) 2013.01.03
2013. 1. 25. 15:08

[Oracle] SID와 Service Name의 차이

일반적인 테스트 환경이나 소규모의 경우 한개의 DB서버에 한개의 인스턴스만 사용한다.

이런 환경에서는 SID와 Service Name을 구분할 필요가 없었던것이다.

단순히 구분짓자면 이렇게 말할수 있다.

 

SID = DB 하나의 인스턴스

 

Service Name = 여러개의 인스턴스를 모아 하나의 서버 혹은 시스템을 구성한것

 

쉽게 예를 들어보자.

서버 한대에 인스턴스를 여러개 생성하여 orcl1, orcl2 로 각각 생성했다고 하자.

각각의 인스턴스는 orcl1, orcl2 라는 SID를 갖게 된다.

해당 서버에서 두개의 인스턴스를 묶어 사용할경우, orcl 이라는 Service Name을 갖을수 있다.

이외에도 서버 두대에 설치하여 각각 미러링 처리하여 동일한 서버인것 처럼 활용할경우

각각의 서버는 서로다른 SID를 갖게 되지만 Service Name을 동일하게 하여 같은 서버 처럼 활용할수 있다.

 

 

1. 오라클 데이타베이스명 확인하는 방법

SELECT NAME, DB_UNIQUE_NAME FROM v$database;

 

2. 오라클 SID 확인하는 방법

SELECT INSTANCE FROM v$thread;

 

 

'Database / Sql' 카테고리의 다른 글

[Oracle] Session Timeout  (0) 2013.02.08
[Oracle] 테이블 하나만 복원하기  (0) 2013.02.07
[Oracle] ROWID 구성  (0) 2013.01.03
클러스터인덱스와 비클러스터인덱스 차이  (0) 2013.01.03
[Oracle] PL/SQL - SELECT INTO  (0) 2012.12.21
2013. 1. 3. 13:19

[Oracle] ROWID 구성

* DB에 존재하는 모든 ROW가 갖는 유일한 식별자

* ROWID는 SELECT문을 이용하여 조회 할수 있지만 UPDATE문을 이용한 UPDATE는 불가능

* INSERT문을 이용해서 강제로 부여할수 없음

 

 

ROWID 구성 정보

 

 

 

000000 FFF BBBBBB RRR ( 6 + 3 + 6 + 3)

 

Display : 18자리

저장 : 10자리

 

000000 : Data Object Number :DB Segment 식별 정보

(해당 로우가 속해 있는 오브젝트 번호)

 

FFF : Relative File : Tablespace에 상대적 Datafile 번호

(해당 로우가 속해 있는 데이터 파일 번호)

 

BBBBBB : Block Number : Row를 포람하는 Data Block 번호

(해당 로우가 속해있는 데이터 파일의 데이터 블록 주소값)

 

RRR : Row Number : Block에서의 ROW의 SLOT

(데이터 블록 내에서 해당 로우의 주소 값)


출처 : http://blog.naver.com/speedsky98/120045820683

 

 

2013. 1. 3. 10:31

클러스터인덱스와 비클러스터인덱스 차이

[인덱스] - 색인


책에서 원하는 내용을 빨리 찾으려면 인덱스를 이용(책의 인덱스와 비슷한 개념)
DB도 사용자가 원하는 내용을 빨리 찾으려면 색인이란 정보를 미리 만들어서 원하는 데이터를 빨리 찾을 수 있게 할 수 있다.

데이터베이스내의 테이블에서 원하는 정보를 좀더 빨리 찾아줄수 있게  데이터의 위치 정보를 모아놓은 데이터베이스내의 객체 object이다.


 
* 인덱스는 정렬되어 있다.
  예1) 사진에서 원하는 데이터를 찾을때
  예2) 책에서 책뒷부분의 인덱스 페이지
 

table scan  -- 전부다 검색
index seek  -- 원하는 페이지만 검색
===========================================
* 포인트쿼리   point query
  조회되는 데이터가 한두개
  select * from tb_member where uid = 'kim'    -- 값이 하나
 
* 범위쿼리   range query
  조회되는 데이터가 다수
  select * from tb_member where regdt = '2008/06/19'    -- 값이 다수
 
* 커버드쿼리  covered query
  조회의 대상과 조회의 결과가 컬럼이 일치하는 상태
  인덱스 측면에서 제일 빠른 성능을 냄
 
select * from tb_member

 where uid = 'kim' and upw = '1234'    -- 커버드 쿼리 아님 포인트쿼리
 
select uid from tb_member
 where uid = 'kim' and upw = '1234'    -- 커버드 쿼리


1. clustered index 클러스터 인덱스
형식) create clustered index 인덱스명
        on 테이블명(칼럼명 오름/내림)
해당 컬럼을 기준으로 정렬, 테이블당 1개씩만 허용.
데이터를 여러개 조회하는 범위 쿼리이건, 하나만 조회하는 포인트 쿼리건 둘다 성능 발휘.
primary key  설정시 그 컬럼에 자동으로 클러스터드 인덱스가 만들어진다.
이 컬럼은 데이터 입력, 수정, 삭제시 항상 정렬을 유지한다.
기본적으로 인덱스는 정렬되어 있다. <<-- 이자체가 인덱스
즉 그 인덱스가 사전식으로 정렬 된다.


2. nonclustered index 넌클러스터 인덱스 

인덱스 페이지 따로 만든다. 용량이 더 차지 한다.(로그파일에 저장)
기존의 테이블 + 넌클러스트 인덱스테이블
형식) create nonclustered index 인덱스명
        on 테이블명(칼럼명 정렬)
인덱스 페이지 따로 만든다.
레코드 원본은 정렬 안된다.
테이블당 240개 정도 만들수 있다.
포인트 쿼리는 성능발휘/ 범위 쿼리는 장담 할 수 없다.
 

예) 클러스터 인덱스는 책을 비유하자면 페이지를 알기 때문에 바로 그 페이지를 펴는 것과 비교되는것이고
넌클러스터 인덱스는 뒤에 목차에서 찾고자 하는 내용의 페이지를 찾고 그 페이지로 이동 하는것과 같다.
테이블스캔은 처음부터 한장씩 넘기면서 내용을 찾는것과 같다.
 
-- 포인트 쿼리일때 비교 : 포인트 쿼리에서는 별다른 속도 차이가 없다.

-- 인덱스 추가 범위 쿼리일때 비교

select * from w_zipcode where dong like '당산%'
select * from c_myzip     where dong like '당산%'
select * from n_myzip     where dong like '당산%'    -- %당산% 일때 처음에 %가 있으면 table scan 으로 된다. 따라서 속도시간이 늘어난다
 
create clustered index dong인덱스
on c_myzip(dong asc)

create nonclustered index dong인덱스2
on n_myzip(dong asc)

 


어떤 컬럼에 인덱스를 걸어야 하는지??
1. where절에서 자주 사용되는 컬럼 (예 : dong 컬럼 -> 자주 검색하기 때문에)
2. like '%~~~' 조심. %는 뒤에만 오게 해야 속도가 빨라진다.
3. between A and B (클러스터인덱스가 유리)

범위 쿼리문에서는 클러스터드인덱스가 유리하지만 클러스터드인덱스는 그 테이블에서 한번만 사용되는 단점을 가지고 있다.
4. order by가 항상 사용되는 컬럼
5. join으로 자주 사용되는 컬럼
FK( 1:1 대응이 많을 때 -- >  둘다 상관 없음(상황에 따라 넌클러스터드 인덱스를 사용)
1:N 대응이 많을 때 -- > 클러스터드 인덱스 유리
6. 100만건 중에 10개 조회/1000개 조회. 찾는 것이 적은 수에 주로 인덱스를 걸어주는 것이 상책이다.
주의)  중복 데이터가 많은 컬럼 (성별) --> 인덱스를 거는게 아님
조회되는것이 많으면 그냥 처음부터 찾는것이 나은편.
7. not 연산자 -> 긍정문을 바꿔서...
8. insert, delete가 빈번한 컬럼은 인덱스에 좋은 영향은 아님

 


* 인덱스로 인해 얻는 손해
1. 만드는데 시간과 많은 공간이 필요하고, 만들고 난 후에도 추가적인 공간이 필요한다.
2. 데이타를 수정(insert, delete, update)하는 시간, 특히 insert작업은 오히려 더 많이 걸린다.


 

2012. 12. 21. 11:07

[Oracle] PL/SQL - SELECT INTO

SQL> L

1 DECLARE

2 t_personnel PERSONNEL%ROWTYPE;

3 BEGIN

4 SELECT EMP_NAME, ADDRESS

5 INTO t_personnel.emp_name, t_personnel.address

6 FROM PERSONNEL

7 WHERE EMPNO='98002';

8

9 dbms_output.put_line('<<<조회결과>>>');

10 dbms_output.put_line(' 이름 : ' || t_personnel.emp_name);

11 dbms_output.put_line(' 주소 : ' || t_personnel.address);

12 EXCEPTION

13 WHEN NO_DATA_FOUND THEN

14 dbms_output.put_line('<<< ERROR >>>');

15 dbms_output.put_line(' 에러내용 : 조회된 데이타가 없습니다.!!');

16 WHEN TOO_MANY_ROWS THEN

17 dbms_output.put_line('<<< ERROR >>>');

18 dbms_output.put_line('에러내용 : 조회 데이타가 너무 많습니다.!!');

19 WHEN OTHERS THEN

20 dbms_output.put_line('<<< ERROR >>>');

21 dbms_output.put_line('에러코드 : ' || SQLCODE );

22 dbms_output.put_line('에러내용 : ' || SUBSTR(SQLERRM, 1, 100));

23* END;

SQL> /

<<<조회결과>>>

이름 : 이대명

주소 : 경기도 군포시 궁내동

 

PL/SQL 처리가 정상적으로 완료되었습니다.

 

 

SQL> L

1 declare

2 t_personnel PERSONNEL%ROWTYPE;

3 BEGIN

4 SELECT EMP_NAME, ADDRESS

5 INTO t_personnel.emp_name, t_personnel.address

6 FROM PERSONNEL;

7

8 dbms_output.put_line('<<<조회결과>>');

9 dbms_output.put_line('이름 : ' || t_personnel.emp_name );

10 dbms_output.put_line('주소 : ' || t_personnel.address);

11 EXCEPTION

12 WHEN NO_DATA_FOUND THEN

13 dbms_output.put_line('<<<ERROR>>>');

14 dbms_output.put_line('에러내용 : 조회된 데이타가 없습니다.');

15 WHEN TOO_MANY_ROWS THEN

16 dbms_output.put_line('<<<ERROR>>>');

17 dbms_output.put_line('에러내용 : 조회 데이타가 너무 많습니다.');

18 WHEN OTHERS THEN

19 dbms_output.put_line('<<<ERROR>>>');

20 dbms_output.put_line('에러코드 : ' || SQLCODE );

21 dbms_output.put_line('에러내용 : ' || SUBSTR(SQLERRM, 1, 100));

22* END;

SQL> /

<<<ERROR>>>

에러내용 : 조회 데이타가 너무 많습니다.

 

PL/SQL 처리가 정상적으로 완료되었습니다.

 

 

속성

결과값(조회 1)

결과값(조회 0)

비고

SQL%NOTROUND

False

True

조회된 데이터가 없으면 True

SQL%FOUND

True

False

조회된 데이터가 있으면 True

SQL%ROWCOUNT

n

0

조회된 데이터 건수 (row )

SQL%ISOPEN

False

False

PL/SQL은 실행한 후 바로 Implicit cursor를 닫기 때문에 항상 False로 평가됨

 

 

SQL> L

1 DECLARE

2 t_personnel PERSONNEL%ROWTYPE;

3 BEGIN

4 SELECT EMP_NAME, ADDRESS

5 INTO t_personnel.emp_name, t_personnel.address

6 FROM PERSONNEL

7 WHERE EMPNO='98002';

8

9 IF SQL%ROWCOUNT = 1 THEN

10 dbms_output.put_line('<<<조회결과>>>');

11 dbms_output.put_line('이름 : ' || t_personnel.emp_name);

12 dbms_output.put_line('주소 : ' || t_personnel.address);

13 ELSIF SQL%ROWCOUNT = 0 THEN

14 dbms_output.put_line('<<<ERROR>>>');

15 dbms_output.put_line('에러내용 : 조회된 데이타가 없습니다.');

16 ELSIF SQL%ROWCOUNT > 1 THEN

17 dbms_output.put_line('<<<ERROR>>>');

18 dbms_output.put_line('에러내용 : 조회 데이타가 너무 많습니다.');

19 END IF;

20

21 EXCEPTION

22 WHEN OTHERS THEN

23 dbms_output.put_line('<<<ERROR>>>');

24 dbms_output.put_line('에러코드 : ' || SQLCODE );

25 dbms_output.put_line('에러내용 : ' || SUBSTR(SQLERRM, 1, 100));

26 END;

27 /

<<<조회결과>>>

이름 : 이대명

주소 : 경기도 군포시 궁내동

 

PL/SQL 처리가 정상적으로 완료되었습니다.

 

2012. 12. 4. 15:23

부자와 빈자

소설가 정미경의 단편소설 ‘아들의 연인’에서 화자는 사업하는 부유한 남편을 둔 강남 사는 사모님이다. 이 사모님의 아들이 컨테이너에 사는 가난하지만 똑똑한 여대생 도란을 사귄다. "걔가 가난하다고 헤어지는 일은 없어요"라던 아들은 일기장에 "우리가 다르다는 걸 느낀다"는 문장을 남긴 채 여자친구와 헤어진다.

아들이 도란과 헤어진 이유는 도란이 가난한 집 딸이어서가 아니었다. 자신의 친구들과 만날 때 어울리지 못하고 어색한 존재로 남아 있는 도란을 스스로 견딜 수 없어서였다. 정가 9000원에 봉사료와 부가세까지 붙어 1만원이 넘는 짜장면을 마음 편하게 먹지 못하는 도란의 태도를 받아들일 수 없어서였다. 결국 부잣집 아들과 가난한 집 딸이 헤어지는 이유는 돈도, 학벌 차이도 아닌 문화의 차이였다.

흔히 빈자와 부자는 돈이 있고 없고의 차이일 뿐이라고 생각한다. 하지만 빈자와 부자를 가르는 기준에서 돈은 미미한 요소일 뿐이다. "(‘위대한 개츠비’의 소설가) F. 스콧 피츠제럴드는 부유하다는 것이 은행에 돈이 많다는 것처럼 단순한 하나의 사실이 아니라, 현실을 바라보는 관점이자 여러 가지 태도의 집합이며 특정한 삶의 방식이라는 점을 이해했다.

지금 당장 돈이 없어도 부자가 있는가 하면, 돈이 많아도 곧 가난해질 사람이 있다. 로또 당첨자들이 일확천금을 하고도 얼마 못 가 다시 가난해지는 이유는 돈이 없어서가 아니다. 부자의 사고와 삶의 방식을 모르기 때문이다.

어떤 사람이든 만나서 30분만 얘기해보면 그가 부자인지 아닌지, 지금 부자가 아니라고 해도 앞으로 부자가 될만한 사람인지 아닌지, 매우 높은 확률로 맞출 수 있다. 당신은 앞으로 부자가 될 수 있을까. 궁금하다면 여기 소개하는 부자와 빈자의 5가지 차이점을 읽어보라.

 

1. 부자는 성공에, 빈자는 오락에 초점을 맞춘다
'부자들의 생각은 어떻게 다른가(How Rich People Think)'의 저자 스티브 시볼드는 슈퍼 리치와 평범한 월급쟁이의 가장 큰 차이점을 사고방식이라고 지적한다. "우리 집 잔디를 손질하는 정원사는 한 시간에 15달러를 받고 뜨거운 태양 아래에서 열심히 일한다. 만약 열심히 일하는 것이 부자가 되는 유일한 길이라면 그 사람이 부자여야 하고 나는 가난해야 한다." 열심히 일하는 것을 넘어 생각이 달라야 한다는 지적이다.

부자와 평범한 월급쟁이 사이에 존재하는 생각의 차이는 사람들을 만나 나누는 대화에서 단적으로 드러난다. 부자들의 대화는 성공에 초점을 맞춘다. 부자들은 만나면 아이디어와 정보를 교환하고 사업과 기부, 예술품 투자 등을 화제로 이야기 한다. 반면 평범한 월급쟁이들은 엔터테인먼트에 집중한다. 연예인이나 스포츠, 시중에 떠도는 가십거리를 화제로 시간을 보낸다.

2. 부자는 신문을 읽고 빈자는 TV를 본다
컨설팅회사 '애플루언스 콜래보러티브'가 지난 4월에 발표한 설문조사 결과를 보면 부자들과 평범한 사람들의 인터넷 사용에서 가장 두드러진 차이는 뉴스에 대한 태도였다. 연봉이 50만달러가 넘는 사람들은 70%가 월스트리트 저널(WSJ) 등 언론 사이트에 들어가 뉴스를 읽는다고 답했다. 반면 연봉 20만달러 미만의 사람들은 44%만 인터넷에서 뉴스를 읽는다고 밝혔다.

온라인 뉴스만 좋아하는 것이 아니다. 이 조사에 따르면 연봉 50만달러 이상의 부자들은 일주일에 11시간 이상 종이 신문을 읽는다는 대답이 20.5%였다. 반면 연봉 20만달러 미만의 사람들은 일주일에 11시간 이상 종이 신문을 읽는 비율이 6%에 불과했다. 종이 신문은 거의 안 본다는 대답이 연봉 50만달러 초과 그룹에서는 18.5%였으나 연봉 20만달러 미만 그룹에서는 33.5%에 달했다.

TV 시청 시간은 반대로 나타났다. 연봉 20만달러 미만 그룹에서는 일주일에 21시간 이상 TV를 본다는 대답이 38.5%, 11시간 이상은 72.5%에 달했다. 반면 연봉 50만달러 이상 그룹에서는 일주일에 21시간 이상 TV를 본다는 대답이 21.5%로 낮아졌다. 11시간 이상 TV 시청 비율은 53.5%였다. TV를 일주일에 5시간 미만으로 본다는 대답이 연봉 50만달러 초과 그룹에서는 21%로 상당히 높았으나 연봉 20만달러 미만 그룹에서는 9.5%로 10%를 넘지 않았다.

3. 부자는 조용하고 빈자는 시끄럽다
TV 시청은 부자와 평범한 사람을 가르는 매우 중요한 기준이 된다. '돈으로 살 수 없는 것(What Money Can’t Buy)'이라는 책은 "사회 계층이 낮아질수록 TV가 켜져 있을 확률이 높아진다"고 지적한다.

미국의 계층별 특징을 연구한 '계층 이동의 사다리'라는 책에서도 대물림되는 가난의 특징 가운데 하나로 "TV가 상황에 무관하게 거의 항상 켜져 있다"는 점을 지적한다. 이 책은 또 빈곤층을 특징 짓는 3가지 불문율을 제시하면서 "소음이 많다"는 점을 들면서 "TV는 항상 켜져 있고 여러 사람이 동시에 이야기한다"고 밝혔다.

TV를 많이 보는 것은 단순히 TV에 시간을 많이 낭비하기 때문에 문제가 되는 것은 아니다. TV는 환경을 시끄럽게 해서 깊은 생각과 사색과 대화를 방해한다. TV가 항상 켜져 있는 집에서 진지하게 생각을 하거나 가족간에 오순도순 대화하는 장면은 떠올리기 어렵다.

'돈으로 살 수 없는 것'이란 책은 "프롤레타리아는 잡음과 고함 소리가 두드러진다"며 "상류층의 한 가지 표시는 고요함"이라고 지적했다. 한 마디로 부자는 조용하고 빈자는 시끄럽다. '빈 수레가 요란하다'는 속담이 여기에서 나왔을까.

4. 부자는 깨끗하고 빈자는 지저분하다
고요함과 소음의 차이만큼 두드러진 것이 깨끗함이다. '우리 가운데 살고 있는 가난한 사람들(The Poor Who Live Among Us)'이란 책은 "가난한 가족의 집으로 걸어 들어가 보라. 악취가 코를 찌르고 불결함이 눈을 괴롭힐 수도 있다"고 지적한다.

가난하기 때문에 지저분한 지역에 살고 그렇기 때문에 불결하게 된다고 결과론적으로 해석할 수도 있다. 하지만 지저분한 지역에 살아도 의지만 있으면 자신이 사는 집과 집 주변은 깨끗이 할 수 있다. 가난하지만 안에 들어가면 정리정돈이 잘 돼 있어 정갈한 느낌이 드는 집이 있다. 한국의 옛 가난한 선비들을 생각할 때 연상되는 청빈이 있다. 청빈하면 돈이 없어도 부자가 될 수 있다.

주위가 어지러운 것은 그만큼 나태하다는 뜻이다. 주위가 정리가 되지 않으면 머리 속도 정리가 되지 않는다. 새뮤얼 고슬링 미국 텍사스대 교수가 학생들의 자취방과 기숙사 방 83개, 기업 사무실 94개를 조사한 결과가 이를 증명한다. 조사 결과 지저분한 공간을 가진 사람들은 깨끗한 공간을 가진 사람들보다 효율적이지 못하고 체계적이지도 못하며 창의력도 떨어졌다.

5. 부자는 투자하고 빈자는 소비한다
'또 다른 미국'이란 책은 가난한 사람에 대해 "만족을 지연하지 않아 저금하지 않으며 쾌락을 얻을 수 있으면 즉시 누린다"고 지적했다. 우리나라에서 큰 인기를 끌었던 '마시멜로 이야기'란 책은 성공의 가장 큰 비결을 현재의 쾌락에 빠지지 않고 만족을 미래로 지연시킬 수 있는 능력에서 찾는다.

'계층 이동의 사다리'란 책에서도 빈곤층에게 돈이란 "소비하는 것"이고 부유층에겐 '보존하고 투자하는 것'이라고 지적했다. 돈을 보는 관점 자체가 빈자와 부자는 다르다는 뜻이다.

흔히들 "나는 돈을 많이 벌면 뭐도 사고 뭐도 할거야"라고 말한다. 이런 사람 중에 부자 되는 사람 없다. 부자들은 무엇을 사고 무엇을 하기 위해 돈을 벌지 않는다. 다시 말해 돈을 쓰기 위해 돈을 버는 것이 아니다. 부자들에게 돈이란 지금의 만족을 위해 써버리는 것이 아니라 잘 투자해 유지하고 늘리는 대상이다.

게다가 부자들은 돈 자체를 버는데 많은 열정을 쏟지 않는다. 스코피오 파트너십과 스탠더드 차터드 프라이빗 뱅크 등이 유동자산만 200만달러가 넘는 부자들 1400명을 대상으로 조사해 지난 2월에 발표한 보고서가 이를 보여준다.

스코피오 파트너십은 인생을 사랑하는 것, 의미 있는 목표를 세우고 추구하는 것, 어떤 일이 일어나도록 하는 것, 지식을 얻는 것, 세상을 좀더 살기 좋은 곳으로 만드는 것, 새로운 기회를 잡는 것 등 12가지 삶의 활동을 제시하고 자신의 에너지 수준을 1에서 10까지 표기하도록 했다.

부자들은 거의 전 영역에서 평균보다 훨씬 더 높은 수준의 에너지와 열정을 보였으나 단 한 가지만 순자산이 5만달러가 안 되는 평범한 사람들보다 낮은 수준의 열정을 보였다. 바로 '금전적으로 성공하는 것'이다. 부자들은 이미 부자이기 때문에 금전적 성공에 큰 의미를 안 두는 것일 수도 있다.

하지만 부자들이 평균보다 월등히 많은 에너지를 쏟는다고 밝힌 분야를 살펴보면 부자는 사고방식 자체가 다르다는 것을 느낄 수 있다. 부자들은 '새로운 기회를 찾는 것'에 평균 수준을 가장 크게 뛰어넘는 열정 보였고 그 다음 '일을 다르게 하는 것'과 '일이 이뤄지도록 하는 것'이었다. 가난한 사람들은 소비할 돈에 집중하지만 부자들은 돈을 벌어다 줄 기회와 일에 초점을 맞춘다.

대물림되는 가난은 돈으로 해결할 수 없다. 요즘은 기초생활수급비를 받는 가정의 학생들도 값비싼 스마트폰을 가지고 다닌다. 약정만 맺으면 싸게 살 수 있는데다 통신비를 지원 받기 때문이다. 부자와 빈자의 차이는 스마트폰이 있느냐 없느냐의 차이가 아니다. 돈의 문제를 넘어서는 생각과 태도의 차이다.

 


[출처 : ELW]

 

 

'So on...' 카테고리의 다른 글

티스토리 초대장 배포  (134) 2013.03.19
혈액형별 성격  (0) 2011.12.04
[SERVER] vmstat (AIX)  (0) 2010.03.15
[야구] 블로그명 투수만들기(chobagsa baseball)  (0) 2010.02.15
[야구] 투수의 마음가짐  (0) 2010.01.03
2012. 12. 3. 15:36

[Oracle] 10g 공간 줄일수 있는 테이블 찾기와 Shrink 실행하기

 기존에는 테이블을 새로 작성(reorg)  작업을 통해 커진 테이블 스페이스 크기를 복구 가능하였으나 10g 부터는 Shrink 기능을 이용하여 손쉽게 테이블을 줄일수 있게 되었다.

Shrink 기능은 HWM(High Water Mark)를 줄일수 있는 기능이다.


- 사전 확인 사항

init.ora 파일내에 compatible = 10.2 이상인것을 확인

ASSM (Automatic Segment Space Management) 테이블 스페이스여만 가능

각 테이블 조회 방법은

 

SELECT OBJ.OWNER
           , OBJ.TABLE_NAME, OBJ.TABLESPACE_NAME
           , (CASE WHEN NVL(IDX.CNT, 0) < 1 THEN 'YES' ELSE 'NO' END) SHRINKABLE
   FROM DBA_TABLES OBJ,
             (SELECT TABLE_NAME, COUNT(ROWNUM) CNT
                 FROM DBA_INDEXES
               WHERE INDEX_TYPE LIKE 'FUN%'
               GROUP BY TABLE_NAME) IDX
 WHERE OBJ.TABLE_NAME = IDX.TABLE_NAME(+)
     AND OBJ.TABLESPACE_NAME = :TABLESPACE_NAME;

 

쿼리를 통해 (테이블 스페이스 명을 인자값으로) 확인 가능하다.

 

 

1. 테이블 검색 방법

SELECT * FROM TABLE(DBMS_SPACE.ASA_RECOMMENDATIONS());

아래와 같이 테이블의 DBA_SEGMENTS에서 볼수 있는 크기와 축소 가능 크기가 조회된다.

 

SEGMENT_OWNER | SEGMENT_NAME | SEGMENT_TYPE | PARTITION_NAME |

ALLOCATED_SPACE | USED_SPACE | RECLAIMABLE_SPACE
MAX_TI | SMR_IF_LOG       | TABLE  | | 6761793074 | 5910149080 | 851643994
MAX_TI | SMR_IF_LOG_I01 | INDEX  | |   478455081 |   420139142 | 58315939
MAX_TI | SMR_IF_LOG_I02 | INDEX  | |   411921243 |   398204079 | 13717164

 


2. 축소하기

가장 먼저 행들을 이동 가능하도록 변경한다.

위의 SMR_IF_LOG 테이블을 기준으로 설명하겠다.

ALTER TABLE SMR_IF_LOG ENABLE ROW MOVEMENT;

--> 반대로는 ALTER TABLE SMR_IF_LOG DISABLE ROW MOVEMENT; 이다..

이제 SHRINK 기능을 수행할수 있으며, 다음 3가지 형태로 가능하다

 

① ALTER TABLE SMR_IF_LOG SHRINK SPACE
    -- SMR_IF_LOG 테이블의 공간만 TABLESPACE로 환원

 

② ALTER TABLE SMR_IF_LOG SHRINK SPACE CASCADE;
    -- 모든 관련 OBJECT까지 TABLESPACE으로 공간 환원

 

③ ALTER TABLE SMR_IF_LOG SHRINK SPACE COMPACT;
   -- 행들만 이동시킴.

 

 

※ SHRINK 를 적용 시킬  없는 테이블
UNDO segments
temporary segments
clustered tables
tables with a column of datatype LONG
LOB indexes
IOT mapping tables and IOT overflow segmnets
tables with MVIEWS with ON COMMIT
tables with MVIEWS which are based on ROWIDs.

 

 

[출처] 웹 개발과 관련된 모든 것들 (http://web-dev.tistory.com/116)

 

 

2012. 11. 27. 17:05

[Oracle] PL/SQL PROCEDURE Scripts Sample 설명

CREATE OR REPLACE PROCEDURE SAMPLE_PROCE AS

 

-- SELETE 문의 결과를 TEMP_CUR 라는 CURSOR 에 넣는다.
CURSOR TEMP_CUR IS
SELECT BWCODE, BWNAME, BWADDS
  FROM TEMP_TAB;

 

-- TEMP_CUR의 타입을 그대로 사용할 수 있는 NOW_CUR 변수선언
NOW_CUR TEMP_CUR%ROWTYPE;

 

BEGIN

 

-- 커서 사용을 위해서 연다.
OPEN TEMP_CUR;

 

-- 반복문 시작
LOOP

 

-- 커서의 ROW를 NOW_CUR로 보낸다.
FETCH TEMP_CUR INTO NOW_CUR;

-- DBMS_OUTPUT.put_line('LOOP 시작');

 

-- 커서가 끝나면 반복문을 종료한다.
EXIT WHEN TEMP_CUR%NOTFOUND;

 

--조건문 사용
IF (NOW_CUR.BWCODE  <> 'A') THEN


ELSIF -- 또는 ELSE IF

 

ELSE

  
END IF;

 


INSERT INTO NEW_TAB ( BWCODE, BWNAME, BWADDS )
VALUES ( NOW_CUR.BWCODE, NOW_CUR.BWNAME, NOW_CUR.BWADDS );

 

COMMIT;


END LOOP;


-- 커서를 닫는다.
CLOSE TEMP_CUR;


EXCEPTION 

WHEN OTHERS THEN

-- 에러 발생시 에러 메시지 출력

-- 토드의 DBMS_OUTPUT 에서 확인 할 수 있다.

DBMS_OUTPUT.put_line('ERROR');

ROLLBACK

END;

 

 

실행은 ~~

EXEC SAMPLE_PROCE;

 

 

디버깅은 ~~

CREATE OR REPLACE PROCEDURE SAMPLE_PROCE 부분을 DECLARE 로 바꾸고
중간중간마다 DBMS_OUTPUT.put_line(...) 를 이용해서 처리한다.

 

 

 

 

 

 

* 참고로 SET SERVEROUTPUT ON; 작성 후 실행해야 DBMS_OUTPUT 나옴.