공부라는 것이
'왜' 평생 해야 하는 것인지,

그리고 공부를 어떻게 해야
나를 효율적으로 성장시킬 수 있는지,

더 나아가 어떻게 미래에 
꿈을 실현하고 공헌할 수 있는지,

다양한 사례와 경험담을 통해
챕터별로 알차게 정리되어 있다.

 
책 읽다가 만난 무당벌레 안뇽ㅎ


다만 한 권에 
너무 많은 것이 담겨있다 보니
주장에 대한 뒷받침이 부족하거나
깊게 파헤치지 못하는 부분이
있다고 느낄 수 있다.

하지만 각종 훌륭한 
자기 계발서에서 말하는 핵심들을 
콕콕 집어주는 듯한 느낌이 들어 좋았고,

부족한 부분은 오히려 
적당한 호기심을 유발하여
관련된 다른 책들을 더 읽어보고 
싶게 만드는 매력이 있었다.

또한 작가님들의 고민과 열정이 
문체에 고스란히 드러나
나 또한 큰 자극을 받을 수 있었다.


당장 눈앞의 시험이나
언어 공부부터 직장에서, 
혹은 인생에 있어서 답을 찾아가는 
다양한 공부 방식을 체득할 수 있어
그 누구에게나 추천할 수 있는 
책이라고 할 수 있다.

공부는 평생이니까.


지금부터는 
각 파트별로 '핵심 내용' 혹은 
'내가 기억하고 싶은 내용'을 정리해보겠다.


1. 믿음 

- 공부는 믿는 대로 된다. '성장형 사고방식'을 가져라
- 뇌는 가소성을 지녀서 공부를 열심히 할수록 집중력은 올라가게 되어 있다.
- 우리가 공부하는 이유 : 소통, 생존(답을 찾음), 즐거움 → 정신적으로 풍요로운 삶, 행복


2. 메타인지 

- 피드백을 통해 현재 내가 무엇을 알고 무엇을 모르는지를 알고 있어야 더 명확한 계획과 실행이 가능하며 효과적인 전략도 다시 세울 수 있다.
- 사람들이 가장 행복감을 느끼는 순간은 다른 어떤 일에도 관심이 없을 정도로 지금 하고 있는 일에 푹 빠져 있는 상태라는 것을 알았다. 결국, 최적의 경험인 몰입을 하기 위해서는 메타인지, 즉 내 수준을 제대로 알고 있어야 하며 과제의 난이도에 대한 이해도 필요하다. 몰입은 적당히 어려운 수준에서 발동하니까.


3. 기억력

- 장기기억으로 만들려면 나를 괴롭혀야 한다. ex) 토론과 발표, 시험 등의 아웃풋
- 시험을 볼 때는 공부한 내용을 밖으로 '인출'해야 한다. 바로 그 인출이야말로 장기기억으로 가는 최선의 길이다.
어렵게 공부하면 잊기가 어렵다.
공부를 할 때 여러 과목을 교차해 가며 공부하는 것도 좋은 방법이다.
눈으로 외우고 손으로 확인하는, 짧지만 매 순간 시험을 보는 방법을 채택해서 실천한 빅보카 영단어 외우는 법이 효과적이었다.


4. 목표 

학생들은 학교에 다니면서 성장 목표는 감소하고 증명 목표는 증가한다고 한다. 대학 입시라는 단 하나의 목표에 모든 교육시스템이 맹목적으로 정립되어 있고 어느 대학에 가느냐가 한 사람의 존재를 평가하는 교육 풍토를 생각하면 오히려 이는 매우 당연한 결과라고 할 수 있다. 공부를 결과 중심으로 그리고 타인에게 자신의 능력을 증명하려는 것을 목표로 한다면 자신도 모르게 타협할 수 있다. 때로는 그런 타협으로 원하는 결과를 얻을 수 있지만, 성장은 하지 못한다.
공부하는 궁극적 이유는 성장을 위한 것이다.

마음속에 그린 미래를 향해 나아가는 10~30년짜리 대담한 계획인 '장기 목표 BHAG' 세우는 방법
1) 하는 일을 왜 하는지 계속 물어보자. 왜!
2) 당신이 가장 존경하는 사람을 떠올려 보자.
3) 인생의 마지막 때를 생각해보자.

-  실현 가능성이 있고 구체적으로 기술된 중단기 목표를 통해 장기 목표를 이룰 수 있는 기반을 마련하자. 기대를 잃어버리지 않기 위해 필요한 것은 작은 성공이니까. 단기 목표 하루 단위에 집중하자.


- 일주일 동안 매시간 자신이 무슨 행동을 하는지 모두 적어라. 목표를 위해 할 일들을 적어라. 중요한 일에 집중하라.
- 추구할 수 있는 목표를 찾은 것만으로도 우리는 충분히 행복한 인생을 산다고 말할 수 있다.
우선 어떻게 시작하다 보니 자신도 모르게 어떤 방향으로 이미 가고 있었다는 것이다. 흐름을 인지한 다음에 방향을 목표로 구체화하고 그 목표를 이루기 위해 체계적인 계획을 세웠다는 대답을 정말 많이 들었다.
목표가 없다면 목표를 찾는 것이 하나의 목표가 되게 하라.
하나의 큰 목표를 이루면 삶에 대한 시야가 넓어진다.


5. 동기 

- 패트릭 헨리 : 자유가 아니면 죽음을 달라
장기적으로 봤을 때 어떤 목표를 성취하는 데는 외재적 동기보다 내재적 동기가 훨씬 더 강력한 영향을 발휘한다.
인간은 선택권을 갖고 의사결정하는 것이 내재적으로 동기화되었기 때문에 다른 모든 욕구가 충족된다 해도 의사결정에 대한 기회가 없다면 만족하지 못한다. 즉, 자율성 자체가 내재적 동기의 핵심인 동시에 자율성을 빼앗기면 다른 동기마저 사라진다는 것이다. 당연히 공부나 업무에서 나에게 선택권이 있고, 자신을 스스로 통제한다고 믿으며, 자율감을 느끼는 것은 동기부여에 매우 중요하다. 내게 선택권이 있음을, 자신을 통제할 수 있음을, 그리고 공부든 일이든 인생이든 뭐든지 내가 어떻게 하느냐에 달려있다고 믿을 때 그 사람은 그 어떤 사람보다 동기화될 것이며 자신이 원하는 목표에 기어이 도착하게 될 것이다.
일에서의 자율성은 단순히 내적 동기의 문제를 떠나 건강과 행복에도 지대한 영향을 미친다. 자율성은 일을 춤추게 한다.
- 내재적 동기와 외재적 동기의 적절한 활용이 필요하다.


6. 노력 

- 재능 결정론의 허구를 말하며 1만 시간의 법칙에 수정할 오류를 지적한다.
유전적 결정론에 매몰되면 절대 자신의 잠재력을 꽃피울 수 없다. 제대로 된 방법이 동원된 노력은 웬만한 재능을 무시할 정도로 강력하며 누구라도 자신의 힘으로 전문가 수준에 도달할 수 있다.
- 재능을 키우는 '의식적인 연습'을 강조하며 자제력을 기르는 힘을 이야기한다.
자제력은 장기 보상을 위해 단기 충동을 억제하는 능력으로 근육을 키워 나가는 것처럼 훈련을 통해 키울 수 있다.
- '제대로' 그리고 '꾸준히' 한다면 누구나 그 분야의 전문가가 될 수 있다.


7. 감정 

- 감정은 공부의 안내자. 
- 긍정적 감정은 공부의 전반적인 힘을 길러준다.
- 인간은 대체로 보상을 통해 얻는 행복보다 손실을 통해 겪는 고통이 2~2.5배나 크다.
불안을 잠재우는 가장 좋은 방법의 하나는 불안을 잊으려고 노력하는 것이 아니라 오히려 불안에 대해 이성적으로 상세히 설명하거나 글을 쓰는 것이다. 이를 정서명명하기라고 한다.
부정적 감정이 들 때마다 그것을 긍정적인 단어로 재정의해 생각하거나 그것을 글로 쓰게 한다면 평소 긍정적 에너지를 유지하는 좋은 전략이 된다. 또한 매일 감사 일기를 쓰거나 친한 친구들과 서로에 대한 장점을 이야기하는 시간을 자주 갖는다면 평소 긍정적 감정을 유지할 뿐만 아니라 공부 효율에서도 상당한 도움을 받게 될 것이다.
사소한 것들을 걱정하기에는 인생이 너무 짧다. 즐겁게 공부할 수 있도록 고민하자.


8. 사회성 

- 인간은 사회적 동물
- 외로움은 한 사람의 지적 과제 수행 능력을 떨어뜨린다.
- 같은 목표를 가진 사람들끼리 자주 스터디를 하면 익숙함, 물리적 근접성, 유사성이 충족되고 추가로 비밀을 나누면 더 깊은 친구가 될 수 있다. 그런 모임을 하면서 주제별로 서로를 가르치는 또래 튜터링까지 하게 되면 외로움도 달래면서 실제 공부 효율을 상당히 올릴 수 있다. 만약 그 모임이 지속하여 소속감까지 준다면 공부 효율은 상상할 수 없을 만큼 올라갈 수 있다.
상대방의 표정, 말투, 목소리, 몸짓 등을 보고 상대의 감정을 직관적으로 잘 이해하는 '사회적 감수성'을 키우자.
문학 소설을 읽을 때 우리는 자연스럽게 주인공과 그 인물을 둘러싼 다양한 군상들에 대해 심리를 해석하게 된다. 그런 과정을 계속 반복하게 되면서 자연스럽게 우리는 타인의 마음을 읽을 수 있는 능력을 얻게 되는 것이다. 다양한 공간에서 다양한 만남, 그리고 문학 소설을 열심히 읽는다면 공감능력을 향상될 것이고 타인의 마음에 공감할 수 있다면 그것 하나만으로 대인관계에서 큰 성공을 거둘 수 있을 것이다.
대인관계를 높이는 7가지 기술 : 일관성, 존중, 경청, 조언, 겸손, 칭찬, 실수 + '공감능력'과 '실력'
겸손은 타인의 마음을 헤아리는 능력을 올려 준다. 겸손함은 그 자체만으로도 사람의 가치를 더 높여 준다.
성공한 기버들은 강한 동기부여 요소인 이타심과 이기심을 자신 안에 적절히 융합시켜 일을 추진해 나간다. 특히 이들은 자신의 베푸는 행동이 어떠한 사회적 영향력을 발휘하는지에 대해 잘 안다. 자신의 희생이 큰 영향력을 발휘한다는 것을 확인하는 것은 최고의 보상이 되기 때문이다.
모두가 당신의 승리를 원할 경우 승리는 더 쉬워진다. '이기적 이타주의자'가 되자.


9. 몸

- 유산소운동, 공부 직전에 운동하기 등을 통해 공부 효율성을 높일 수 있다.
- 수면, 영양, 명상, 커피냅, 다중감각 학습 등
건강한 신체에 건강한 정신이 깃든다.
운동과 휴식은 최고의 공부 전략이다.


10. 환경

- 처칠 : 우리가 집을 만들지만, 그 집이 다시 우리를 만든다.
알람은 눈에 띄어야 한다. 가시적으로 계속해서 확인할 수 있다면 우리는 원하는 행동을 하거나 방해받지 않고 집중할 수 있다.
의자가 각진 모양으로 배치된 곳에 가면 개성 표현이나 개별성에 집중하는 반면 둥글게 배치된 방에 들어가면 집단 소속감에 더 집중한다는 것이 밝혀졌다. 의자 배치가 무의식적으로 사람의 관점을 바꾼 것이다.
자연을 느끼는 환경이 조성되면 뇌는 편안함을 느끼면서 뇌 속 인지 자원을 잘 활용한다고 말한다.
공부 효율은 환경에 다라 달라진다. 장소 활용, 공간의 무의식, 스마트폰 끄기, 데드라인, 눈에 띄게 하기
큰 성과를 내려면 큰 비용이나 복잡한 전략이 필요하다고 생각하지만, 만약 환경 설정을 잘 이용한다면 쉬운 방법과 적은 비용으로 예상치 못한 성과를 올릴 수 있다. 동기부여나 의지도 중요하지만 적절한 환경 설정은 개인의 공부뿐만 아니라 조직의 생산성까지 바로 올릴 수 있는 훌륭한 전략이다. (넛지 : 타인의 선택을 유도하는 부드러운 개입 - 팔꿈치로 슬쩍 찌르다)
결심보다 강력한 것은 바로 환경이다.


11. 창의성 

- 창의성은 지능이 아니라 태도다.
- 창의성은 단지 사물을 연결하는 것에 불과하다.
창의성의 첫 번째 태도는 새로운 것을 찾으려고 하기보다는 기존에 있는 것들을 새로운 방식으로 연결하기 위해 바라보고 생각하는 자세다. 두 번째 태도는 연결하기 위한 재료를 많이 가지려는 노력이다. 즉 다양한 경험이 있을수록 그 사람은 창의적인 아이디어를 낼 가능성이 커진다. 왜냐하면, 연결할 것들이 많으니까.
자기에게 이질적이고 낯선 경험일수록 창의성을 발휘할 확률이 높아진다.
- 독창성은 실패를 먹고 자란다. 필연적으로 도전을 원한다. 실패를 잘 받아들일 수 있는 사고방식을 갖고 있을 때 창의적인 사람으로 성장할 수 있다.
창의적인 게시물 만드는 방법 : 공부한다, 시도한다, 분석한다, 다시 시도한다. → '아이디어가 좋았네!'



12. 독서 

- 독서는 모든 공부의 기초다.
- 인생을 살다 보면 답이 있는 것보다 답이 없는 것이 많으며 답 그 자체를 스스로 창조해야 할 때가 더 많다.
당연한 현상에 '정말 그럴까?'라는 의문을 던질 수 있을 때 성장과 발전이 있을 수 있고 새로운 것이 탄생할 수 있다.
지식과 지식의 부재가 적절히 균형을 이루었을 때 호기심은 기지개를 켜기 시작한다.
처음에는 계독으로 시작해 한 분야의 준전문가가 되고 그다음 남독을 통해 비판적 사고, 창의성, 겸손을 배우도록 하자.
관독은 콘텐츠 제작, 아이디어 발굴에 도움이 된다. 특정 관점을 가지고 세상을 바라보면 때로는 많은 것들을 놓칠 수 있겠지만, 자신에게 진짜 중요한 것을 얻게 된다. 관독은 추상화를 그리는 것과 같다. 자신이 생각하는 본질을 제외한 모든 것들을 쳐내는 것이다. 만약 관독 훈련이 제대로 된다면 새롭고 창의적인 콘텐츠를 만드는 데는 큰 무기를 얻은 것과 같다고 할 수 있다.

+ 추가로 다양한 독서법에 대해서는 고영성 작가의 '어떻게 읽을 것인가' 서평을 참고하면 된다. 링크 참조.



13. 영어

- 영어 읽기, 듣기, 문법, 단어, 말하기, 쓰기 등등 각각 공부법 소개.
- 영어 공부 파트는 내 영어 공부 계획을 세우면서 정리할 예정이라서 이 포스팅에서는 제외했다.


14. 일

반복연습과 시뮬레이션
- 끊임없이 부족한 점을 보완하고 실질적으로 필요하다고 판단되는 것을 공부하고 경험해 나가는 학습을 실질 학습이라 한다.
- 집단 토론, 역할극, 실전 훈련 등 실전처럼 공부하면 실전에서 통한다.
마케팅 전략을 적극적으로 실천하거나 아니면 블로그나 sns 등 다양한 온라인 마케팅 채널을 운영하면서 특정 홍보활동을 하고 
그 활동 중에 나온 데이터를 직접 보고 분석하여 새로운 솔루션 개발을 시도해 본다면 그 어떤 공부보다 더 큰 학습이 될 것이다.

의사결정에는 프로세스가 중요하다.
탁월한 결정을 하는 데 최종 의사결정자의 직관이나 전문가 그룹의 분석보다 프로세스가 6배나 더 중요하다는 것이 밝혀졌다. 프로세스는 의사 결정을 하기 위한 일종의 과정, 예를 들어 최종 의사 결정자가 선택하기 전에 반대 의견을 꼭 수렴해야 하는 제도가 있다는 것을 말한다.

WRAP 프로세스 : 
선택안은 충분한가?
검증의 과정은 거쳤는가?
충분한 심리적 거리는 확보했는가?
실패의 비용은 준비했는가?

-시뮬레이션을 통해 예행연습을 하면 실제로 그런 일이 벌어졌을 때 뇌는 이미 시뮬레이션으로 익숙한 상황이므로 일을 잘 처리하는 것이다.
정확한 정보와 합리적 근거 안에서 그리는 미래 시나리오와 트렌드를 꾸준히 읽고 봐야 하며 더 나아가 본인이 자신의 분야에서 그런 미래를 그려 낼 수 있어야 한다. 
대부분의 실수는 디테일을 제대로 챙기지 못해서 나온다. 디테일을 사소한 것이라고 번역하지 말자. 디테일은 그 어떤 것보다 막중한 것이다.
- 결국은 공부가 생각보다 많은 것을 해결해 주지만 안타깝게도 많은 사람이 공부하지 않는다. 잊지 말자. 공부가 답이다.
제대로 공부를 하고 내가 만드는 제품이나 서비스가 세상 사람들에게 도움이 된다는 의미 부여까지 하게 된다면 회사 생활만큼 즐거운 일이 없다. 업이 삶이 되는 것이다.


다음은 추가로 '관독' 측면에서 내게 필요하거나 추후에 활용하고 싶은 것들을 정리한 것이다.


- 오스카 와일드 : 우리는 모두 진흙탕에서 허우적대지. 하지만 이 가운데 몇몇은 밤하늘의 별들을 바라본다네.

- 소통의 핵심은 서로의 존재를 인정해 주는 것이다
: 나와 의견이 다르더라도 존중받는다는 느낌을 들게 할 때 설득할 수 있는 가능성이 높아진다. 우리의 정체성은 생각으로부터 나오며, 존재를 인정받는다는 것은 생각을 인정받는다는 말과 같다. 

- 하얗게 불타는 존재와 다 타서 검게 그을린 존재가 나란히 있는 세계라는 것을 깨달았을 때의 감동을 잊을 수 없습니다. 
: 공부의 즐거움에 대해 쉽게 깨닫게 해주던 말(영어 black과 프랑스어 ?의 어원)

- 쇠란 키르케고르는 "과감한 시도로 인간은 잠시 자신의 위치를 잃을 수 있다. 그러나 과감한 시도가 없으면 인간은 자기 자신을 잃는다."라고 말했다.

괴테 : 가장 중요한 일들이 별로 중요하지 않은 일에 의해 좌우되어서는 안 된다.

- 가보지 못한 길은 그저 그 길로 가지 않았을 뿐이다. 

- 데이비드 흄이 이미 '이성은 열정의 노예'라고 말했듯이 사람을 행동하게 하는 데는 감정이 매우 큰 역할을 한다.
(치명적인 데이터보다는 한 아이의 삶을 드러낸 편지가 기부율을 높인다.)

- 정당한 노력이 보상되지 않는 사회에서 : 우리는 촛불을 들고 우리의 목소리를 정확히 말하고 더 나아가 제대로 된 정치인을 뽑아야 한다. 언론의 진실을 읽고 정치인들의 행보를 파악하고 어떤 정책이 더 우리의 삶을 풍요롭게 할 것인가를 제대로 알기 위해서는 높은 문해력과 비판적 사고가 절실히 요구되기 때문이다. 만약 이런 기본적인 공부조차 안 되었다면 우리는 구조적인 문제를 결국 해결할 수 없을 것이다.

- 개인의 가치와 감정을 최대한 존중하고 수용하는 문화가 행복을 만든다. 집단주의적 문화에서 부족한 점 중에 하나가 심리적 자유감이다. 자유감이란 남에게 피해를 주지 않는 선에서 내 인생을 내 마음대로 사는 것이다. 그러나 집단주의적인 문화에서는 내 맘대로 살다간 비판받기 일쑤다. 전체 조화에 어울려야 한다. 그러다 보니 우리는 누군가를 평가하기 좋아하고 반대로 누군가의 평가에 민감하다. 특히 조직에 들어가면 그것이 더 심해진다. 결국, 만성적인 긴장과 피로가 수반된다. 

- 행복에 관해 가장 많이 착각하는 것이 돈과 같은 외적인 요건이 충족될 때 행복할 것으로 생각하는 것이다. 뇌는 행복감이든 불행함이든 시간이 지나면 사라지도록 진화했다. 생존을 위해 쾌락의 초기화가 필수적이었던 것이다. 이는 극단적인 경험을 한번 겪으면 감정이 반응하는 기준선이 변해 그 이후 어지간한 일에는 감흥을 느끼지 못한다는 것을 말한다.

- 한국은 그 어느 나라보다도 외적인 공격을 막아 주는 좋은 울타리다. 하지만 무참하게 날아오는 정신적 공격은 제대로 막아주지 못한다. 심리적 자유감이 말살되는 집단주의와 행복의 최고 변수인 사람에 대한 신뢰를 떨어뜨리는 물질주의적 문화를 가진 한국, 그리고 그곳에 사는 우리는, 그래서 행복을 찾기 힘든 것이다.

직장을 그만두고 창업한 사람들보다 직장을 가진 상태에서 창업을 한 사람들의 창업 성공 확률이 무려 33퍼센트나 높았다. 위험에 민감하며 항상 안전판을 생각하는 조금 소심해 보이는 기업가가 더 성공할 확률이 높다는 사실이다. 창의적 기업가들은 아무 생각 없이 위험을 감수하지 않았다. 어느 정도 확신이 있다고 하더라도 이들은 안전판이 없으면 창업의 세계에 완전히 집중하지 않았다. 눈앞이 확실해 보이는 기회가 있더라도 그것이 진짜 기회인지 몇 번이고 재확인하고 또한 실패했을 때를 대비했을 것이다. 알 수 없는 미래에 기회를 계속 잡기 위해서는 완전히 망해서는 안된다. 재기하고 다시 도전할 수 있는 안전판이 있어야 한다는 것이다.

- 가난이라는 것이 단순히 경제적 어려움만 주는 것이 아니라 한 사람의 인지적 자원을 치명적으로 침해한다는 사실을 알 수 있다.

- 미래를 예측하는 것이 중요한 이유는 미래를 정확히 예측함이 아니다. 다양한 미래 시나리오를 소유함으로써 예상치 못한 미래에 대비하고 신속하게 대응을 하기 위해서이다.

린 스타트업 : 처음부터 세상을 놀라게 할 명품을 만들 생각은 교만으로 치부하고 승산이 있는 새로운 아이디어가 나오면 조금은 어설프지만, 이 새로운 아이디어를 테스트할 수 있는 최소한의 제품을 빠르게 만들어 출시한다. 이에 대한 고객들의 반응을 파악한 후 이를 분석하여 발 빠르게 제품을 개선한다. 만약에 처음 아이디어를 세울 때 세웠던 가설이 잘못되었다고 판단했다면 미련 없이 방향을 선회한다. 이런 일련의 시행착오를 거쳐 제품의 완성도를 높인 뒤 검증된 가설을 바탕으로 마케팅 및 판매 전략을 수립하고 본격적인 제품 출시 및 판매를 시작한다. 이것이 린 스타트업의 경영 전략이다.

창의적인 인간은 도전도 많이 하고 실패도 많이 하는 시행착오형 인간이다. 하지만 똑똑해야 한다. 실패했을 때 다시 도전할 수 없다면 어떻게 계속 도전을 하겠는가? 실패의 비용이 무시할 정도로 적거나 실패의 비용을 감당할 수 있는 안전판이 있을 때 도전하고 또 도전하는 것이다. 불확실성을 이기는 것은 리스크를 제대로 관리한 현명한 시행착오다. 

- 'OECD'의 문해력 정의 : 텍스트를 이해하고, 평가한 뒤 이를 활용할 수 있는 능력

5등급 수준 : 다양한 분야를 아우르는 어려운 텍스트에서 정보를 찾고 축적할 수 있다. 또한, 텍스트에서 핵심 아이디어를 추려 내고 분류하고 재구성할 수 있으며 증거와 논증에 기반을 두어 평가할 수 있다. 이들은 논리적이고 개념적인 모형을 수립할 수 있으며, 텍스트에서 핵심 정보를 추출하고 객관적으로 그 신뢰도와 타당성을 평가할 수 있다.


이 책을 통해 읽어보고 싶어진 책 리스트 : 데일 카네기 인간관계론, 애덤 그랜트 기브 앤 테이크, 폴 에겐 교육심리학, 김용규 생각의 시대, 애덤 그랜트 오리지널스, 라즐로 복 구글의 아침은 자유가 시작된다, 론 프리드먼 공간의 재발견, 매튜 리버언 사회적 뇌, 고영성 경제를 읽는 기술, 데이비드 브룩스 소셜애니멀 (독서중), 서은국 행복의 기원 (완독), 로버트 치알디니 설득의 심리학
이창의 교수 블로그 이 땅에서 태어나 외국어 공부하는 법.


최종 요약 : 이 모든 공부법에서 기본이 되면서 가장 중요한 것은 '스스로 성장할 수 있다는 믿음'이다. 이 믿음을 바탕으로 나를 알고, 왜 공부해야 하는지 깨닫고, 자율성을 가지고, 계획과 목표를 세우고, 체력관리와 감정 조절, 환경을 조성하여 효율적이고 의식적인 노력을 한다면 어떤 분야에 있어서든지 공부를 통해 성장할 수 있다고 이 책은 말하고 있다.



블로그 이미지

낭만가을

,

사람이 병에 걸리면 발병원인을 정확하게 진단해 치료를 해야 한다. 10년 이상 입원치료를 받아온 중병환자가 별 차도를 못느껴 새로운 방법으로 치료를 받고자 하는데 병원 측은 새로운 치료법을 주장하는 의사는 배제한 채 이번에도 지난번과 같은 의료진으로, 지난 번과 비슷한 방법으로 치료를 계속하겠다고 하면 어느 누가 병원을 믿고 완치 희망을 가질 수 있을까? 미세먼지도 발생원인을 잘못 진단하고 엉뚱한 대책으로 대응한다면 효과는 없이 국고낭비, 국민건강 훼손, 자동차 산업발전 저해라는 엄청난 손실을 초래하게 되므로 철저한 검증이 필요하다.
 
최근 3년간 서울의 미세먼지가 세계보건기구(WHO) 기준을 초과한 날은 연중 약 127일로 사흘에 하루는 미세먼지 더미 속에서 지낸 셈이라고 하니 이 정도면 재앙 수준이라 할 수 있다. 정부도 미세먼지가 국민생존의 문제라고 인식하고 2022년까지 약 7조원을 투입해서 미세먼지 배출량을 30% 줄이기로 한 대책을 최근 발표하였으나 지난 10년간 성과도 없이 실패한 대책의 재탕 수준으로 자동차에 관한 전문성이 결여되어 있어 과연 5년 후에 미세먼지가 10%조차도 줄어들지 의문이다. 지난 10년 동안 많은 예산을 투입하여 경유차 퇴출에 집중하였고 또 다시 경유차 퇴출과 친환경차 보급이라는 카드를 꺼내 들고 있으므로 이번 기회에 과연 경유차 퇴출이 타당한지, 친환경자동차라는게 도움이 되는 것인지 자동차 전문가 입장에서 짚고 넘어갈 필요가 있다.
 
미세먼지 발생원은 복합적이어서 정확하게 측정하기는 어렵기 때문에 추진 의도와 접근 방법에 따라 결과가 달라질 수 있으므로 가능한 공인기관의 자료를 근거로 분석하고 아울러 새로운 돌파구가 될 수 있는 대책도 제안해 보고자 한다.
 
 
미세먼지 주범이 경유차라는 주장의 문제점

<그림 1>의 환경부 자료에는 서해 백령도의 초미세먼지 농도의 수준이나 추세가 서울시청역과 비슷하며 평소의 4~5배 수준까지 넘나들고 있다. 경유차가 운행량이 4~5배 정도로 들쑥날쑥 할 수도 없거니와, 경유차가 거의 없고 서해안 석탄발전소와도 무관한 백령도의 미세먼지 수준이나 추세가 서울시와 비슷하다는 것은 경유차는 물론이고 자동차의 영향이 아니고 편서풍에 실려온 중국발 황사와 산업먼지의 영향이라고 단정하기에 충분한 증거이다.
 

 
<그림 2>는 국내 대도시들의 미세먼지 발생량을 비교한 환경부의 자료이다. 차량운행이 훨씬 많은 서울보다도 경기도, 인천, 의왕, 춘천, 대전시의 연평균 미세먼지 농도가 더 높은 것은 자동차에 의한 내부영향보다도 오히려 중국의 황사와 공장/발전소 먼지 등 외부의 영향이 더 크다는 걸 입증하고 있다.
 
<그림 3>은 연중 미세먼지 발생 동향을 월별로 나타낸 환경부 자료이다. 장마철 기간인 7-9월 사이의 미세먼지가 대폭 줄어들고 있음을 알 수가 있는데 이런 현상은 경유차나 자동차의 운행량과 관계없이 여름철에 남동풍과 장마비에 의해 도로와 공기 중의 먼지가 씻겨나가는 Rainwash 효과임을 알 수가 있다.
 

 
<그림 4>는 2014년 6월 17일, 환경부와 수도권대기환경청의 타이어마모 연구결과 발표회에서 경유승용차가 1km를 달릴 때 배출가스에서 먼지가 5mg 발생하는 반면 타이어 마모에 의한 먼지는 약 100mg 발생하여 20배 더 배출된다고 발표한 사실이다. 따라서 전기차를 친환경자동차라고 막대한 지원금으로 보급을 확대하고 있지만은 배터리의 무게 증가로 인해 전기차의 타이어 마모에 의한 미세먼지 발생이 경유차의 총발생량보다 더 많다고 하므로 전기차로 경유차를 대체하겠다는 것은 미세먼지 저감에는 도움이 안 된다는 것을 알 수 있다.
 
<그림 5>의 2007년도 미국 포드 발표자료에서는 가솔린 직접분사식(GDI) 엔진이 경유차보다 미세먼지가 10배나 더 배출된다는 사실을 지적하고 있는 것으로 독일자동차클럽 (ADAC)과 독일 자동차검사기관인 TUEV에서도 같은 내용이 이미 발표되어 자동차 전문가들에게는 널리 알려져 있는 사실이다.
 

 
최근 10년동안 경유자동차는 유로5, 6규제를 거치면서 DPF(매연필터)를 부착하여 미세먼지를 줄여왔다. 가솔린 자동차에는 GDI엔진으로 성능은 업그레이드 되었으나 <그림 5>에서와 같이 미세먼지 과다발생이라는 암초를 만난 것으로 이제는 가솔린엔진이 미세먼지 주범이 된 셈이다. 그래서 최근 GDI가솔린엔진에도 GPF(가솔린입자필터)를 부착하거나 흡기관 분사방식을 겸용해서 미세먼지 과다발생 문제를 해결하려고 시도하고 있는 실정이다.
 
그리고 우리나라는 이미 2000년부터 시내버스를 CNG버스로 대체하여 왔고 택시는 40여년간 LPG로만 운행해 왔다. 택시와 시내버스에 경유가 아닌 특정 연료를 친환경이라는 명분으로 이렇게 장기간 독점적으로 사용하는 나라는 세계에서 우리나라가 유일하다. 유럽의 선진국 도시에는 경유택시와 경유시내버스가 대부분인데도 불구하고 서울시의 미세먼지보다 절반 이하인 걸 보면 특정 차종, 특히 경유차가 문제가 아니라는 것을 분명히 알 수 있다. <그림 6>은 국내 운행 경유차를 대상으로 교통환경연구소에서 실도로 주행시 NOx 배출을 시험한 결과로 대부분 3~10배 정도 과배출하고 있으나 기준치를 만족하는 차종도 있으므로 경유차가 근본적으로 문제가 있다고 매도하는 것은 옳지 않다.
 
그 동안 실도로 주행에 대한 규정이 없어 폭스바겐 등 국내외 대부분 자동차회사들이 장치 조작으로 NOx를 과배출 해온 것은 사실이나 현재는 실도로주행시 NOx 허용기준이 2017년까지 2.1배, 2020년까지 1.5배로 확정되었으므로 경유차로 인한 NOx의 과다 배출 문제는 과도기적인 문제로 점차 해결되고 있는 실정이다. NOx가 2차반응에 의해 스모그를 생성한다고 추정하고 있으나 그 중 일부이고 비율이 얼마인지도 아직 과학적인 근거가 없어 선진국에서는 NOx를 미세먼지의 범주에 포함시키지 않고 있는 실정이다. NOx를 과배출하는 불법 경유차를 꼬투리 잡아 미세먼지(PM) 성분을 제쳐두고 NOx 성분이 미세먼지 발생 핵심이라고 몰고 가는 것은 명분이 약하다.
 
 
향후 자동차 시장 전망

미세먼지는 전 세계적으로 증가하는 추세인데 그 원인으로는 지구온난화로 인한 사막화의 가속화, 산업 발전으로 인한 에너지 소비의 증가, 그리고 차량의 운행량 증가 등을 들 수 있다.

 
<그림 7>에서와 같이 전세계에서 초미세먼지 농도가 높은 지역은 대부분 사막 인근에 분포되어 있는 사막 영향권 국가들이고 우리도 영향권 내에 들어 있다. 유럽의 경우는 사하라사막의 북풍 영향을 조금 받고 있으나 심각한 수준은 아니고 우리보다는 훨씬 여건이 양호한 편이다. 그래도 더 개선하기 위해 내연기관 자동차의 퇴출을 계획하고 있지만 조만간 실효성 여부가 시장에서 결정될 수 밖에 없으므로 입장이 다른 우리가 무조건 따라가기에는 위험성이 많은 무모한 선택이다.
 
세계 자동차시장은 환경성과 효율성이 대세이고 원유고갈에 대한 우려는 채굴기술의 발전으로 예상보다도 훨씬 더 미루어 질 것으로 예상되고 있다. 당분간 세계 경유차 시장의 현상유지가 지속될 것이므로 효율과 환경성이 우수한 유로6 신형 경유차까지 퇴출대상으로 몰아가는 것은 자동차산업을 자승자박하는 어리석은 짓이다.
 
 
바람직한 자동차 미세먼지 대책 제안

우리나라는 지리적인 여건상 황사의 영향이 불가피하므로 자동차로 인한 미세먼지의 발생은 배출가스보다는 도로먼지재비산과 타이어 마모로 인한 문제를 해결하도록 대책을 강구해야 한다.
 
단기적으로는 도로 살수차와 노면 진공청소차 운영을 확대하며 유로6 신형 경유차와 구분하여 노후 경유차의 조기폐차를 적극 추진해야 한다. 그리고 전기차에 지원하는 예산 일부를 할애하여 내마모 타이어의 개발 보급에 집중 지원하는 것이 훨씬 미세먼지 저감에 도움이 될 수 있다.
 
무엇보다도 중요한 것은 중국발 황사와 산업먼지가 우리나라 미세먼지 발생의 큰 비중을 차지하고 있음을 인식하고 불투명한 중국과의 협력여부와는 관계없이 우리만의 실현 가능한 대책이 필요하므로 인공강우를 과감하게 도입하여 여름 장마철의 Rainwash 효과를 극대화하는 것이 바람직하다. 장기적으로는 대중교통의 이용 활성화로 개인차량의 시내 운행량을 줄여 나가야 한다.


블로그 이미지

낭만가을

,

 

영어 학습용 추천 유투브 채널


EngVid YouTube Channel : https://www.youtube.com/user/engvidenglish 

Go Natural English : https://www.youtube.com/user/gonaturalenglish

EnglishAnyone : https://www.youtube.com/user/EnglishAnyone

Rachel's English : https://www.youtube.com/user/rachelsenglish

 

영어학습용 추천 팟캐스트


ESL POD : http://www.eslpod.com

Culips : http://esl.culips.com

Better At English : http://www.betteratenglish.com

British Council Podcast : http://learnenglish.britishcouncil.org/en/elementary-podcasts


 

추천 영어학습 웹사이트


EngVid : http://www.EngVid.com 

British Council : http://learnenglish.britishcouncil.org/en/

VOA : http://learningenglish.voanews.com

Talk English : http://www.talkenglish.com 


 

추천 읽기 자료 사이트


Lifehacker : http://www.lifehacker.org 

wikiHow : http://www.wikihow.com 

the guardian : https://www.theguardian.com 

블로그 이미지

낭만가을

,


1. be from  ~ 출신이다


예문 1

A : I'm from Korea. Where are you from?

B : I'm from America. I'm an American.



단어




예문 2

A : Where is Bob from?

B : Bob is from America. He is an American.



단어




해석


예문 1

A : I'm from Korea. Where are you from?

나는 한국 출신이야. 너는 어디 출신이니?

B : I'm from America. I'm an American.

나는 미국 출신이야. 나는 미국인이야.


예문 2

A : Where is Bob from?

Bob은 어디 출신이니?

B : Bob is from America.

Bob은 미국 출신이야.




2. be called  ~라고 불리다


예문 1

A : Why is Alice called an angel?

B : Alice is very beautiful. So she is called an angel.



단어




예문 2

A : Do you want to be called a hero?

B : Yes, I want to be called a hero.



단어




해석


예문 1

A : Why is Alice called an angel?

왜 Alice는 천사라고 불리니?

B : Alice is very beautiful. So she is called an angel.

Alice는 매우 아름다워. 그래서 그녀는 천사라고 불려.


예문 2

A : Do you want to be called a hero?

너는 영웅이라고 불리길 원하니?

B : Yes, I want to be called a hero.

나는 영웅이라고 불리길 원해.







3. be afraid of  ~을 무서워하다, ~을 두려워하다


예문 1

A : I am afraid of my teacher.

B : Why are you afraid of your teacher?



단어




예문 2

A : Are you afraid of your girlfriend?

B : No! I am not afraid of my girlfriend. I just respect her.


단어




예문 3

A : Why are you afraid of your boyfriend?

B : I'm not afraid of my boyfriend. I just respect him.



단어




해석


예문 1

A : I am afraid of my teacher.

나는 내 선생님이 무서워.

B : Why are you afraid of your teacher?

왜 너는 네 선생님이 무섭니?


예문 2

A : Are you afraid of your girlfriend?

너는 네 여자친구가 무섭니?

B : No! I am not afraid of my girlfriend. I just respect her.

아니야. 나는 내 여자친구를 무서워하지 않아. 나는 단지 그녀를 존중할 뿐이야.


예문 3

A : Why are you afraid of your boyfriend?

왜 너는 남자친구를 무서워해?

B : I'm not afraid of my boyfriend. I just respect him.

나는 내 남친을 무서워하지 않아. 나는 단지 그를 존중할 뿐이야.



블로그 이미지

낭만가을

,



모든 계약서가 그러하듯이

계약서를 작성 하실때는 가능하면 위험부담 요소를 

제거하고 추후 발생될 수 있는 문제 소지를

미연에 방지하기 위하여 내게 손해가 오지않도록 

필요한 모든 사항들을 확인 및 기록하여

문서로 남기게 되는데요


부동산 계약서는 일반 계약서와는 달리

큰 돈이 직접 오고가며 

개인이 평생동안 고생하며 이룩한 재산이기에

어느 계약서보다도 더 신경을 써야 할 필요가 있습니다



올바른 부동산 전세계약서 작성을 위한

주의사항에 대하여 알아 보겠습니다


1. 등기부 등본을 반드시 확인 하세요!


등기부 등본에는 목적 대상물에 대한 채권 및 압류, 근저당 설정등

에 관련된 기록내용을 확인 가능하며 집주인의 재정상태가 악화되어

경매로 넘어가면 전세 보증금의 전액 또는 일부를

못 받을 수 도 있습니다.

가능하면 계약 당일 등기부 등본을 확인 하시고


만약 대출이 있다면 

보통 대출금의 130%인 근저당권의 채권 최고액과

전세금을 포함한 임차 보증금의 총액이 

아파트인 경우 70%, 다가구.연립,단독 주택의 경우는 60%

이하라면 경매에 넘어가더라도 보증금을 받을 가망성이 높아 집니다



단, 다가구 주택의 경우는 특히 신경을 써야 하는데

다가구 주택은 가구별로 구분등기가 되어있지 않고

건물 전체에대한 등기만 있기때문에 등기부 등본에서 

호수나 임차인 전체의 이름이 나오지를 않습니다

경매가 개시되면 선순위 임차인이 다수 존재해 후순위 임차인

피해를 볼 가능성이 매우 높으므로

다가구 주택 전세계약서 계약시 

매매가격과 세입자들 전체의 보증금이 얼마인지를

반드시 확인해야 합니다


마지막으로 

요즘처럼 전세가가 매매가에 근접해,

계약하려는 주택을 담보로 대출금이 많은 경우는

피하는 것이 좋습니다.



2. 계약자가 소유자인지 확인하고, 대리인과 계약시 각별히 주의하세요!


전세계약서 작성시 

계약자가 등기부상의 소유자 인지 확인해야 합니다

만약 다른 이유로 대리인과 계약하게 되면 계약서 작성 전에

반드시 3개월 이내에 발급한 집주인의 인감증명서가 첨부된

위임장과 대리인의 신분증을 요구해야 합니다


또 위임장에는 집주인이 부동산의 소재지와 소유자 이름 및 연락처 등

개인정보와 개약의 모든 사항을 위임 한다는 취지와

날짜와 함께 집주인의 인감이 날인 되어 있어야 합니다


대리인의 부모, 형제, 자매가 대리인으로 나와 

계약을 진행 하더라도 집주인과 직접 통화해

본인이 맞는지와 위임 사실을 확인하고 녹취해 두면

만약을 대비해 더욱 좋습니다.



3. 전세계약서 작성시. 믿음직한 공인중개업소 선택 하세요!


요즘 부동산 중개 수수료를 절약하기 위해

인터넷 카페나 직거래 경로를 이용, 개인간의 부동산 거래도

증가하는 추세입니다.

이렇게 공인 중개사를 통하지 않고 직거래로 계약 시

문제가 발생하면 적법한 절차에 의해 보호받지 못하는

사고도 같이 증가 추세에 있습니다


요즘 공인중개업소는 전세계약 이나 모든 부동산 계약진행시,

문제가발생 하더라도 안전하게 고객의 돈을

지킬수 있는 공제협회에 가입하는등 안전한 계약진행을

진행하고 있습니다


그리고 계약서 작성시 부동산 중개업소에

가급적 법무부에서 만든 주택임대차 표준계약서 작성을 요구 하세요! 

일부 변경된 계약서의 경우 표준계약서와 어떤 부분이

다른지 확인 하시는 것이 좋습니다


부동산 전세계약서 작성시 주의사항으로는

특약사항도 꼼꼼히 살펴봐야 합니다

집수리, 도배, 장판 등 집주인과 구두상으로 나누었던

모든 부분이 특약사항에 기재가 되어 있어야 계약후

불이익을 받지 않습니다


전세계약서 작성시 크고 작은 일들은 많이 발생할 수 있습니다

그러므로 믿음직한 공인중개업소를 선정해서 

그에 상응하는 수수료를 지불하고 

안전하게 내 재산을 지킬수 있도록 하세요!



4. 현 소유자 통장으로 전세계약금 및 잔금 입금 하세요!


부동산 전세계약시 돈거래는 통장으로 거래 하시는 것이

좋습니다. 통장 거래시 은행에 기록이 남아 있고

은행거래시 받은 영수증등은 추후 만약에 있을

여러가지 증거자료로로 활용될 수 있습니다

<영수증은 반드시 챙겨 두세요!>



5. 전입신고 및 확정일자 확인 하세요!


모든 계약과 잔금을 치른후 동 주민센터에 가서

전입신고를 하여 전세계약서에 확정일자를 받으세요!

요즘은 인터넷이 발달되어 있으므로

"민원24시"사이트를 이용하여도 가능 합니다


전입신고와 확정일자를 받아 놓아야 공매,경매로 넘어갈때

보증금을 회수할수있는 "우선변재권"을 가질수 있기 때문 입니다

전입신고와 확정일자 신고는 아주 간단하고

신속하게 처리가 됩니다

소중한 전세금 보호를 위해서 반드시 전입신고 및 확정일자를

받으세요!

블로그 이미지

낭만가을

,

RxJava는 Reactive java에서 이름을 따왔다.


Reactive programming(리액티브 프로그래밍) 패러다임을 자바에서 구현한 프로그래밍 라이브러리이다.


프로그래밍 패러다임에는 여러가지가 있는데 OOP(객체지향), Function(함수), Imperative(명령형) 등이 있다.


대체로 많은 프로그램들이 명령형 프로그래밍이라고 할 수 있고 여기에는 자바, 파이썬, C, Node.js등도 포함 되어 있다.

특정 언어라고 해서 한가지 프로그래밍 패러다임만 사용하는건 아니지만 특정 목적에 맞게 설계된 언어들이 있다.


여기에서 '패러다임(paradigm)'은 방법론 정도로 보면 된다.


여러가지 언어 중에서 자바는 OOP(Object Oriented Programming)라고 해서 객체지향형 프로그래밍의 대표 언어이고 Functional Programming(펑셔널 프로그래밍)을 대표하는건 파이썬, node.js등이라고 할 수 있다. 자바로 Reactive Programming을 해야할 일이 생겨서 이 라이브러리가 등장 하였다. 그리고 자바가 버젼이 올라가면서 여러가지 요즘 트렌드에 맞게 기술들이 추가 되어서 OOP기반이었던 자바가 Functional, Reactive 등의 프로그래밍 방법론으로도 개발이 가능하게 되었다.


리액티브란 외부에서 자극이 오고 그에 대해 반응 한다는 뜻이다. 


아래는 rxJava로 hello를 출력한 코드이다.


1
2
3
4
5
6
7
8
9
10
11
12
13
import io.reactivex.Observable;
 
public class FirstExample {
    public void emit(){
        Observable.just("hello""rxjava2!!")
            .subscribe(System.out::println);
    }
    public static void main(String[] args) {
        FirstExample firstExample = new FirstExample();
        firstExample.emit();
    }
}
 
cs

코드를 잠깐 살펴보면 Observable와 .just()가 나오고 .subscribe()가 나오고 그 안으로 System.out::println이 들어가는 구조를 볼 수 있다.


Observer라는 것을 사용하는게 RxJava이다.


Function

Function은 쉽게 이야기 해서 제네릭으로 <기존타입, 리턴타입>을 받아서 .apply()를 하면 기존 타입의 연산 결과를 결과 타입으로 반환을 해준다.

소스코드는 아래와 같다.


1
2
3
4
5
6
7
8
9
10
import java.util.function.Function;
 
public class FunctionExample {
    public static void main(String[] args) {
        Function<String, Integer> function = str -> Integer.parseInt(str);
        Integer integer = function.apply("10");
        System.out.println(integer);
    }
}
 
cs


gradle로 빌드한 소스코드는 아래 repository에 올려 놓았다.

https://github.com/Kyeongrok/rxjava_helloworld/



Consumer(컨슈머)

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
Observable<Integer> source = Observable.create((ObservableEmitter<Integer> emitter) -> {
    emitter.onNext(100);
    emitter.onNext(200);
    emitter.onNext(300);
    emitter.onComplete();
 
});
 
// 람다 + 메소드 레퍼런스
source.subscribe(System.out::println);
 
// 그냥 코드
source.subscribe(new Consumer<Integer>() {
    @Override
    public void accept(Integer integer) throws Exception {
        System.out.println("result : " + integer);
    }
});
cs

컨슈머는 값을 받는 익명 void함수다.


위 코드 10번줄 처럼 한줄이면 끝나는 코드를 그냥 쓸려면 13~18 이렇게 길게 써야 한다.

'프로그래밍 > JAVA ' 카테고리의 다른 글

java paging class (자바 페이징 클래스)  (0) 2016.08.19
블로그 이미지

낭만가을

,

오라클 파티션 정의


파티션 개요

오늘날 기업에서 관리하는 데이터는 수백테라 바이트에 이르는 데이터베이스를 관리합니다. 하지만 이런 데이터들 중 몇몇의 Big Transaction Table이 거의 모든 데이터를 가지고 있고 나머지 테이블들은 이 Big Transaction Table을 경유하여 액세스하는 용도로 사용됩니다. 이렇게 데이터 크기가 크고 중요한 Big Transaction Table을 관리하는 부분에서 Troubleshooting이 발생될 경우 데이터베이스의 성능 및 관리작업에 심각한 영향을 받을 수 있습니다.


이러한 리스크가 있는 Big Transaction Table을 보다 효율적으로 관리하기 위해 Table을 작은 단위로 나눔으로써 데이터 액세스 작업의 성능 향상을 유도하고 데이터 관리를 보다 수월하게 하고자 하는 개념입니다.


파티션 테이블의 장점

1) 개선된 가용성

 - 파티션은 독립적으로 관리된다.

 - Backup and Restore을 파티션별로 작업할 수 있다.

 - 같은 테이블에서 Unavailable한 파티션은 다른 파티션에 영향을 주지 않는다.

2) 관리의 용이성

 - 사용자가 지정한 값으로 파티션이 가능하다.

 - 테이블스페이스간에 파티션 이동이 가능하다.

 - 파티션 레벨에서 SELECT, DELETE, UPDATE가 가능하다.

3) 개선된 성능

 - 데이터를 액세스할 때 액세스하는 범위를 줄여 퍼포먼스 향상을 가져올 수 있다.

 - RAC(Real Application Clusters) 환경에서 인스턴스간 Block Connection을 감소시킨다.



파티션 테이블 사용시 주의할 점

1) 관리적인 관점

     - 하나의 테이블을 세분화하여 관리하기 때문에 보다 세심한 관리가 요구된다.

     - 파티션을 잘못 구성 또는 관리하여 IU(Index Unusable)에 빠지는 것을 주의해야 한다.

2) 사용하는 관점

     - 파티션 키로 나누어져 있는 테이블에 파티션 키를 조건으로 주지 않아 전체 파티션을 액세스하지 않도록 주의해야 한다.



파티션 테이블의 특징

- 파티션 테이블은 파티션 키 값에 의해 구성되며, 한 테이블 당 가능한 파티션은 이론적으로 65,535개를 지원하나 실질적으로는 10,000개까지만 생성 가능합니다(Oracle Ver 10.2.0.3 테스트)

모든 파티션 테이블(또는 인덱스)는 같은 Logical Attribute를 가져야 합니다. 

   ex) Columns, Data Types, Constraints ...

모든 파티션 테이블(또는 인덱스)는 다른 Physical Attribute를 가져야 합니다.

   ex) PCTFREE, PCTUSED, INITTRANS, MAXTRANS, TABLESPACE, STORAGE ...

- 파티션 테이블은 'KEY', 'VALUES LESS THAN Literal', 'Physical Attributes'로 구성된다.

'VALUES LESS THAN Literal' 절에서 'Literal' 값에는 SQL Function을 지원한다.

- Composite Column 구성은 16개까지 가능합니다.



파티션 종류


오라클 버전에 따른 파티션


1) Oracle Ver 7.3

- Partition View를 처음으로 도입하였다.

- 당시 Partition View는 큰 테이블을 동일한 템플릿을 가진 여러 개의 다른 테이블로 분할하고 UNION ALL을 사용하여 View로 묶은 형태이다.

- 그러나 이 방식은 관리의 어려움, 활용성의 부족, 성능 등에 대한 이슈로 인하여 Oracle Ver 9i에서는 더이상 지원하지 않는다.

2) Oracle Ver 8.0

- 컬럼 값의 Range 기반으로 된 Range Partition이 최초로 도입되었고, 비로소 Partition의 모습을 갖추었다.

- 각 파티션은 각기 다른 테이블 스페이스, Segment에 저장이 가능한다.

3) Oracle Ver 8i

- 컬럼 값의 Hash 기반으로 된 hash partition과 Sub Partition을 할 수 있는 Composite Partition이 추가되었다.

- 이 당시 Composite Partition은 Range-Hash로만 구성 가능함.

4) Oracle Ver 9i

- 리스트 값으로 파티션을 할 수 있는 List Partition이 추가되었다.

- Composite Partition에서는 Range-Hash 이외에 Range-List가 추가 지원되었다.

5) Oracle Ver 10g

- 10T 파티션이 추가되었다.

6) Oracle Ver 11g

- Composite Partition에서 확장된 Extended Composite Partition이 지원된다.

    -> Range-Range, List-Range, List-Hash, List-List

- Reference Partition 추가

- Interval Partition 추가

- System Partition 추가

- Virtual Column Partition 추가



Partition Table


1) Range Partition

- Column Value의 범위를 기준으로 하여 행을 분할하는 형태이다.

- Range Partition에서 Table은 단지 논리적인 구조이며 실제 데이터가 물리적으로 저장되는 곳은 Partition으로 나누어진 Tablespace에 저장이 된다.

- PARTITION BY RANGE ( column_list ) : 기본 Table에서 어느 Column을 기준으로 분할할지를 정함

- VALUES LESS THAN ( value_list ) : 각 Partition이 어떤 값의 범위를 포함할지 Upper Bound를 정함.


- 구문 Sample

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
CREATE TABLE SALES_DATA_2008
(
  COLUMN_1 NUMBER   NOT NULL,
  COLUMN_2 VARCHAR2(4),
  COLUMN_3 VARCHAR2(4),
  COLUMN_4 VARCHAR2(2),
  COLUMN_5 VARCHAR2(2),
  COLUMN_6 NUMBER
)
TABLESPACE TABLE_SPACE_DATA_1
PCTFREE 5
PCTUSED 40
INITRANS 11
MAXTRANS 255
STORAGE
(
  INITIAL 2048K
  NEXT 1024K
  PCTINCREASE 0
  MINEXTENTS 1
  MAXEXTENTS 121
)
PARTITION BY RANGE ( COLUMN_3, COLUMN_4, COLUMN_5 )
(
  PARTITION P_200801 VALUES LESS THAN ('2008', '04', '01'),
  PARTITION P_200802 VALUES LESS THAN ('2008', '07', '01'),
  PARTITION P_200803 VALUES LESS THAN ('2008', '10', '01'),
  PARTITION P_200804 VALUES LESS THAN ('2009', '01', '01'),
  PARTITION P_5    VALUES LESS THAN (MAXVALUE)
  TABLESPACE TABLE_SPACE_DATA_2
  PCTFREE 5
  PCTUSED 40
  INITRANS 11
  MAXTRANS 255
  STORAGE
  (
    INITIAL 1M
    NEXT 1M
    PCTINCREASE 0
    MINEXTENTS 1
    MAXEXTENTS 121
  )
);


2) Hash Partition

- Partitioning column의 Partitioning Key 값에 Hash 함수를 적용하여 Data를 분할하는 방식

- 데이터 이력관리의 목적보다 성능 향상의 목적으로 나온 개념이다.

 Hash Partition은 Range Partition에서 범위를 기반으로 나누었을 경우 특정범위의 분포도가 몰려서 각기 Size가 다르게 되는 것을 보완하여, 일정한 분포를 가진 파티션으로 나누고 균등한 데이터 분포도를 이용한 병렬처리로 퍼포먼스를 보다 향상시킬 수 있다.

- Hash Partition에서 Table은 단지 논리적인 구조이며 실제 데이터가 물리적으로 저장되는 곳은 Partition으로 나누어진 Tablespace에 저장이 된다.


- 구문 Sample

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
CREATE TABLE SALES_DATA_2008
(
  COLUMN_1 NUMBER   NOT NULL,
  COLUMN_2 VARCHAR2(4),
  COLUMN_3 VARCHAR2(4),
  COLUMN_4 VARCHAR2(2),
  COLUMN_5 VARCHAR2(2),
  COLUMN_6 NUMBER
)
TABLESPACE TABLE_SPACE_DATA_1
PCTFREE 5
PCTUSED 40
INITRANS 11
MAXTRANS 255
STORAGE
(
  INITIAL 2048K
  NEXT 1024K
  PCTINCREASE 0
  MINEXTENTS 1
  MAXEXTENTS 121
)
PARTITION BY HASH (COLUMN_3, COLUMN_4, COLUMN_5)
(
  PARTITION P_200801,
  PARTITION P_200802,
  PARTITION P_200803,
  PARTITION P_200804,
  PARTITION P_5 VALUES LESS THAN (MAXVALUE)
)
);



3) Composite(Sub) Partition

- 파티션의 칼럼을 Main-Sub 관계로 나누어 분할하는 방식.

- Composite Partition이 아닌 다른 파티션에서 물리적인 데이터가 저장되는 곳은 Table이 아닌 Partition Table에 저장이 되는 것처럼, Composite Partition에서는 Main Partition이 아닌 Sub Partition에 저장된다.

- Composite Partition의 조합 구성은 Oracle의 버전이 올라갈수록 조합하는 방식을 다양하게 지원한다.



- 구문 Sample

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
CREATE TABLE SALES_DATA_2008
(
  COLUMN_1 NUMBER   NOT NULL,
  COLUMN_2 VARCHAR2(4),
  COLUMN_3 VARCHAR2(4),
  COLUMN_4 VARCHAR2(2),
  COLUMN_5 VARCHAR2(2),
  COLUMN_6 NUMBER
)
TABLESPACE TABLE_SPACE_DATA_1
PCTFREE 5
PCTUSED 40
INITRANS 11
MAXTRANS 255
STORAGE
(
  INITIAL 2048K
  NEXT 1024K
  PCTINCREASE 0
  MINEXTENTS 1
  MAXEXTENTS 121
)
PARTITION BY RANGE ( COLUMN_3, COLUMN_4 )
SUBPARTITION BY HASH ( COLUMN_5 )
(
  PARTITION P_200801 VALUES LESS THAN ('2008', '04'),
  PARTITION P_200802 VALUES LESS THAN ('2008', '07'),
  PARTITION P_200803 VALUES LESS THAN ('2008', '10')
    (SUBPARTITIONS P_200803_S1 TABLESPACE TABLE_SPACE_DATA_1_1,
     SUBPARTITIONS P_200803_S2 TABLESPACE TABLE_SPACE_DATA_1_2,
     SUBPARTITIONS P_200803_S3 TABLESPACE TABLE_SPACE_DATA_1_3,
     SUBPARTITIONS P_200803_S4 TABLEPSACE TABLE_SPACE_DATA_1_4,
     SUBPARTITIONS P_200803_S5 TABLEPSACE TABLE_SPACE_DATA_1_5,
     SUBPARTITIONS P_200803_S6 TABLEPSACE TABLE_SPACE_DATA_1_6,
     SUBPARTITIONS P_200803_S7 TABLEPSACE TABLE_SPACE_DATA_1_7,
     SUBPARTITIONS P_200803_S8 TABLEPSACE TABLE_SPACE_DATA_1_8,
    ),
  PARTITION P_200804 VALUES LESS THAN ('2009', '01')
 
);


4) List Partition

- Partitioning Column의 특정 값으로 분할하는 방식

- 데이터 분포도가 낮지 않고, 균등하게 분포되어 있을때 유용하다.

- Composite Partition에서 'Range-List'일 경우 그 효율이 더욱 높아진다.

- 다른 파티션 방식처럼 다중 컬럼을 지원하지 않고 단일 컬럼만 가능하다.


- 구문 Sample

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
CREATE TABLE SALES_DATA_2008
(
  COLUMN_1 NUMBER   NOT NULL,
  COLUMN_2 VARCHAR2(4),
  COLUMN_3 VARCHAR2(4),
  COLUMN_4 VARCHAR2(2),
  COLUMN_5 VARCHAR2(2),
  COLUMN_6 NUMBER
)
TABLESPACE TABLE_SPACE_DATA_1
PCTFREE 5
PCTUSED 40
INITRANS 11
MAXTRANS 255
STORAGE
(
  INITIAL 2048K
  NEXT 1024K
  PCTINCREASE 0
  MINEXTENTS 1
  MAXEXTENTS 121
)
PARTITION BY LIST(COLUMN_2)
(
  PARTITION RS VALUES('A') TABLESPACE TABLE_SPACE_DATA_2,
  PARTITION RM VALUES('B') TABLESPACE TABLE_SPACE_DATA_3,
  PARTITION RN VALUES('C') TABLESPACE TABLE_SPACE_DATA_4,
);


5) Reference Partition

- Reference Key로 지정된 경우 부모 테이블의 컬럼이 존재하지 않아도 부모의 Partition Key로 분할하는 방식


- 구문 Sample

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
CREATE TABLE CUSTOMERS
(
  CUST_ID   NUMBER    PRIMARY KEY,
  CUST_NAME VARCHAR2(200),
  RATING    VARCHAR2(1)   NOT NULL
)
PARTITION BY LIST(RATING)
(
  PARTITION PA VALUES('A'),
  PARTITION PB VALUES('B')
);
-- Detail Table
CREATE TABLE SALES
(
  SALES_ID   NUMBER   PRIMARY KEY,
  CUST_ID    NUMBER   NOT NULL,
  SALES_AMT  NUMBER,
  CONSTRAINT FK_SALES_01 FOREIGN KEY (CUST_ID) REFERENCES CUSTOMERS
)
PARTITION BY REFERENCE (FK_SALES_01);

- 제약조건

   1) Foreign Key 제약조건이 설정되어 있어야 한다.

   2) 상속받는 테이블의 Key값이 NOT NULL 이어야 한다.


- 테스트

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
-- Normal
SELECT  *
FROM  SALE_TMP  A,
  CUSTOMERS B
WHERE A.CUST_ID = B.CUST_ID
  AND B.RATING = 'A';
 
Rows     Row Source Operation
-------  ------------------------------------
     0    STATEMENT
    28    HASH JOIN 
    28     PARTITION LIST SINGLE PARTITION: 1
    28      TABLE ACCESS FULL CUSTOMERS PARTITION: 1
    56     TABLE ACCESS FULL SALE_TMP
 
 
-- Reference Partition
SELECT  *
FROM  SALES     A,
  CUSTOMERS B
WHERE   A.CUST_ID = B.CUST_ID
  AND B.RATING = 'A';
 
Rows     Row Source Operation
-------  -------------------------------------        
     0    STATEMENT
    28    PARTITION LIST SINGLE PARTITION: 1
    28     HASH JOIN
    28      TABLE ACCESS FULL CUSTOMERS PARTITION: 1
    28      TABLE ACCESS FULL SALES PARTITION: 1


6) Interval Partition

- Range Partition에서 특정 범위를 지정하고 관리할때는 미리 Range를 만들어주어야 하고 생성 이후 분할 또는 병합을 할 때는 추가적인 작업을 해주어야 한다.

- 하지만 'Interval Partition'에서는 각 파티션을 미리 정의함으로써 파티션 생성을 오라클이 직접 해주는 방법입니다.


- 예제 Sample

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
-- 1. Range Partition 생성
CREATE TABLE SALES6
(
  SALES_ID NUMBER,
  SALES_DT DATE
)
PARTITION BY RANGE(SALES_DT)
(
  PARTITION P0701 VALUES LESS THAN (TO_DATE('20070201', 'YYYYMMDD')),
  PARTITION P0701 VALUES LESS THAN (TO_DATE('20070301', 'YYYYMMDD'))
);
 
-- 2. Partition Key 값의 범위에 없는 값으로 Insert
INSERT INTO SALES6 VALUES(1, TO_DATE('20070401', 'YYYYMMDD'));
 
-- Error
ORA-14400: inserted partition key does not map to any PARTITON
 
-- 3. Intrval Partition 생성
CREATE TABLE SALES6
(
  SALES_ID NUMBER,
  SALES_DT DATE
)
PARTITION BY RANGE(SALES_DT) INTERVAL (NUMTOYMINTERVAL(1, 'MONTH'))
(
  PARTITION P0701 VALUES LESS THAN(TO_DATE('20080201', 'YYYYMMDD'))
);
 
-- 4. Partition Key 값의 범위에 없는 값으로 Insert
INSERT INTO SALES6 VALUES(1, TO_DATE('20070601', 'YYYYMMDD'));
 
-- No Error
1 row created.

- 파티션을 특정 테이블 스페이스에 저장하고 싶다면 STORE IN 구문으로 가능하다.

    -> INTERVAL (NUMTOYMINTERVAL(1, 'MONTH')) STORE IN (TS1, TS2, TS3)

- 애플리케이션 개발자가 특정 파티션에 접하고 싶다면 다음의 구문으로 가능하다.

    -> SELECT * FROM SALES6 PARTITION FOR(TO_DATE('20080501', 'YYYYMMDD'));



7) System Partition

- 테이블 생성시 파티션 구간을 미리 설정하는 것이 아니라 임의로 나눈 파티션에 대해 사용자가 원하는 파티션에 데이터를 저장하는 방식.

이 방식은 사용자가 'System Partition'으로 되어 있는 테이블의 데이터를 DML하고자 할 때 직접 파티션을 지정하여 해주어야 한다.

- 로컬 인덱스 생성 시, 인덱스도 동일한 방법으로 파티셔닝된다.


- 예제 Sample

1
2
3
4
5
6
7
8
9
10
11
CREATE TABLE SALES3
(
  SALES_ID  NUMBER,
  PRODUCT_CODE  NUMBER,
  STATE_CODE  NUMBER
)
PARTITION BY SYSTEM
(
  PARTITION P1 TABLESPACE USERS,
  PARTITION P2 TABLESPACE USERS
);


- Insert 할 때는 반드시 파티션을 지정해 주어야 한다.

1
2
3
4
5
6
7
8
9
10
11
12
-- Insert할 때 테이블의 파티션을 지정하지 않을 경우
INSERT INTO SALES3 VALUES(1, 101, 1);
 
-- Error
ERROR at line 1:
ORA-14701: partition-extended name or bind variable must be sued for DMLs on tables partitioned by the System method
 
-- Insert을 할 때 테이블의 파티션을 지정한 경우
INSERT INTO SALES3 PARTITION(P1) VALUES (1, 101, 1);
 
-- No Error
1 row created.


- Delete, Update 할 때는 필수는 아니지만 파티션을 지정하지 않을 경우 모든 파티션을 찾아다녀야 하므로 이 경우에도 가급적 파티션을 지정해 주어야 한다.

1
DELETE SALES3 PARTITION(P1) WHERE STATUS_CODE = 1;


8) Virtual Column Partition

- 파티션으로 나누고자 하는 칼럼이 테이블에서 가공되어 얻을 수 있는 칼럼일 경우 11g 이전에서는 새로운 칼럼을 추가하고 트리거를 이용하여 칼럼 값을 생성하는 방법을 사용하여 많은 오버헤드를 감수하였으나, 11g에서는 'Virtual Column Partition'을 원하여 실제로 저장되지 않는 칼럼을 런타임에 계산하여 생성할 수 있다. 또한 가상 컬럼에 파티션을 적용하는 것도 가능하다.


- 예제 Sample

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
-- Virtual Partition 생성
CREATE TABLE SALES
(
  SALES_ID  NUMBER,
  CUST_ID   NUMBER,
  SALE_CATEGORY   VARCHAR2(6)
  GENERATED ALWAYS AS
  (
    CASE WHEN SALES_AMT <= 10000 THEN 'LOW'
      WHEN SALES_AMT BETWEEN 10000 AND 100000 THEN CASE WHEN CUST_ID < 101 THEN 'LOW'
                  WHEN BETWEEN 101 AND 200 THEN 'MEDIUM'
                  ELSE 'LOW' END
      WHEN SALES_AMT BETWEEN 100000 AND 1000000 THEN CASE WHEN CUST_ID < 1010  THEN 'MEDIUM'
                  WHEN BETWEEN 101 AND 200 THEN 'MEDIUM'
                  ELSE 'ULTRA' END
      ELSE 'ULTRA' END
  ) VIRTUAL
PARTITION BY LIST(SALES_CATEGORY)
(
  PARTITION P_LOW   VALUES ('LOW'),
  PARTITION P_MEDIUM  VALUES ('MEDIUM'),
  PARTITION P_HIGH  VALUES ('HIGH'),
  PARTITION P_ULTRA VALUES ('ULTRA')
);
 
-- Insert 테스트
INSERT INTO SALES(SALES_ID, CUST_ID, SALES_AMT) VALUES (1, 1, 100);
 
-- No Error
1 row created.


Partition Index


1) Local Index

- 인덱스를 생성한 인덱스와 파티션된 인덱스가 동일하게 파티션된 형태를 말합니다.

- 인덱스와 테이블은 같은 칼럼에 의해 파티션되며, 하나의 인덱스 파티션이 테이블 파티션 하나와 대응되며, 대응되는 인덱스 파티션과 테이블 파티션은 각각 같은 범위를 갖게 됩니다.

결국 특정한 하나의 인덱스에 포함된 모든 Key들은 하나의 테이블 파티션 내의 데이타만 가리키게 됩니다.


1-1) Local Prefixed Index

- 인덱스의 맨 앞에 있는 컬럼에 의해 파티션되는 방식입니다.

Local Prefixed Index에서 칼럼은 Unique/Non-Unique를 모두 허용합니다.

- Base Table 의 파티션이 변경되면 Local Index의 관련 파티션만 변경이 됩니다.

1
2
3
4
5
6
7
8
9
10
11
12
13
CREATE TABLE DEPT
(
  DEPT  NUMBER    NOT NULL,
  DNAME   VARCHAR2(10)  NOT NULL,
  LOC VARCHAR2(14)
)
PARTITION BY RANGE (DEPTNO)
(
  PARTITION PART_1 VALUES LESS THAN (30),
  PARTITION PART_2 VALUES LESS THAN (MAXVALUE)
);
 
CREATE INDEX DEPT_N1 ON DEPT(DEPTNO) LOCAL;


1-2) Local Non-Prefixed Index

- Index의 첫번째 Column이 Partition Key가 아닌 형태로 Base Table과 동일한 Partition 구조를 가진 Index입니다(equi-partitioned)

- 빠른 Access가 요구될 때 유용합니다(Base Table의 Partition Key는 제외)

- Partition 단위로 관리할 수 있으므로 Global Index에 비해 운영상 편리합니다.

OLAP 측면에서 Global Index보다 조회 속도가 저하됩니다.


1
2
3
4
5
6
7
8
9
10
11
12
13
CREATE TABLE DEPT
(
  DEPTNO  NUMBER    NOT NULL,
  DNAME VARCHAR2(10)  NOT NULL,
  LOC   VARCHAR2(14)
)
PARTITION BY RANGE (DEPTNO)
(
  PARTITION PART_1 VALUES LESS THAN (30),
  PARTITION PART_2 VALUES LESS THAN (MAXVALUE)
);
 
CREATE INDEX DEPT_N2 ON DEPT(LOC) LOCAL;


2) Global Index

- Global Index는 테이블과 다르게 파티션되는 경우입니다.


2-1) Global Prefixed Index

- Base Table과 비교하여 not equi-partitioned 상태입니다.

- Oracle은 only Index structure만 관리합니다. (Partition은 관리안함)

- 최종 Partition에는 Maxvalue값이 반드시 기술되어야 합다.

- Local index보다 관리하기 힘듭니다.

기준 Table의 Partition이 변경되면 global index의 모든 Partition에 영향을 미칩니다.

  (Global Index 재생성 해야함) 

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
-- 테이블 생성
CREATE TABLE SALES_DATA_2008
(
  COLUMN_1 NUMBER   NOT NULL,
  COLUMN_2 VARCHAR2(4),
  COLUMN_3 VARCHAR2(4),
  COLUMN_4 VARCHAR2(2),
  COLUMN_5 VARCHAR2(2),
  COLUMN_6 NUMBER
)
PARTITION BY RANGE ( COLUMN_3, COLUMN_4 )
(
  PARTITION P_200801 VALUES LESS THAN ('04', '01'),
  PARTITION P_200802 VALUES LESS THAN ('07', '01'),
  PARTITION P_200803 VALUES LESS THAN ('10', '01'),
  PARTITION P_200804 VALUES LESS THAN ('12', MAXVALUE)
);
 
-- Global Prefixed Index
CREATE UNIQUE INDEX RANGE2_GPX8 ON SALES_DATA_2008(COLUMN_2, COLUMN_1)
TABLESPACE TABLE_SPACE_DATA_1
PCTFREE   10
STORAGE( INITIAL 100K NEXT 100K PCTINCREASE 0 )
GLOBAL PARTITION BY RANGE ( CODE )
(
  PARTITION P_2008_P1 VALUES LESS THAN ('2000'),
  PARTITION P_2008_P2 VALUES LESS THAN ('3000'),
  PARTITION P_2008_P3 VALUES LESS THAN (MAXVALUE)
);


2-2) Non-Partitioned Index

- 파티션과는 아무런 상관없는 Normal Index를 말함.



파티션을 사용할 때 알아야 할 사항들


파티션 테이블 및 인덱스 관리를 위한 명령어들

1) 일반 테이블 파티션 하기


- Export/Import 하는 방법

1
2
3
4
5
6
7
8
9
10
11
12
13
14
<b></b>-- 테이블을 Export 한다.
exp user/password tables=number file=exp.dmp
 
-- 백업받은 테이블을 제거한다.
drop table numbers;
 
-- 파티션 테이블을 생성한다.
CREATE TABLE NUMBER(QTY NUMBER(3), NAME VARCHAR2(15))
PARTITION BY RANGE(QTY)
  ( PARTITION P1 VALUES LESS THAN (501),
    PARTITION P2 VALUES LESS THAN (MAXVALUE));
 
--ignore=y를 사용하여 데이터를 Import한다.
imp user/password tables=number file=ex.dmp ignore=y


- Subquery를 이용한 방법

1
2
3
4
5
6
7
8
-- 파티션 테이블을 생성한다.
CREATE TABLE PARTBL(QTY NUMBER(3), NAME VARCHAR2(15))
PARTITION BY RANGE(QTY)
  ( PARTITION P1 VALUES LESS THAN (501),
    PARTITION P2 VALUES LESS THAN (MAXVALUE));
 
-- Subquery를 이용하여 파티션 테이블에 데이터를 입력한다.
INSERT INTO PARTBL(QTY, NAME) SELECT * FROM ORIGTBL;


- Partition Exchange 명령어를 하는 방법

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
-- ALTER TABLE EXCHANGE PARTITION은 파티션 테이블을 일반 테이블로,
-- 또는 파티션 되어있지 않은 테이블을 파티션 테이블로 변경시킬 때 사용한다.
 
-- 파티션 테이블 생성
CREATE TABLE P_EMP (SAL NUMBER(7,2))
PARTITION BY RANGE(SAL)
  (PARTITION EMP_P1 VALUES LESS THAN (2000),
   PARTITION EMP_P2 VALUES LESS THAN (4000));
 
-- 첫번째 파티션에 들어갈 데이터
CREATE TABLE DUMMY_Y
SELECT  SAL
FROM  EMP
WHERE   SAL < 2000;
 
-- 두번째 파티션에 들어갈 데이터
CREATE TABLE DUMMY_Z
SELECT  SAL
FROM  EMP
WHERE SAL BETWEEN 2000 AND 3999;
 
ALTER TABLE P_EMP EXCHANGE PARTITION EMP_P1
WITH TABLE DUMMY_Y;
 
ALTER TABLE P_EMP EXCHANGE PARTITION EMP_P2
WITH TABLE DUMMY_Z;


- 여러 개의 파티션으로 분리된 테이블 중 일부의 파티션만 가진 테이블 생성하기

1
2
3
4
5
6
7
8
9
-- 데이타를 Export한 후 필요한 파티션으로 이루어진 테이블을 생성한다.
-- 데이터 생성
CREATE TABLE YEAR(COL1 DATE) PARTITION BY RANGE (COL1)
  ( PARTITION OCTOBER   VALUES LESS THAN ('01-NOV-1999') TABLESPACE OCTOBER,
    PARTITION NOVEMBER  VALUES LESS THAN ('01-DEC-1999') TABLESPACE NOVEMBER,
    PARTITION DECEMBER  VALUES LESS THAN (MAXVALUE) TABLESPACE DECEMBER);
-- 데이터를 Import
IMP USERNAME/PASSWORD FILE=EXPDAT.DMP FROMUSER=<owner> TOUSER=<owner>
TABLES=(YEAR:OCTOBER, YEAR:NOVEMBER, YEAR:DECEMBER)</owner></owner>


- 파티션을 추가하는 방법

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
-- 파티션 테이블 생성
CREATE TABLE PART_TBL
(
  IN_DATE  CHAR(8)  PRIMARY KEY,
  EMPNO    NUMBER,
  ENAME    VARCHAR2(20),
  JOB      VARCHAR2(20)
)
PARTITION BY RANGE (IN_DATE)
(
  PARTITION PART_TBL_03 VALUE LESS THAN ('20000331') TABLESPACE PTS_03,
  PARTITION PART_TBL_04 VALUE LESS THAN ('20000430') TABLESPACE PTS_04,
  PARTITION PART_TBL_05 VALUE LESS THAN ('20000531') TABLESPACE PTS_05,
  PARTITION PART_TBL_06 VALUE LESS THAN ('20000630') TABLESPACE PTS_06,
  PARTITION PART_TBL_07 VALUE LESS THAN ('20000731') TABLESPACE PTS_07,
  PARTITION PART_TBL_08 VALUE LESS THAN ('20000831') TABLESPACE PTS_08,
  PARTITION PART_TBL_09 VALUE LESS THAN ('20000930') TABLESPACE PTS_09,
  PARTITION PART_TBL_10 VALUE LESS THAN ('20001031') TABLESPACE PTS_10
);
 
-- 파티션 추가
ALTER TABLE PART_TBL ADD PARTITION PART_TBL_11 VALUES LESS THAN ('20001130') TABLESPACE PTS_11;
ALTER TABLE PART_TBL ADD PARTITION PART_TBL_12 VALUES LESS THAN ('20001231') TABLESPACE PTS_12;


- 특정 파티션을 삭제하는 방법

특정 파티션 삭제 이후 삭제한 파티션의 값이 들어올 경우 그 다음 VALUES LESS THAN으로 편입됩니다.

1
ALTER TABLE PART_TBL DROP PARTITION PART_TBL_08;


- 파티션을 나누는 방법

만약 3월만 들어가있는 파티션이 있을 경우, 여기서 1, 2월을 추가하려면 파티션에 ADD가 아닌 SPLIT을 해주어야 합니다.

1
2
3
4
5
6
7
8
9
-- 3월 파티션에서 2월과 3월을 SPLIT함.
ALTER TABLE PART_TBL SPLIT PARTITION PART_TBL_03 AT ('20000229')
  INTO (PARTITION PART_TBL_02    TABLESPACE PTS_02,
        PARTITION PART_TBL_03_1  TABLESPACE PTS_03);
 
-- 2월 파티션에서 1월과 2월을 SPLIT함.
ALTER TABLE PART_TBL SPLIT PARTITION PART_TBL_02 AT ('20000131')
  INTO (PARTITION PART_TBL_01    TABLESPACE PTS_01,
        PARTITION PART_TBL_02_1  TABLESPACE PTS_02);


- 파티션 이름을 변경하는 방법

1
ALTER TABLE PART_TBL RENAME PARTITION PART_TBL_02_1 TO PART_TBL_02;


- 파티션의 테이블스페이스를 옮기는 방법

1
ALTER TABLE PART_TBL MOVE PARTITION PART_TBL_10 TABLESPACE PTS_10_1 NOLOGGING;


- 특정 파티션의 데이터를 Truncate하는 방법

Partition의 Data를 모두 삭제하려면 Truncate하는 방법을 사용할 수가 있는데,

Truncate는 Rollback이 불가능하며 특정 Partition 전체를 삭제하므로 주의하여 사용하여야 합니다.

1
ALTER TABLE PART_TBL TRUNCATE PARTITION PART_TBL_02;


- 파티션 테이블의 물리적인 속성 변경하는 방법

Partition Table은 특정 Partition의 속성만 변경할 수 있고, Table의 속성을 변경하여 전체 Partition에 대해 동일한 변경을 할 수 있습니다.

1
2
3
4
-- part_tbl의 모든 Partition의 Next 값이 변경
ALTER TABLE PART_TBL STORAGE (NEXT 10M);
-- part_tbl_05 Partition의 Maxextents 값만 변경
ALTER TABLE APRT_TBL MODIFY PARTITION PART_TBL_05 STORAGE (MAXEXTENTS 1000);


- 인덱스 관리

파티션 테이블 관련 변경작업을 한 후에는 테이블에 걸려있는 Local, Global Index에 대해 반드시 Rebuild를 해주어야 합니다.

1
2
3
4
-- 특정 파티션의 인덱스 Rebuild
ALTER INDEX IND_PART_TBL REBUILD PARTITION I_PART_TBL_02;
-- 글로벌 인덱스 Rebuild
ALTER INDEX PART_TBL_PK REBUILD;


Backup & Recovery


1) Export

 - Table-Level Export

    기존의 Table Export처럼 Table 전체를 Export하는 경우입니다. 이는 Emp Table(Partitioned 또는 Non-Partitioned) 전체를 Export하는 경우입니다.

    $ exp scott/tiger tables=emp file=emp.dmp


 - Partition-Level Export

    이는 Partition Table의 일부 Partition만을 Export하는 것으로, Full Mode의 Export시에는 사용하지 못하고, Table단위의 Export시에만 가능합니다. ':'을 이용하여 Partition 이름을 지정하며 이 경우 Emp Table의 px Partition만을 Export합니다.

    $ exp scott/tiger tables=emp:px file=emp_par.dmp


- 다음과 같이 두가지 경우를 Level을 혼용하여 사용하는 것도 가능합니다.
    Sales Table은 전부를, Emp Table에서는 px Partition만을 Export.
     $ exp scott/tiger tables=(emp:px, sales) file=both.dmp

2) Import

 - Table-Leve Import

    Partitioned 또는 Non-Partitioned Table 전체를 Import 합니다. 모든 Import Mode (full, user, table)에서 사용됩니다. emp table(Partitioned 또는 non-Partitioned) 전체를 Import 합니다.

    $ imp scott/tiger file=wookpark.dmp tables=emp


 - Partition-Level Import

    Export Dump File에서 (full, user, table 중 어떠한 Mode를 이용하여 Export했건간에)

    Partitioned Tabled의 일부 Partition만을 Import합니다.

    Table Import Mode에서만 사용 가능합니다.


    -- emp table의 px Partition만을 Import

    -- ':'을 이용하여 Partition을 지정

     $ imp scott/tiger file=wookpark.dmp tables=emp:px


테이블 단위의 Import시 우선 Table Creation 문장을 행하고 Row Insert문을 수행하는 것과 마찬가지로, Partition-level Import도 우선 Partitioned Table의 생성 문장을 수행하고 Row Insert문을 수행하게 됩니다.


따라서 ignore=y option등을 적절히 사용하면, Non-Partitioned Table과 Partitioned Table간의 Partitioned Table의 구조 변경등을 수행할 수 있게 됩니다.



출처: http://12bme.tistory.com/290?category=749950 [goorm>=5; 길은 가면, 뒤에 있다]

블로그 이미지

낭만가을

,

* 테이블스페이스: 논리적(메모리)
- 오라클 데이터베이스는 하나 이상의 논리적 저장영역 테이블스페이스가 있고 데이터를 집합적으로 저장합니다.
- 하나 이상의 데이터 파일로 구성되어 있습니다.


1. 테이블 스페이스 유형


1.1. 시스템 테이블스페이스(사용자가 건드릴수 없다)
  - 데이터 베이스와 함께 생성됩니다.
  - 데이터 딕셔너리 포함
  - 시스템 Undo Segment를 포함합니다.

1.2. 비시스템 테이블스페이스(사용자가 필요하면 만들고, 지우면서 사용가능)
- 데이터베이스 관리와 공간 관리를 용이하게 할 수 있습니다.
- Undo Segment, Temporary Segment, 응용 프로그램 데이터 세그먼트 및 인덱스 세그먼트를 분할합니다.
- 사용자에게 할당된 공간의 양을 제어합니다.



2. 테이블스페이스 생성(기본)



SQL> CREATE TABLESPACE <테이블스페이스명>
    DATAFILE '<데이터 파일명>' SIZE <크기>    // 생성하는 파일은 크기에 따른 빈파일이 생성
    AUTOEXTEND ON NEXT 5M MAXSIZE 200M;       // 5M씩 최대 200M까지 자동 증가 200M가 다차면 에러발생
                             MAX SIZE가 없으면 32비트:16기가, 64비트:32기가까지 가능



3. 테이블 스페이스 영역관리


테이블스페이스는 확장영역에 공간을 할당합니다.


3.1. DMT(Dictionary Managed Tablespace): 10g부터는 DMT사용안함.
- 데이터 딕셔너리에서 사용 가능한 확장 영역을 관리. 서버 프로레스가 빈 블록을 찾을때 사용중인 곳과 빈 곳을 리스트로 작성 관리(Uetf, Fetf)하는 데이터 딕셔너리 관리합니다.
- 확장 영역이 할당될시 할당해제시 해당 테이블이 갱신됩니다.
- 개인별로 하나씩은 가능하지만 단번에 벌크로 들어오면 데이터가 선형대기상태로 전환돼 처리가 느립니다.

3.2. LMT(Locally Managed Tablespace): 오라클 9i부터 기본설정되서 안써줘도 됨.
많은 데이터가 한꺼번에 들어오는 문제를 해결하기 위해 지역적으로 관리되는 테이블스페이스가 기본 관리 방식으로 추가합니다.
- 자체 Extent에 대한 관리를 각각의 데이터 파일에 비트맵 형식으로 저장하여 관리하는 테이블스페이스입니다.
데이터파일을 구성하는 블럭이 비었는지, 사용중인지에 대한 정보를 관리합니다.
- 테이블스페이스 할당량 정보와 같은 특별한 경우를 제외하고 확장 영역 비트맵의 변경사항은 데이터 딕셔너리에 있는 테이블을 갱신하지 않으므로 실행 취소 정보를 생성하지 않습니다.
- 데이터 딕셔너리 테이블에 사용 가능 영역을 기록하지 않으므로 테이블의 경합을 줄입니다.
- 인접한 사용 가능 공간을 자동 추적하므로 사용 가능한 확장 영역을 통합할 필요가 없습니다.


4. Undo Tablespace(실행취소 테이블스페이스)


- 실행취소 세그먼트를 저장하고 다른 객체를 포함할 수 없습니다.
- 확장영역을 지역적으로 관리하며 데이터 파일절 및 Extent Management절만 사용합니다.


SQL> CREATE UNDO TABLESPACE undo1
    DATAFILE '/u01/oradata/undo01.dbf' size 40M;




5. Temporary Tablespaces(임시 테이블스페이스)


정렬 작업에 사용하여 공간을 효과적으로 관리할 수 있습니다.
서버 프로세스가 DB 캐시로부터 100만건의 데이터를 받아 PGA(Program Global Area)에서 정렬 작업을 합니다. PGA용량이 충분하다면 정렬이 되겠지만 용량이 작다면 100만건의 데이터가 정렬할때까지 전달하지 못합니다. 이런경우 임시 테이블스페이스를 사용합니다. 저장하는 곳이 아니며 임시로 사용하는 공간입니다. 임시 테이블스페이스도 부족할 경우에는 자신의 용량만큼만 수행을 하고 에러가 발생하고 멈춰버립니다.


SQL> CREATE TEMPORARY TABLESPACE temp
    TEMPFILE '/u01/oradata/temp01.dbf' SIZE 500M
    EXTENT MANAGEMENT LOCAL UNIFORM SIZE 4M;



5.1. Default Temporary Tablesapce(기본임시 테이블스페이스)
- 모든 데이터베이스를 생성할 경우 System 테이블스페이스는 기본 임시 테이블스페이스로 사용됩니다.
- 기본 임시 테이블스페이스를 생성하면 System 테이블 스페이스는 사용되지 않습니다.
- 하나의 임시 테이블스페이스를 여러곳에서 사용할순 있지만 동시에 사용은 불가능합니다. 이런경우 데이터 처리가 줄을 서게됩니다. 그래서 각각 임시 테이블스페이스를 여러개 만들어 1:1로 할당을 해주면 좋습니다. 하지만 만드는 것도 중요하지만 관리가 더 중요할 것입니다.

기본임시 테이블스페이스 생성 및 찾기

SQL> ALTER DATABASE DEFAULT TEMPORARY TABLESPACE temp;   // 생성
SQL> SELECT * FROM DATABASE_PROPERTIES;          // 질의



5.2. 제한 사항
- 새 기본값을 사용할 수 있을때까지 기본 임시 테이블스페이스는 삭제할 수 없습니다. 기본 임시 테이블스페이스 변경은 ALTER DATABASE 명령 사용합니다.
- 오프라인으로 설정 불가능
- 영구 테이블스페이스로 변경 불가능


6. Read Only Tablespaces(읽기 전용 테이블스페이스)



SQL> ALTER TABLESPACE userdata READ ONLY;

- 테이블이 모두 SELECT밖에 되지 않는다. 데이터를 읽을 수만 있다는 것이다.
  다시 반대로 적용하기 위해 Read Write로 쿼리를 입력하면 원상복귀된다.


7. 테이블스페이스 오프라인 설정


- 오프라인 설정을 하면 이후의 SQL문은 이 테이블스페이스에 포함된 객체를 참조할수 없게 된다. 데이터 액세스 불가
- 오프라인 설정 불가 테이블 스페이스 : SYSTEM 테이블스페이스, UNDO 테이블스페이스, DEFAULT TEMPORARY 테이블 스페이스

SQL> ALTER TABLESPACE userdata OFFLINE;        // 오프라인 설정
SQL> ALTER TABLESPACE userdata ONLINE;        // 온라인 설정



8. 테이블스페이스 크기 조정


- 테이블 파일의 크기 변경

CREATE DATABASE
CREATE TABLESPACE
ALTER TABLESPACE ... ADD DATAFILE


자동: AUTOEXTEND를 사용한 자동 변경

SQL > CREATE TABLESPACE user_data
    DATAFILE '/u10/oradata/userdata01.dbf' SIZE 200M
    AUTOEXTEND ON NEXT 10M MAXSIZE 500M;


수동: ALTER DATABASE를 사용한 수동 변경: 에러날때마다 수동으로 늘려야 하는 단점

SQL > ALTER DATABASE
    DATAFILE '/u03/oradata/userdata02.dbf'
    RESIZE 200M;


- ALTER TABLESPACE를 사용하여 데이터 파일 추가(테이블 추가)
    순차 저장이 아닌 분산 저장으로 추가된 데이터파일은 똑같은 양으로 저장이 되며 속도 향상이 된다.

SQL > ALTER TABLESPACE user_data
    ADD DATAFILE '/u01/oradata/userdata03.dbf'
    SIZE 200M;



9. 데이터 파일 이동 방식


ALTER TABLESPACE
 - 테이블스페이스는 오프라인이어야 한다.
 - 대상 데이터 파일은 반드시 존재해야 한다.


SQL > ALTER TABLESPACE user_data RENAME
    DATAFILE '/u01/oradata/userdata01.dbf'        // 원래 있던 경로
    TO '/u02/oradata/userdata01.dbf'        // 변경 경로



* 파일이동시, 따라야할 순서
1. 해당 파일을 사용 안하게 만들어야 한다.(오프라인, Shutdown-오프라인이 안될 경우: Undo, SYSTEM, DEFAULT)
2. OS명령어로 복사/이동
3. 위치정보 변경 - 데이터 파일 정보가 들어있는 ControlFile 수정(컨트롤 파일 수정시 마운트 상태에서 수정)
4. 사용할 수 있도록 설정 : 테이블스페이스 온라인 설정

ALTER DATABASE
- 데이터베이스는 마운트 되어야 한다.
- 대상 데이터 파일이 존재해야 한다.


SQL > ALTER DATABASE RENAME
    FILE '/u01/oradata/system01.dbf'
    TO '/u03/oradata/system01.dbf';



10. 테이블 스페이스 삭제


- 삭제 안되는 경우
    SYSTEM 테이블스페이스인 경우, 테이블스페이스에 사용중인 세그먼트가 있을 경우
- INCLUDING CONTENTS는 세그먼트를 삭제
- INCLUDING CONTENTS AND DATAFILES: 데이터파일을 삭제
- CASCADE CONSTRAINTS: 모든 참조 무결성 제약 조건 삭제


SQL > DROP TABLESPACE userdata
    INCLUDING CONTENTS AND DATAFILES;



11. 테이블스페이스 정보보기


테이블 스페이스: DBA_TABLESPACES, V$TABLESPACE
데이터 파일 정보: DBA_DATA_FILES, V$DATAFILE
임시파일 정보: DBA_TEMP_FILES, V$TEMPFILE


DATA FILE 및 TABLESPACE관련 조회

SQL> select tablespace_name, status, contents,
         extent_management, segment_space_management
         from dba_tablespaces;
SQL> select tablespce_name, bytes, file_name from dba_data_files;



테이브스페이스 생성

SQL> create tablespace < tablespace 명>
         datafile '<data file명>' size <크기>
         segment space management auto;    //10g에서는 사용 안해도 됨
SQL> create tablespace < tablespace 명>
         datafile '<data file명>' size <크기>
         extent management local;
SQL> create undo tablespace < tablespace 명>
         datafile '<data file명>' size <크기>
SQL> create temporary tablespace < tablespace 명>
         datafile '<data file명>' size <크기>
SQL> create tablespace < tablespace 명>
         datafile '<data file명>' size <크기>
         blocksize<크기>
         segment space management auto;


테이블스페이스 확장

SQL> alter tablespace < tablespace 명>
         add datafile '<data file명>' size <크기>;
SQL> alter database datafile
         '<data file명>' resize <크기>;



테이블스페이스 관리

SQL> alter tablespace <tablespace 명> offline;
SQL> alter tablespace <tablespace 명> online;
SQL> alter tablespace <tablespace명> rename
         datafile '<원본data file명>'
         to '<data file명>'
SQL> alter database rename
         datafile '<원본data file명>'
         to '<data file명>'



테이블스페이스 삭제

SQL> drop tablespace <tablespace명>
         including contents and datafiles cascade constraints;



출처: http://12bme.tistory.com/300?category=749950 [goorm>=5; 길은 가면, 뒤에 있다]

블로그 이미지

낭만가을

,

'플래시 게임 > 액션' 카테고리의 다른 글

스트리트 파이터2  (0) 2017.01.21
메탈 슬러그  (0) 2017.01.13
닌자 VS 좀비 2  (0) 2017.01.13
블로그 이미지

낭만가을

,

/*************************************************************
  SQL & SQL*PLUS Syntax 정리
**************************************************************/

             ----------------------------------------------------
            -       * syntax 기호                                    -
             -                                                                           -
             -         [] : 대괄호 안의 내용이 생략가능                     -
             -          | : 또는                                                      -
             -        {} : 중괄호 안의 내용이 하나 이상 올 수 있다.     -
             -        ... : 앞 표기와 같은 형식으로 더 올 수 있다.        -
             -          , : 구분자                                                    -
             ---------------------------------------------------- 

* SELECT
SELECT [DISTINCT] {*, COLUMN [ALIAS], . . .}
FROM TABLE_NAME
[WHERE CONDITION]
[ORDER BY {COLUMN, EXPRESSION} [ASC|DESC]];

* 비교연산자
= : 같다.
> : 보다 크다.
>= : 보다 크거나 같다.
< : 보다 작다.
<= : 보다 작거나 같다.
<>, !=, ^= : 같지 않다.
NOT Column_name = : 같지 않다.
NOT Column_name > : 보다 크지 않다.

* SQL연산자
between a and b : a와 b 사이에 있다. (a, b값 포함)
in (list) : list의 값 중 어느 하나와 일치한다.
like : 문자형태와 일치한다. (%, _ 사용)
      %는 값이 없거나 하나이상, _는 하나의 문자
in null : null 값을 가졌다.
not between a and b : a와 b사이에 있지 않다. (a, b값 포함하지 않음)
not in (list) : list의 값과 일치하지 않는다.
not like : 문자 형태와 일치하지 않는다.
not is null : null 값을 갖지 않는다.

* 논리연산자
and : 양쪽 컴포넌트의 조건이 true이면 true를 리턴
or : 한쪽 컴포넌트의 조건만이 true이면 true를 리턴
not : 이후의 조건이 false이면 true를 리턴

* 우선순위 규칙
1) 괄호
2) 수치연산자 > 결합연산자 > 비교연산자
3) is[not] null, like, [not] in > [not] between
4) not > and > or

* 문자형 함수
1) 변환함수
lower : 알파벳값을 소문자로 변환
syntax -> lower(column|expression)
upper : 알파벳 값을 대문자로 변환
syntax -> upper(column|expression)
initcap : 첫번째 글자만 대문자로 변환
syntax -> initcap(column|expression)
2) 문자조작함수
concat : 두 문자열을 연결(합성)        
syntax -> concat(column1|expression1, column2|expression2)
substr : 문자열 중 특정 문자 또는 문자열의 일부분을 선택        
syntax -> substr(column|expression,m,[,n])
length : 문자열의 길이를 구함        
syntax -> length(column|expression)
instr : 명명된 문자의 위치를 구함        
syntax -> instr(column|expression,m[,n])
lpad : 왼쪽 문자자리 채움        
syntax -> lpad(column|expression,n,''''string'''')
rpad : 오른쪽 문자자리 채움        
syntax -> rpad(column|expression,n,''''string'''')
ltrim : 왼쪽 문자를 지움        
syntax -> ltrim(column1|expression1, ''''string'''')
rtrim : 오른쪽 문자를 지움        
syntax -> rtrim(column1|expression1, ''''string'''')
translate : 특정 문자열을 대체        
syntax -> translate(column1|expression1, ''''string1'''', ''''string2'''')
replace : 특정 문자열을 대신        
syntax -> replace(column1|expression1, ''''string1'''', ''''string2'''')

* 숫자형 함수
round : 숫자를 반올림
syntax -> round(column1|expression1, n)
trunc : 숫자를 절삭
syntax -> trunc(column1|expression1, n)
mod : 나머지를 구함
syntax -> mod(column1|expression1, n)
power : 거듭제곱
syntax -> power(column1|expression1, n)
sqrt : 제곱근
syntax -> sqrt(column1|expression, n)
sign : 양수, 음수, 0인지를 구분
syntax -> sign(column1|expression1)
chr : ascii값에 해당하는 문자를 구함
syntax -> chr(column1|expression1)

* 날짜연산
date + number : 결과는 date : 일수를 날짜에 더함
date - number : 결과는 date : 날짜에서 일수를 뺌
date - date : 결과는 일수(숫자) : 어떤 날짜에서 다른 날짜를 뺌
date + number/24 : 결과는 date : 시간을 날짜에 더함

* 날짜함수
months_between : 두 날짜사이의 월수를 계산
syntax -> months_between(date1, date2)
add_months : 월을 날짜에 더함
syntax -> add_months(date1, n)
next_day : 명시된 날짜로부터 다음 요일에 대한 날짜를 나타냄
syntax -> next_day(date1, ''''string''''|n)
last_day : 월의 마지막 날을 계산
syntax -> last_day(date1)
round : 날짜를 반올림
syntax -> round(date1 [,fmt]) -> fmt는 ''''month'''', ''''year''''
trunc : 날짜를 절삭
syntax -> trunc(date1 [,fmt]) 

* 암시적 형변환 (Oracle서버가 자동형변환)
varchar2 or char -> number
varchar2 or char -> date
number -> varchar2
date -> varchar2

* 변환함수
to_char : 숫자나 문자값을 지정한 형식의 varchar2문자열로 변환
syntax1 -> to_char(date, ''''fmt'''') : 날짜를 문자로
syntax2 -> to_char(number, ''''fmt'''') : 숫자값을 문자로
to_number : 숫자를 포함하는 문자열을 숫자로 변환
syntax -> to_number(char) : 숫자를 포함하는 문자열을 숫자로 변환
to_date : 날짜를 나타내는 문자열을 명시된 날짜로 변환
syntax -> to_date(char [,''''fmt'''']) : 날짜를 나타내는 문자열을 명시된 날짜로 변환

* 날짜 형식
scc or cc : 세기(BC날짜에는 -를 붙임)
years indates yyyy of syyyy : 년(BC날짜에는 -를 붙임)
yyy or yy or y : 년의 마지막 3, 2 또는 1자리 수
y,yyy : 콤마가 있는 년
|yyy,|yy,|y,| : ISO표준에 바탕을 둔 4, 3, 2또는 1자리 수
syser or year : 문자고 표현된 년(BC날짜에는 _S를 붙임)
bc or ad : bc/ad 지시자
b.c or a.d : .이 있는 bc/ad지시자
q : 년의 4분의 1
mm : 두자리 값의 월
month : 9자리를 위해 공백을 추가한 월이름
mon : 세자리의 약어로 된 월이름
rm : 로마숫자 월
ww or w : 년이나 월의 주
ddd or dd or d : 년, 월 또는 주의 일
day : 9자리를 위해 공백을 추가한 요일 이름
dy : 세자리 약어로 된 요일 이름
j : Jilian day (bc4713년 12월 31일 이후의 요일 수)

* 시간형식
am or pm : 정오 지시자
a.m or p.m : .이 있는 정오 지시자
hh or hh12 or hh24 : 하루 중 시간(1-12, 0-23)
mi : 분(0-59)
ss : 초(0-59)
sssss : 자정 이후의 초(0-86399)
/ . , : 사용 문자가 결과에 다시 나타남
"문자" : 인용부호내의 문자(들)가 결과에 출력

* 숫자에 영향을 주는 접미사
th : 서수(ddth -> 4th)
sp : 명시한 수(ddsp -> four)
spth or thsp : 명시한 서수(ddspth -> fourth)

* 숫자형식
9 : 9의 수는 출력폭을 지정
0 : 맨 앞에 0을 출력
$ : $ 기호
L : 지역 화폐기호
. : 명시한 위치에 소수점
, : 명시한 위치에 콤마
mi : 우측에 마이너스 기호(음수 값)
pr : 음수를 ()로 묶음
eeee : 과학적인 부호 표기
v : 10을 n번 곱함
b : 0을 0아닌 공백으로 출력

* 기타함수
case, decode : case나 if-then-else-end if 문장의 조건적 조회
1) case
syntax -> case expr when 조건 then 반환값
                             [when 조건 then 반환값]
                              ...
                             else 반환값
               end
2) decode
syntax -> decode(col|expr, search1, result1[,search2, result2, ...][,default])

* 중첩함수 : 여러 단일행함수의 중첩
syntax -> f3(f2(f1()))

* 그룹함수
avg(distinct|all|n) : null값을 제외한 n개 행의 평균값
count(distinct|all|expr|*) : null이 아닌 행의 개수
max(distinct|all|expr) : 최대값
min(distinct|all|expr) : 최소값
stddev(distinct|all|n) : null값을 제외한 n의 표준편차
sum(distinct|all|n) : null값을 제외한 n의 합계
variance(distinct|all|n) : null값을 제외한 n의 분산

* 그룹함수
syntax : select group_function(column) [,group_function(column)...]
            from table_name
            [where condition]
            [ order by column]

* 그룹핑
syntax : select group_function(column) [,group_function(column)...]
            from table_name
            [where condition]
            [group by group_by_expression]
            [having group_condition]
            [ order by column]

* 조인
1) cartesian join : 모든 가능한 행들의 조인 (결과가 의미없는 경우가 대부분)
2) equi join(inner join) : 조인 조건이 정확히 일치하는 경우 사용 (일반적으로 PK, FK사용)
syntax : select table1.column1 [,table2.column2, ...]
            from table1, table2
            where table1.column1 = table2.column2;
3) non-equi join : 조인 조건이 정확히 일치하지 않는 경우에 사용
4) outer join : 조인 조건이 정확히 일치하지 않는 경우에도 모든 행들을 출력
                  조인시킬 값이 없는 쪽에 (+)연산자 적용
syntax : select table1.column1 [,table2.column2, ...]
            from table1, table2
            where table1.column1 = table2.column2(+);
5) self join : 하나의 테이블에서 행들을 조인하고자 할 경우에 사용

* SET연산자
syntax : select *|column1[,column2, column3, ...]
            from table1
            ...
           set operator
            select *|column1[,column2, column3, ...]
            from table2
            ...
           [order by column|expression];
1) union : 각 결과의 합 (합집합:중복되는 값은 한번만 출력)
2) union all : 각 결과의 합 (합집합:중복되는 값 그대로 출력)
3) intersect : 각 결과의 중복되는 부분만 출력 (교집합)
4) minus : 첫번째 결과에서 두번째 결과를 뺌 (차집합)

* 서브쿼리
syntax : select select_list 
            from table
            where expression
            operator
            (select select_list 
            from table
            where expression)

* 서브쿼리에서의 연산자(operator)
1) in : 2개 이상의 값을 리턴하는 서브쿼리에 대해 비교연산자를
       기술하면 에러가 발생. 이런 경우 서브쿼리에서 리턴된 목록의
       각각과 비교하여 쿼리를 수행하는 연산자
2) any : 서브쿼리에서 리턴된 목록의 각각의 값과 비교
3) all : 서브쿼리에서 리턴된 목록의 모든 값과 비교
4) exists: 서브쿼리에서 적어도 1개의 행을 리턴하면 논리식은 참

* 다중열 서브쿼리
syntax : select *|column1[,column2, ...]
            from table
            where (column1, column2 ...) 
            in
            (select column1, column2, ...
            from table
            where condition);

* SQL*PLUS 명령어
a[ppend] text : 현재 편집라인의 끝에 text를 추가
c[hange]/old/new:현재 편집 라인의 old문자를 new문자로 바꿈
del [n] : n라인을 삭제
i[nput] [text] : 현재 편집 라인 다음에 라인을 추가하여 text를 추가
l[ist] [n] : SQL문장을 보여주고, 편집 라인을 이동
n text : n번재 라인을 text로 바꿈
r[un] : buffer에 있는 명령어를 실행한다.(/와 동일)
edit [filename[.ext]] : 지정된 파일의 내용이나 버퍼의 내용을 운영체제의 
                             문자편집기로 불러온다.
sav[e] [filename[.ext]] [rep[lace] | app[end]]
: SQL버퍼의 내용을 파일에 저장하고 기존 파일에 추가하기 위해서 append를, 
기존 파일에 중복해서 쓰려면 replace를 사용한다. 기본적인 파일 확장자는 sql이다.
sta[rt] [filename[.ext]] : 지정된 파일을 수행한다. start라는 명열 대신에 @를 
                                 사용할 수 있다. 파일 확장자가 .sql이 아니면 파일 확장자를 명시
get [filename[.ext]] : SQL버퍼에 파일의 내용을 기록한다. 파일명의 기본적인 확장자는
                             .lis또는 .lst이다
spo[ol] [filename[.ext]] [off | out] : SQL*PLUS의 내용을 파일에 저장
host : sql*plus안에서 호스트 운영체제의 명령어를 실행한다.
! : 운영체제 shell로 나들이
!vi file_name.sql : file_name.sql을 vi편집기로 부름 (unix)

* set : sql*plus의 환경설정
syntax : set 시스템변수 값
- 앞 숫자는 기본값
array[size] {20|n} : 데이터베이스 데이터 패치의 크기를 설정
colsep { | text} : 열 사이에 출력되는 문자를 설정 (디폴트:공백하나)
feed[back] {6|off|on} : 질의가 최소한 n개이어야 row의 수를 출력
hea[ding] {off|on} : 열의 heading을 출력할지의 여부 결정
lin[esize] {80|n} : 라인당 문자의 수
long {80|n} : long값을 출력하기 위해 최대 폭을 설정
pages[ize] {24|n} : page당 line수를 지정
pau[se] {off|on|text} : 화면제어를 함
term[out] {off|on} : 결과를 화면에 출력할지의 여부를 결정
col[umn] [column_option] : 열 포맷을 제어
  syntax : col[umn] [{column|alias} [option]]
  option : cle[ar] : 어떤 열의 형식을 해제
             for[mat] format : 열 데이터의 디스플레이를 변경
             hea[ding] text : 열 헤딩을 설정, 수직 바(|)는 헤딩 라인을 한줄 띄움
             jus[tify] [align] : 열 heading을 정렬(좌, 우, 중간)
            nopri[nt] : 열을 숨김
            nul[l] text : null일때 디스플레이할 텍스트 명시
            pri[nt] : 열을 보여줌
            tru[ncated] : 디스플레이 되는 첫번째 라인의 마지막 문자열을 절삭
            wra[pped] : 문자열이 끝나면 다음 라인으로 이동
tti[tle] [text|off|on] : 리포트의 머리말을 명시
bti[tle] [text|off|on] : 리포트의 꼬리말을 명시
bre[ak] [on report_element] : 중복값을 제거하고 라인 피드로 행들을 단락지음
                                         -> 해제시 clear break
syntax : break on column[|alias|row] [skip n|dup|page] on ... [on report]
            page : break값이 변경될 대 새로운 page로 skip
            skip n : break값이 변경될 때 n만큼 줄을 skip(column, row, page, report)
            duplicate : 중복되는 값을 출력
compute : SQL*PLUS명령어를 이용하여 요약된 계산을 한다.
            해제시 -> clear compute
syntax : compute function of compute_column on break_column
            function : count, num, max, min, sum, avg, std, var중 하나
           compute_column : 계산에 사용되는 column이나 식
           break_column : break명령으로 기술된 column

* 치환변수
& : 리턴되는 데이터를 동적으로 제한, 변수를 인식

* 사용자 변수 정의
1) define variable = value : char데이터형 사용자 변수를 생성하고 값을 할당
2) define variable : 변수, 변수 값, 변수 데이터형을 출력
3) define : 값과 데이터형을 가진 모든 데이터형을 출력
4) accept : 사용자 입력 라인을 읽고 그것을 변수에 저장
  syntax : accept variable [datatype] [for[mat] format] [prompt text] [hide]
              variable : 값을 저장하는 변수의 이름
                            존재하지 않으면 SQL*PLUS가 그것을 생성하여 사용
              datatype : number, char 또는 date, char는 최대 길이 240바이트
                             date는 형식 모델을 다시 검사하고 데이터형은 char
              format : 형식 모델을 명시(예:a10, 9,999)
              text : 사용자가 값을 입력하기 전에 값을 출력
              hide : 사용자 입력을 숨긴다.(예:패스워드)

* 오라클 객체
1) table : 행과 열로 구성된 기본적인 저장 구조
2) view : 하나 이상의 테이블에서 데이터의 부분집합을 논리적으로 표현
3) sequence : 고유한 번호를 자동으로 발생시키는 객체로 주로 PK값 생성에 사용
4) index : 질의(select) 성능을 향상시키기 위하여 사용하는 물리적인 저장 구조
5) synonym : 객체에 대한 이름을 부여

* 테이블 생성
syntax : create table [schema.]table_name
                     (column datatype [default expr] [column_constraint],
                     ...
                     [table_constraint]);

* 오라클 data type
varchar2(n) : 가변길이 문자 데이터 (1~4000byte)
char(n) : 고정 길이 문자 데이터 (1~2000byte)
number(p, s) : 전체 p자리 중 소수점 이하 s자리 (p:1~38, s:-84~127)
date : 7byte(bc4712년 1월1일부터 ad9999년 12월 31일)
long :가변길이 문자 데이터 (1~2Gbyte)
clob : 단일 바이트 가변 길이 문자 데이터 (1~4Gbyte)
raw(n) : n byte의 원시 이진 데이터 (1~2000)
long raw : 가변 길이 원시 이진 데이터 (1~2Gbyte)
blob : 가변 길이 이진 데이터 (1~4Gbyte)
bfile : 가변 길이 외부 파일에 저장된 이진 데이터 (1~4Gbyte)

* constraints (제약)
- primary key(pk) : 유일하게 테이블의 각행을 식별 (not null과 unique 동시 만족)
- foreign key(fk) : 열과 참조된 열 사이의 외래키 관계를 적용하고 설정합니다.
- unique key(uk) : 테이블의 모든 행을 유일하게 하는 값을 가진 열 (null을 허용)
- not null(nn) : 열은 null값을 포함할 수 없습니다.
- check(ck) : 참이어야 하는 조건을 지정함(대부분 업무 규칙을 설정)
1) column level
syntax : column datatype [constraint constraint_name] constraint_type
2) table level
syntax : column datatype,
            ...
            [constraint constraint_name] unique(column1[,column2...])

* subquery를 사용한 테이블 생성
syntax : create table table_name [column1[,column2...]] as subquery

* 테이블 수정 (add 열추가, modify 열수정, drop 열삭제)
syntax : alter table table_name
            add (column datatype [default expr]
            [,column datatype [default expr]...]

* 제약조건 수정 (add 제약추가, drop 제약삭제) : 제약변경은 못함
syntax : alter table table_name
            add [constraint constraint_name] constraint_type (column);
- add자리에 disable, enable로 제약조건활성화 결정할 수 있다.

* 객체 이름 변경
syntax : rename old_name to new_name

* truncate table (테이블 비움:롤백불가)
syntax : truncate table table_name

* 테이블에 주석문 추가
syntax : comment on table table_name | column table.column is ''''text'''';

* 테이블 삭제
syntax : drop table table_name

* DML
insert : 테이블에 새로운 행 추가
syntax : insert into table_name [(column1[, column2, ...])]
            values (value1[, value2 ...]);
update : 테이블의 행 내용을 변경
syntax : update table_name
            set column1 = value1 [,column2 = value2, ...]
            [where condition];
delete : 테이블의 행 삭제
syntax : delete [from] table_name
            [where condition];
merge : 행이 존재하면 update, 새로운 행이면 insert
         merge into table_name as table_alias
         using (table/view/sub_query) as alias
         on (join condition)
         when matched then
                  update set
                  col1 = col1_val1, col2 = col2.val2
         when not matched then
                  insert (column_list) values (column_values);
commit : 저장되지 않은 모든 변경 사항을 Database에 저장
syntax : commit;
savepoint : savepoint 설정
syntax : savepoint name;
rollback : 저장되지 않은 모든 변경 사항을 취소
syntax : rollback [to savepoint name]

* sequence (nextval, currval 사용)
syntax : create sequence sequence_name
                      [increment by n]
                      [start witn n]
                      [{maxvalue n | nomaxvalue}]
                      [{minvalue n | nominvalue}]
                      [{cycle | nocycle}]
                      [{cache | nocache}]
- sequence_name : sequence의 이름입니다.
- increment by n : 정수 값인n으로 sequence번호 사시의 간격을 지정.
                          이 절이 생략되면 sequence는 1씩 증가.
- start with n : 생성하기 위해 첫번째 sequence를 지정.
                     이 절이 생략되면 sequence는 1로 시작.
- maxvalue n : sequence를 생성할 수 있는 최대 값을 지정.
- nomaxvalue : 오름차순용 10^27 최대값과 내림차순용 -1의 최소값을 지정.
- minvalue n : 최소 sequence를 지정.
- nominvalue : 오름차순용 1과 내림차순용 -(10^26)의 최소값을 지정
- cycle | nocycle : 최대 도는 최소갑에 도달한 후에 계속 값을 생성할지의
                           여부를 지정, nocycle이 디폴트.
- cache | nocache : 얼마나 많은 값이 메모리에 오라클 서버가 미리 할당하고
                              유지하는가를 지정. 디폴트로 오라클 서버는 20을 cache

* sequence 수정
syntax : alter sequence sequence_name
            ... (생성과 같다)

* sequence 제거
syntax : drop sequence sequence_name

* view 생성 (simple view)
syntax : create [or replace] [force|noforce] view view_name [(alias[,alias, ...])]
            as subquery
            [with check option [constraint constraint_name]]
            [with read only]
- or replace : 이미 존재한다면 다시 생성한다.
- force : base table유무에 관계없이 view를 만든다.
- noforce : 기본 테이블이 존재할 경우에만 view를 생성한다.
- view_name : view의 이름
- alias : subquery를 통해 선택된 값에 대한 컬럼명이 된다.
- subquery : select 문장을 기술한다.
- with check option : view에 의해 엑세스 될 수 있는 행만이 입력, 갱신될 수 있다.
- constraint : check option 제약 조건에 대해 지정된 이름이다.
- with read only : 이 view에서 DML이 수행될 수 없도록 한다.

* view 생성 (complex view)
syntax : create [or replace] [force|noforce] view view_name [(alias[,alias, ...])]
            as subquery 
            [with check option [constraint constraint_name]]
            [with read only]             
- complex view에서는 둘이상의 테이블이 조인되어 view에 나타난다.

* view 제거
syntax : drop view view_name;

* inline view : from절에 subquery를 사용

* top-n analysis
syntax : select [column_list], rownum
            from (select [column_list] from table order by top-n_column)
            where rownum <= n;

* index 종류
- unique index : 지정된 열의 값이 고유함을 보장
- non-unique index : 데이터를 검색할 때 가장 빠른 결과를 보장
- single column index : 하나의 열만 인덱스에 존재
- composite index : 여러 열을 결합하여 하나의 인덱스를 생성(16개의 열까지)

* index 생성 (사용자정의)
syntax : create index index_name
            on table_name (column1[,column2, ...]);

* index 제거
syntax : drop index index_name;

* synonym 생성
syntax : create [public] synonym synonym_name 
            for object_name;

* synonym 제거
syntax : drop [public] synonym synonym_name;

* user 생성
syntax : create user user_name
            idntified by password;

* 권한부여
syntax : grant system_privilege1[,system_privilege2, ...]
            to user_name1[,user_name2, ...]
            [with admin option]
- with admin option을 주면 부여받은 권한을 다시 부여할 수 있다.

* 권한제거
syntax : revoke system_privilege1[,system_privilege2, ...] | role1[,role2, ...]
            from {user1[,user2, ...] | role1[,role2 ...] | public};

* Role 생성 : Role은 권한(privilege의 모임)
syntax : create role role_name;

* Role 부여
syntax : grant role_name to user_name; 


블로그 이미지

낭만가을

,