PC에 두고 온 문서, 돌아갈 수도 없고… 해결책은? 윈도우

혼자 사는 권 주임, 주말 내내 집에서 업무보고서를 작성했다. 그런데 다음날 출근해 부장에게 문서를 제출하려고 하니… 아뿔싸, 문서를 PC에서 옮겨오지 않았다. 부장에게 보고해야 할 시간은 바로 코앞이라 집에 갈 틈이 없다. 이 불쌍한 권 모 주임을 도울 수 있는 방법은 없을까? 있다. 바로 ‘원격 제어’다.

 

원격 제어란 사용자의 스마트폰 및 태블릿PC로 멀리 떨어진 PC를 마음대로 조작하도록 도와주는 기술이다(원격 제어). 이를 통해 메일을 보내거나, 문서를 작성하는 등 PC로 할 수 있는 작업 대다수를 스마트폰 및 태블릿PC로 할 수 있다. 이를 응용하면 사용자가 집, 길거리, 지하철 어디에 있건 간에 회사 PC에 접속해 각종 업무를 수행한다는 ‘스마트워크’를 할 수 있게 된다.

 

원격 제어, 쉽고 간단하게 쓸 수 있다
 

원격 제어를 구축하려면 과거에는 FTP 서버를 설정해야 하는 등 복잡한 과정을 필요로 했지만, 이제는 애플리케이션(이하 앱)과 프로그램을 하나씩만 설치하면 될 정도로 간단해졌다. 원격 제어를 쓰려면 전용 앱이 필요한데, 여기서는 대표적인 원격 제어용 앱 ‘팀뷰어’를 기준으로 설명하도록 한다(다른 원격 제어 앱의 사용법도 팀뷰어와 다를 바 없다).

 

애플 앱스토어, 구글 플레이스토어에 접속해 ‘팀뷰어’라고 검색하면 ‘원격 제어용 팀뷰어’라는 앱이 나타난다. 이를 사용자의 스마트폰 및 태블릿PC로 내려받자. 그다음 사용자가 원격 제어하고자 하는 PC로 팀뷰어 홈페이지(www.teamviewer.com)에 접속해서, ‘TeamViewer 정식 버전 ? Windows’를 내 받아 설치한다(참고로 맥, 리눅스용도 있다).

 

설치 도중 ‘사전 비밀번호’를 사용자가 직접 설정하라고 팝업창이 뜬다. 이는 추후 스마트폰 및 태블릿PC로 사용자의 PC에 접속할 때 입력해야 하는 비밀번호다. 설치가 끝나면 9자리 숫자로 구성된 ‘귀하의 ID’가 나타난다. 둘 다 잊어버리면 곤란하니 잘 외워두거나 다른 곳에 적어둬야 한다.

 

참고로 귀하의 ID 아래에 있는 ‘원격 제어 허용 비밀번호’는 부팅할 때마다 변하는 1회용 임시 비밀번호다. 타인에게 잠시 사용자의 PC에 접속할 권한을 주고자 할 때 사용하면 된다.

 

 

스마트폰 및 태블릿PC용 팀뷰어 앱에 ID와 비밀번호(사전 비밀번호로 입력하자)를 입력하면, 사용자의 PC로 접속할 수 있다. 이제 스마트폰 및 태블릿PC를 통해 사용자의 PC의 커서를 조작해(권 주임을 구제해줄) 파일을 메일로 전송하거나, 오피스를 실행하고 문서 작업을 할 수 있다.

 

 

참고로 팀뷰어에는 F1~F12 등 PC용 키보드에 있는 특수키 입력 기능, 원격 컴퓨터 재부팅 기능, Ctrl+Alt+Del 입력 기능, 2개 이상의 모니터를 사용할 때 모니터 변경 기능 등 오피스 작업을 보조하기 위한 다양한 기능이 탑재돼 있다. 또한 빠르게 손가락 두 번 입력, 두 손가락으로 마우스 우클릭 등 다양한 멀티 제스처기능도 탑재돼 있다. 또한 특정 PC에서만 할 수 있는 작업을 외부에서 하고자 하는 경우(예를 들자면 회사 내 인트라넷 접속) 등 다양한 상황에 응용할 수 있다.

 

다만 사용자가 비상업적인(일반적인) 용도로 팀뷰어를쓸 때는 무료지만, 회사에서 사용하고자 한다면 제품을 정식으로 구입하고 사용해야 한다. 이스트소프트의 ‘알집’과 같은 형태로, 회사에서 무료버전을 쓰면 저작권에 위배된다. 참고로, 경쟁 제품 ‘크레이지리모트(http://www.scienpix.com)’는 애당초 유료 앱이기에 개인적으로 사용하던 회사 업무에 사용하든 관계없다. 또한 회사의 PC에 접속할 수 없다고 뜨는 경우는 보안상의 문제로 외부접속이 막혀있기 때문이니, 회사의 서버관리자에게 문의하기 바란다.

 

이렇게 사용자의 스마트워크에 큰 도움을 줄 수 있는 기능이 원격 제어다. 다만, 반드시 PC가 켜져 있어야만 쓸 수 있다는 단점이 있다. 그러나 이러한 문제도 원격 PC 부팅기능 WOL(Wake On LAN)을 통해 해결할 수 있다.

 

 

 

원격 제어가 유용함에도 불구하고 사용자들이 애용하지 않는 이유는 PC가 켜져 있어야만 접속할 수 있기 때문이다. 아무리 대기모드가 있다지만, 사용자 대다수가 PC를 사용하지 않을 때는 꺼두는 법. 이러한 문제를 해결해 주는 것이 바로 원격 PC 부팅 기능 ‘WOL(Wake On LAN)’이다.

 

WOL이란 인터넷이 사용자의 PC에 스마트폰 및 태블릿PC로 패킷 신호를 보내, PC와 멀리 떨어진 장소에서도 PC의 전원을 켜는 기술이다. WOL을 쓰려면 WOL을 지원하는 메인보드, 랜카드, 인터넷 공유기가 필요하다. 이 중 인터넷 공유기는 없어도 되지만, 인터넷 통신사에서 주기적으로 IP를 바꾸는 문제 및 접속이 어려워진다는 문제가 있기에 인터넷 공유기까지 구비하고 WOL을 사용하는 것이 좋다. WOL을 쓰려면 CMOS, 랜카드, 인터넷 공유기의 기본 설정 몇 가지를 변경해야 한다.

 

CMOS 설정
 

가장 먼저 CMOS를 설정해야 한다. PC를 켜자마자 키보드의 'F2'와 'Delete' 키를 열심히 누르자. CMOS를 불러내는 키는 메인보드의 종류에 따라 다르긴 하지만 보통 F2 아니면 Delete 키이기 때문이다. 제대로 했다면 윈도가 부팅되지 않고 CMOS 메인화면으로 진입한다.

 

CMOS 설정방법은 제조사마다 약간씩 다르다. 인텔의 메인보드를 사용하고 있다면, Power 메뉴로 이동해 ‘Wake On Lan from S5’를 Power Off에서 Power On으로 바꾸면 된다. 아수스의 메인보드(UEFI)를 사용하고 있다면, ‘Advanced Mode’ > ‘APM’으로 이동해 'Power On By PCI' 및 'Power On By PCIE'를 Enabled로 설정하면 된다.

 

 

조금 예전에 나온 메인보드를 쓰고 있다면, WOL 관련 옵션은 일반적으로 Power 메뉴에 있는 경우가 많다. 이 경우 APM 옵션에 진입해 'Wake Up LAN', 또는 'POWER ON By PCI'를 Enabled로 설정하면 된다. 보다 자세한 정보는 메인보드 제조사에 문의하도록 하자.

 

 

랜카드 설정
 

그 다음은 랜카드를 설정할 차례다. 먼저 랜카드를 최신 드라이버로 업데이트 하자. 구 버전 드라이버에서는 WOL 메뉴를 쓸 수 없는 경우가 많기 때문이다. 그 다음 내 컴퓨터를 마우스로 우클릭해서 속성 > 장치관리자 > 네트워크 어댑터 > 랜카드를 선택하면 ‘랜카드 속성’이 뜬다.

 

인텔의 랜카드를 사용하고 있다면 랜카드 속성에서 ‘전원 관리’ 탭으로 이동해 Wake On LAN 항목을 모두 활성화한다.

리얼텍의 랜카드를 사용하고 있다면 랜카드 속성에서 ‘고급’ 탭으로 이동해 총 4가지 WOL 설정(Wake On Magic Packet, Wake On pattern match, WOL 및 종료 링크 속도, 웨이크 온 랜 종료)을 ‘사용’으로 맞춘 다음, ‘전원 관리’ 탭으로 이동해 해당 항목에 있는 세가지 메뉴를 모두 선택 해제해주면 된다(이 메뉴를 활성화해둘 경우, PC를 끄고 시간이 좀 지나면 랜카드에 공급되는 전원이 차단돼 WOL을 쓸 수 없다).

 

마벨의 랜카드를 사용하고 있다면 고급 탭에 4가지 WOL 설정 대신 ‘시스템 켜기 기능’이 있다. 이외에는 리얼텍의 랜카드와 동일하다.

 

 

 

 

인터넷 공유기 설정
 

마지막으로 인터넷 공유기를 설정해줄 차례다. 여기서는 국내에서 가장 많이 애용되는 제품인 IPTIME의 제품을 기준으로 설명하지만, 타회사의 제품도 설정에 진입하는 방법 외에는 유사하다. 먼저 인터넷 창을 열고 192.168.0.1을 입력하고 관리도구 > 고급 설정 > 특수 기능 > WOL 기능으로 이동하자. 그 다음 ‘MAC 주소 찾기’를 클릭한 후, ‘추가’를 눌러 사용자의 PC를 WOL 사용 대기상태로 만들어야 한다.

 

그 다음 보안 기능으로 이동해 ‘공유기 접속 관리’로 이동한다. 여기서 ‘원격 관리 포트 사용’을 선택하고 4자리수의 숫자로 구성된 ‘원격 관리 포트 번호’를 사용자 임의로 입력해야 한다(2,000번대 이상을 추천). 마지막으로 시스템 요약 정보로 이동해 외부 IP 주소를 확인하고 이를 원격 관리 포트 번호와 함께 별도로 적어두거나 외워두자. 이로서 외부에서 WOL을 사용하기 위한 모든 설정이 끝난다.

 

 

설정이 끝났다면 이제 직접 사용해볼 차례다. 스마트폰 및 태블릿PC의 인터넷 브라우저를 열고 주소창에 방금 적어둔 외부IP주소를 입력하고 콜론을 입력한 후 원격 관리 포트 번호 4자리 숫자를 입력하면 된다(예시 ‘210.117.103.121:0123’, 중간에 콜론을 입력해야 하는 것을 주의). 이렇게 입력을 마치면 외부에서 공유기 설정에 접속할 수 있다. 이제 관리 도구 > 고급 설정 > WOL 기능으로 이동해 사용자의 PC를 선택하고 ‘PC 켜기’를 누르자. 이제 언제 어디서든지 PC를 원격으로 부팅할 수 있다.

 

 

주의, 멀티탭 전원 내리지 마세요
 

멀티탭의 전원을 차단해 PC로 전력공급을 완전히 끊은 경우, 랜카드가 활성화되지 않아 WOL기능을 사용할 수 없으니 주의해야 한다. 이 경우 PC를 한번 켜주면 랜카드가 활성화 되며, 문제가 해결된다. 노파심에서 하는 말이지만, 멀티탭의 전원을 내려놓고 “왜 원격으로 PC가 안 켜지지?”하는 일은 없어야 하겠다.

글 / IT동아 강일용(zero@itdonga.com)


간단한 DB 로그인 소스 Java Script

제가 약간의 설명을 더 붙였구엽...

소스를 보구 데이터베이스 테이블도 간단하게 만들었습니다.

이 소스를 응용하시면 됩니다.

소스는 허락을 받고 공개하는 것입니다.

소스 공개 허락을 해주신 유재훈님에게 감사드립니다.

 

그리고 MYSQL 디렉토리에 dbBean.java는 맞게 수정하신후에...

각 JSP엔진의 Bean디렉토리에 MYSQL 디렉토리 통째로 복사하신고..

컴파일하세엽..

 

데이터베이스 테이블은 이렇습니다. < 압축화일 속에 DB.sql을 포함하였습니다. >


#
# Table structure for table 'Member'
#

CREATE TABLE Member (
 UserID varchar(10) NOT NULL,
 Password varchar(20) NOT NULL,
 Name varchar(20) NOT NULL,
 PRIMARY KEY (UserID),
 UNIQUE id (UserID)
);

#
# Dumping data for table 'Member'
#

INSERT INTO Member VALUES( 'vans', '0000', '이동호');

 

위에 대로 테이블을 만드시면되구엽...

 

DbBean.java 에서

--------------------------------------------------------
String dbDriver = "org.gjt.mm.mysql.Driver";
String dbURL="jdbc:mysql://203.237.66.11:3306/vans";
String user="nbvg";Login.zip
String passwd="781003";
---------------------------------------------------------

이부분은 자신의 데이터베이스에 맞게 수정하시면 됩니다.


다른 데이터베이스도 잘돌아 갈것입니다.

SQL문이 Ansi SQL을 쓰신것 같더군여..


우리집에서 세균이 가장 많이 사는10곳 생활의 지식

세균(bacteria)! 사람에게 도움이 되기도 하지만 무서운 질병을 일으키기도 하고, 오염되고 지저분함을 상징하기 때문에 불편한 이름이다.
세균은 짜디짠 바닷물에도, 뜨겁디 뜨거운 온천 물에도 살 수 있을 정도로 생명력과 번식력이 강해 우리가 살고 있는 집을 포함한 거의 대부분의 영역에 존재한다.
그런데 집에 있는 세균은 장소와 종류에 따라 사람에게 질병을 일으킬 수 있기 때문에 특별히 관리가 필요하다.
그렇다면 집에서 가장 세균이 많은 곳은 어디일까?
여기 집에서 가장 세균이 많은 곳 TOP10 리스트가 있다.(번호는 순위가 아님)

1. 행주(수세미)
위생협회(Hygiene Council)에서 2007년 진행한 가정 내 세균조사 결과에 따르면 가정에서 사용하고 있는 행주 2.5㎠에는 134,000마리의 세균이 살고 있는 것으로 나타났다.

아리조나 대학교 켈리 브라이트 박사는 행주에 세균이 많이 살고 있는 이유에 대해 “음식물의 잔류 가능성이 크고, 축축하며, 오래 쓰기 때문”이라고 설명했다.

박사는 특히 “생고기를 자른 칼이나 도마를 닦은 행주로 다른 식기류를 닦을 때 살모넬라 또는 캄필로박터 등 설사, 복통 등을 일으키는 세균에 감염될 위험이 있다”며 행주로 인한 교차감염을 우려했다.

대책: 행주는 가능하면 1주일에 한 번씩 교환하도록 하고, 어렵다면 최소 주 1회 표백살균제에 15분 이상 소독을 해야 한다.

2. 싱크대(개수대)
위생협회 조사에 따르면 비어있건, 식기로 가득 차 있건 싱크대 배수구에는 2.5㎠당 50만 마리의 세균이 살고 있다고 한다.

대책: 사람들은 싱크대를 세척제로 씻으면 깨끗할 것으로 생각하지만 세척제는 세균을 죽일 수 있는 능력이 없다. 가정용 살균제나 표백제를 싱크대 표면에 잘 바르고 10분 뒤 씻어내면 깨끗한 싱크대를 유지할 수 있다.

3. 수도꼭지
싱크대, 욕실 둘 다 포함된다.
위생협회 조사에 따르면 싱크대 수도꼭지에는 2.5㎠당 13,000마리의 세균이 있고, 욕실 수도꼭지에는 2.5㎠당 6,000마리의 세균이 있다고 한다.

대책: 싱크대 수도꼭지는 매일, 욕실 수도꼭지는 주 1회 이상 가정용 살균제를 뿌려줘야 한다.

4. 서제(가정 내 업무공간)
아리조나 대학교 세균학자인 찰스 거바 박사는 가정 내 업무공간이 회사에 비해 세균이 더 많다고 한다.
박사는 특히 항생제 내성을 가지고 있는 슈터박테리아(MRSA)의 경우 가정에서만 발견되었다고 한다.

박사의 연구결과에 따르면 가정 내 업무공간에서 60개의 샘플, 회사 사무실에서 91개의 샘플을 수거해 검사한 결과 가정 내 샘플에서는 15개의 MRSA가 발견된 반면 회사 사무실 샘플에서는 MRSA를 하나도 발견하지 못했다고 한다.
가정 내에서 주로 세균이 많이 발견된 곳은 키보드, 마우스, 전화기, 컴퓨터 등이다.

해결: 음식을 아무 곳에서나 먹지 말 것, 최소한 주 1회는 살균제를 이용 책상, 집기 등을 닦아 줄 것.

5. 변기통
위생협회 조사에 따르면 변기통에는 2.5㎠당 무려 3백2십만 마리의 세균이 살고 있었다.

이는 세균이 많기로 유명한 도마의 200배에 달하는 수치이다.

해결: 변기통의 세균은 얇은 유막을 형성해 변기통 전체에 퍼져있다. 염소 표백제를 이용해 유막을 제거하고 소독해야 한다.

6. 욕조
우아한 거품목욕을 즐기며 세균과 함께하고 있다는 사실을 생각해 본적이 있을지 모르겠다.

위생협회 조사에 따르면 욕조에는 2.5㎠당 12만 마리의 세균이 있다고 한다.

해결: 가정용 살균제, 표백제 등으로 박박 닦아 줘야 한다.

7. 샤워커튼
콜로라도 대학 노만 페이스 박사는 “샤워커튼의 얼룩과 비누찌꺼기를 모아 검사해 보면 아마 십중팔구 스핀고모나스(Sphingomonas)와 메틸로박테리움(Methylobacterium)이 득실거릴 것”이라고 한다.

해결: 잘 씻고, 잘 말리고, 잘 교환해 써야 한다.

8. 세탁기
최근 살균세탁기도 나왔지만 세탁기를 통해 세균이 오염되는 경우가 많다.
아리조나 대학이 실험한 결과 A형 간염 바이러스가 묻어있는 옷을 다른 옷과 함께 세탁기에 넣어 빨았더니, 다른 옷에도 바이러스가 묻어 나온 것으로 나타났다.

해결: 표백제로 살균하고 사용하지 않을 때는 마른 상태를 유지시켜야 한다. 건조 기능이 있으면 사용하는 것이 좋고, 가능하면 뜨거운 물로 사용하는 것이 오염을 막는데도 도움이 된다.
또한 아이가 있을 경우에는 감염을 막기 위해 아이와 어른의 옷을 분리해 세탁하는 것도 좋다.

9. 진공청소기
청소하기 위해 사용하는 진공청소기가 오염의 주범이 될 수도 있다.
거바 박사는 30개의 진공청소기를 검사한 결과 50%의 청소기에서 대장균이 검출되었다고 한다.
박사는 청소기에는 세균이 먹고 살 영양소가 많고 이동하기도 쉽다고 한다.

해결: 청소를 할 때 더러운 곳을 먼저 하기 쉬운데 청소기를 이용해 청소할 때는 깨끗한 곳을 먼저 하고 더러운 곳을 나중에 해야 한다.

청소기 사용 후 손도 반드시 씻어야 한다.
과자부스러기 등 음식물은 되도록 빨아들이지 말고, 청소기 필터를 자주 교환해 주는 것도 중요하다.

10. 침대
매트리스와 배게는 집 먼지 진드기의 영양분을 제공해 준다. 정액과 땀 역시 미생물의 좋은 식량이 된다.

따라서 매트리스 내부에는 많은 미생물의 보금자리가 된다.
이는 알레르기성 비염이나 진드기에 의한 알레르기를 유발할 위험이 있다.

해결: 매트리스 커버를 미생물이 통과할 수 없는 것으로 교환하고, 이불, 배게, 시트 등은 정기적으로 뜨거운 물로 세탁한다.


연령/부위별 정상 체온 생활의 지식

*연령별 정상 체온
연령
체온
0 ~ 2세       36.4 ~ 38 ℃
3 ~ 10세       36.1 ~ 37.8 ℃   
11 ~ 65세       35.9 ~ 37.6 ℃
65세 이상       35.8 ~ 37.5 ℃   

*부위별 정상체온
인체부위체온
       35.5 ~ 37.5 ℃
항문       36.6 ~ 38 ℃   
겨드랑이       34.7 ~ 37.3 ℃
       35.8 ~ 38 ℃   


오라클-MView( Materialized View) ORACLE

[오라클 OCP9i] Materialized View란?

 

  Materialized View란 ?

Materialized View(이하 MView로 표시) 이것은 제목 그대로 View 입니다.
 
하지만 일반 View는 논리적인 테이블이고, MView는 물리적으로 존재하는 테이블 입니다.
물리적으로 존재한다는 것은 Data가 일정 공간을 차지하고 있다는 거죠.. 
 
MView는 어떤 결과를 뽑아 내는 쿼리가 너무나도 빈번히 사용 될 경우, Query 실행 시간의 수행속도
향상을위하여 , 여러 가지의 Aggregate View를 두어, 미리 비용이 많이 드는 조인이나,
Aggregate Operation 을 처리하여야 하는 SQL을 위해, 데이터베이스의 한 테이블로 저장 하며,
그 테이블을 조회 하도록 하는 것 입니다.


간단하게 설명하면 대용량의 데이터를 SUM, MIN, MAX, AVG, COUNT(*)이런 명령어를 사용해
너무나도 자주 조회하는 Query를 수행속도를 향상을 위해서,  Query의 결과 만큼의 새로운 테이블을
생성해 놓는 벙법 입니다.

자주사용되는 View의 결과를 디스크에 저장해서 Query 속도를 향상시키는 개념 이죠.


Materialized View의 특징

 - MView를 만들어두면 QUERY의 수행속도를 증가 시킬 수 있습니다.

 - SQL 응용프로그램에서 MView 사용시 DBA는 프로그램에 영향을 끼치지 않고 언제든지 생성 및
    제거가 가능 합니다.

 - MView는 실행의 결과 행과 뷰 정의 모두 저장이 되고, 실행 결과 행으로 만들어진 테이블은 일정
   공간을 차지 합니다.

 - MView관련 기초 테이블을 변경하면, MView로 생성된 Summary 테이블도 변경 되어 집니다.


Materialized View와 일반 View의 차이점

 - 가장 큰 차이점은 MView의 결과값은 물리적으로 존재하는 것이고,
   일반 View의 결과값은 물리적으로 존재하지 않습니다.

   즉 SELECT * FROM USER_SEGMENTS 하면 MView는 나오지만 일반 View는 나오지 않습니다.

 - MView는 MView를 생성할때의 Query로 물리적으로 이미 데이타가 생성되어 있기 때문에
   조회 속도가 빠릅니다.   
   하지만 View는 단지 쿼리정보가 딕셔너리에 저장되어 있고 사용될때 그 SQL이 다시 실행되는
   것이기 때문에 MView보다 느립니다
.

   MView로 생성된 결과값이 일반 View로 조회하는 Data의 결과값 보다 훨씬 적은 Row를 조회하게 되죠.


 MView 관련 파라미터

   - OPTIMIZER_MODE
     MView를 사용하기 위해서는 Cost-Based 옵티마이져 여야 하므로 ALL_ROWS, CHOOSE,
     혹은 FIRST_ROWS 중의 어느 하나를 사용 합니다.
    "CHOOSE"인 상태에서는 모든 테이블을 ANALYZE 시켜 줘야 합니다.

   - QUERY_REWRITE_ENABLED :  Query Rewrite 사용을 위해서는 TRUE로 설정하면 됩니다.

   - QUERY_REWRITE_INTEGRITY : 오라클이 Query Rewrite의 정확성을 제어하는 파라미터로,
     "STALE_TOLERATED", "TRUSTED", "ENFORCED" 로 지정할 수 있습니다.

      STALE_TOLERATED : 사용되어진 기초테이블과 Consistent 하지 않은 View를 이용한
                                      Query Rewrite를 허용 합니다

     TRUSTED : Optimizer에서 MView의 데이터가 정확하다고 간주하고 질의 수행.
                      Integrity 확인을 하지 않습니다.

     ENFORCED: QUERY_REWRITE_INTEGRITY 의 기본값으로, 사용자가 Integrity Constraint를
                       확인하여야 합니다.

   - COMPATIBLE :  사용할 수 있는 오라클 함수들의 Compatibility를 결정하는 값으로 8.1.0 또는
      그 이상으로 설정 해야 합니다.


<<참고문헌>>
 - Oracle Technical Note Materialized View  글 / 박경희
 - Oracle Technical Bulletins  No.12181 MATERIALIZED VIEW 활용방법
 - Oracle 8i Tuning 정식 교재


▷ MView의 생성

 

Materialized View를 생성하기 위해서는 Query Rewrite권한과  CREATE MATERIALIZED VIEW 권한을 MView를 생성하는 유저에게 부여해야 한다. 부여하는 놈은 당연 SYSDBA 유저인 SYS이다.

 

SQL> GRANT QUERY REWRITE TO 유저명;
SQL> GRANT CREATE MATERIALIZED VIEW TO 유저명;

--MView를 생성할 유저를 SCOTT 라고 가정을 한다

 

SQL> conn scott/tiger

SQL> CREATE MATERIALIZED VIEW max_sal_per_dept
         BUILD IMMEDIATE
         REFRESH
         COMPLETE
         ON DEMAND
        ENABLE QUERY REWRITE
        AS
        SELECT MAX(a.sal), a.deptno
        FROM emp a, dept b
       WHERE a.deptno = b.deptno
       GROUP BY a.deptno;

-- 부서별 최고 SALARY를 조회하는 MView를 생성

 

SQL> SELECT * FROM max_sal_per_dept;

-- MView를 쓰는 방법
MAX(A.SAL)     DEPTNO
---------- ----------
      2850         30
      3000         20
      5000         10

 

 

-- 생성시 OPTION 정리

 

 - BUILD IMMEDIATE : MView 생성과 동시에 데이터들도 생성되는 옵션

 - BUILD DEFERRED : MView를 생성은 하지만, 그 안의 데이터는 추후에 생성하도록 하는 옵션
 - REFRESH :  MView의 데이터를 새로고치는 시기와 방법를 결정 
  

    ☞   시기

    1. ON COMMIT - 기초 테이블에 Commit 이 일어날 때 Refresh 가 일어나는 방안이며,
    이는 1 개의 테이블에 COUNT(*), SUM(*)과 같은 집합 함수를 사용하거나, MView에 조인만이
    있는 경우,  Group By 절에 사용된 컬럼에 대해 COUNT(col) 함수가 기술된 경우만  사용이 가능
 
    2. ON DEMAND - 사용자가 DBMS_MVIEW 패키지 (REFRESH, REFRESH_ALL_MVIEWS,
    REFRESH_DEPENDENT) 를 실행 한 경우 Refresh 되는 경우

 
    ☞   방법
   1. COMPLETE - MView의 정의에 따라 MView의 데이터 전체가 Refresh 되는 것으로
                                ATOMIC_REFRESH=TRUE와 COMPLETE으로 설정한 경우

   2. FAST - 새로운 데이터가 삽입될 때마다 점진적으로 Refresh 되는 방안

   3. FORCE - 이 경우 먼저 Fast Refresh가 가능한지 점검 후 가능하면 이를 적용하고, 
                         아니면 Complete Refresh를 적용(디폴트)

   4. NEVER - Refresh를 쓰지 않는다
 
 
 - ENABLE QUERY REWRITE - MView 생성시 이 옵션을 주어야만 임의의 SQL문장을을 처리시 
   Query Rewrite를 고려한다. 이는 쿼리 재작성의 기능이다. 이전의 쿼리를 수정 않하고 재작성이 가능   

   한 기능

 

 

 

Query Rewrite

 

쿼리 재작성 또는 덮어쓰기 정도로 보면 된다. 이미 생성 된 뷰의 쿼리를 재작성하는 기능이다

쓰는 방법을 간단히 소개한다

 

1. SYSDBA로 로그인

 

SQL>ALTER SYSTEM SET QUERY_REWRITE_ENABLED='TRUE';

2. MView를 테스트하는 유저로

 

SQL> SET AUTOTRACE ON    //실행계획을 얻는 것이다 이것을 쓸려면 스크립트를 돌려야 하는데 그 방법은

                                                 // 다음 페이지에서 설명하겠다.

SQL> ALTER SESSION SET OPTIMIZER_MODE='FIRST_ROWS';

SQL> SELECT MAX(a.sal), a.deptno
         FROM emp a, dept b
        WHERE a.deptno = b.deptno
        GROUP BY a.deptno;

--MView를 생성했을 때의 쿼리를 다시 실행한다

 

 

 


다음처럼 쿼리를 재작성했다는 것을 Execution Plan을 보면 REWRITE 된걸 알 수 있다

[출처] ORACLE의 Materialized View|작성자 난나다

Chapter 16. Materialized View

뷰의 정의와 정의된 쿼리를 실행한 결과가 저장된다.

처음은 느리지만 두번째부터는 속도가 빨라진다.

Materialized View에 저장된 데이터를 생신하는 방법은 다음과 같다
complete 또는 fast
Force 또는 Never


갱신모드
수동
자동(동기 또는 비동기)

SQL> GRANT CREATE MATERIALIZED VIEW TO scott;
권한이 부여되었습니다.

SQL> CREATE MATERIALIZED VIEW dept_sal_num
  2  BUILD IMMEDIATE
  3  REFRESH COMPLETE
  4  ON DEMAND -- 사용자가 갱신 작업을 요청할 때마다 수동으로 on commit로 하면 자동으로
  5  ENABLE QUERY REWRITE --쿼리 재작성 활성화
  6  AS
  7  SELECT d.dname, SUM(e.sal)
  8  FROM dept d, emp e
  9  WHERE d.deptno=e.deptno
10  GROUP BY d.dname;

구체화된 뷰가 생성되었습니다.

SQL> select * from dept_sal_num;

DNAME          SUM(E.SAL)
-------------- ----------
ACCOUNTING           3750
RESEARCH             6775
SALES                9400


-- 수동으로 갱신
SQL> EXECUTE dbms_mview.refresh('DEPT_SAL_NUM');
PL/SQL 처리가 정상적으로 완료되었습니다.


MV를 GROUP BY, MAX,MIN, JOIN이 들어가야 중첩 MV를 만들 수 있다.

--- 중촙 materialized view 만들기
CREATE MATERIALIZED VIEW LOG ON sh.sales
WITH SEQUENCE,
ROWID (cust_id, time_id, prod_id)
INCLUDING NEW VALUES;

CREATE MATERIALIZED VIEW LOG ON sh.customers
WITH SEQUENCE,
ROWID(cust_id)
including new values;

CREATE MATERIALIZED VIEW LOG ON sh.products
WITH SEQUENCE,
ROWID(prod_id, prod_name, prod_list_price)
including new values;

CREATE MATERIALIZED VIEW sales_cust_mv
REFRESH FAST ON DEMAND AS
select c.rowid cid, s.rowid sid,
cust_last_name, time_id, prod_id, amount_sold, quantity_sold
FROM sh.sales s, sh.customers c
WHERE s.cust_id=c.cust_id;

CREATE MATERIALIZED VIEW LOG ON sales_cust_mv
WITH ROWID
INCLUDING NEW VALUES;

CREATE MATERIALIZED VIEW prod_mv
REFRESH FAST ON COMMIT AS
select prod_id, prod_name, min(prod_list_price) price
FROM sh.products
GROUP BY prod_id, prod_name;

CREATE MATERIALIZED VIEW LOG ON prod_mv
WITH SEQUENCE, ROWID
INCLUDING NEW VALUES;

CREATE MATERIALIZED VIEW total_sales
REFRESH FAST AS
SELECT p.rowid pid, s.rowid sid2,
cust_last_name, amount_sold,
quantity_sold, prod_name, price
FROM prod_mv p, sales_cust_mv s;
WHERE p.prod_id = s.prod_id

///////////////
쿼리 재작성 개요

Materialized view에 정의된 데이터를 사용할수 있는 쿼리를 사용자가 실행하면
Materialized view를 사용하여 쿼리를 실행한다.
단, CBO에서만 사용 가능하다.


/////////////////////
쿼릴 재작성
QUERY_REWRITE_ENABLED 파라미터를 설정하면 된다.

dbms_olap패키지의 Summary Advisor
Materialized view를 분석하는 패키지이다.
쿼리의 성능을 향상하기 위해서 해당 쿼리를 분석하여 Materialized view를 생성해야하는지 분석해 준다.


SQL> CREATE MATERIALIZED VIEW dept_sal_sum
  2  BUILD IMMEDIATE
  3  REFRESH COMPLETE
  4  ON DEMAND
  5  ENABLE QUERY REWRITE
  6  AS
  7  SELECT d.dname, sum(e.sal)
  8  FROM dept d, emp e
  9  WHERE d.deptno = e.deptno
10  GROUP BY d.dname;

구체화된 뷰가 생성되었습니다.

SQL> select * from dept_sal_sum;

DNAME          SUM(E.SAL)
-------------- ----------
ACCOUNTING           3750
RESEARCH             6775
SALES                9400

-- plan table가 없다면 실행해야 한다.
SQL> @d:\oracle\ora92\rdbms\admin\utlxplan.sql
테이블이 생성되었습니다.

SQL> grant plustrace to scott;
권한이 부여되었습니다.

-- plustrace가 없다면 아래 파일을 실행해야 한다.
-- D:\oracle\ora92\sqlplus\admin\plustrce.sql

-- 실행계획을 보여줌
SQL> SET AUTOTRACE ON EXPLAIN

-- 이때 MATERIALIZED VIEW를 사용하지 않는다.
SQL> SELECT d.dname, sum(e.sal)
  2  FROM dept d, emp e
  3  WHERE d.deptno = e.deptno
  4  GROUP BY d.dname;

DNAME          SUM(E.SAL)
-------------- ----------
ACCOUNTING           3750
RESEARCH             6775
SALES                9400


Execution Plan
----------------------------------------------------------
   0      SELECT STATEMENT Optimizer=CHOOSE
   1    0   SORT (GROUP BY)
   2    1     NESTED LOOPS
   3    2       TABLE ACCESS (FULL) OF 'EMP'
   4    2       TABLE ACCESS (BY INDEX ROWID) OF 'DEPT'
   5    4         INDEX (UNIQUE SCAN) OF 'PK_DEPT' (UNIQUE)


-- MATERIALIZED VIEW의 쿼리를 재작성 하라는 명령
SQL> ALTER SESSION SET QUERY_REWRITE_ENABLED=TRUE;
세션이 변경되었습니다.

-- 쿼리를 다시 실행한다.
SQL> SELECT d.dname, sum(e.sal)
  2  FROM dept d, emp e
  3  WHERE d.deptno = e.deptno
  4  GROUP BY d.dname;

DNAME          SUM(E.SAL)
-------------- ----------
ACCOUNTING           3750
RESEARCH             6775
SALES                9400


Execution Plan
----------------------------------------------------------
   0      SELECT STATEMENT Optimizer=CHOOSE (Cost=2 Card=3 Bytes=39)
   1    0   TABLE ACCESS (FULL) OF 'DEPT_SAL_NUM' (Cost=2 Card=3 Bytes
          =39)

--이때 MATERIALIZED VIEW를 사용한 것을 확인할 수 있다.

mview는 어떤 것이냐면..예를들어서 엄청나게 큰 emp테이블과 dept테이블이
존재합니다. 그런데 이것을 조인해서 어떤 값을 뽑아 내는 쿼리가 너무나도
자주 사용되고 있습니다. 이 경우에 어떻게 할까요?
일반 view의 경우엔 실제 데이터가 view에 들어가는 것이 아니라는 것을
아실것 입니다. 만약 그렇게 자주 사용하는 emp,dept를 join하는 view를
만든다면, 실제로 이 view를 조회하면 emp,dept 테이블을 조회합니다.
하지만 mview는 다릅니다. mview에는 실제 데이터가 들어가지요.

create materialized view mymview
build immediate
refresh force
enable query rewrite
as
select * from emp, dept where dept.deptno=20 and emp.deptno=dept.deptno;

라고 명령을 내리면 어떻게 될까요?(단 sysdba에서 query rewrite권한을
mview를 만드는 유저에 주어야 합니다.)
위 명령을 하면 select * from emp, dept where dept.deptno=20 and emp.deptno=dept.deptno;
의 쿼리에서 나오는 결과를 myview라는 mview에 저장합니다.
그래서 select * from emp, dept where dept.deptno=20 and emp.deptno=dept.deptno; 이라는
문장을 사용하게 되면 이 때는 emp,dept를 join해서 deptno=20이라는
것을 찾는 것이 아니라 myview이라는 mview에 실제로 데이터가 들어가
있으니 그곳에서 찾는 것이죠.
또한 emp,dept 테이블을 고치면, mview의 데이터까지도 고쳐집니다.
이때는 emp,dept 테이블과 myview를 동기화 해주어야겠죠. 위에서 refresh ~
옵션이 그것을 지정합니다. 자동을 refresh 되도록 했죠.
수동으로 refresh를 하고 싶을 경우엔
execute dbms_mview.refresh(myview,'c'); 명령을 하면 수동으로 refresh가
되겠죠. 또한 가장 중요한 것은 query rewrite가 되어야 합니다.
alter materialized view myview enable query rewrite; 명령을 해야겠죠.
하지만 위에서는 우리는 미리 enable query rewrite로 했으니 할 필요없죠.

mview를 사용할 경우 그 만큼의 데이터를 저장할 곳이 필요하게 되지만
속도는 엄청나게 빠르게 됩니다. 왜냐면 emp,dept테이블을 읽는 것이
아니라 이미 join되고 where절을 거친 mview를 그냥 읽어들이기
때문이지요.

구현하실려면 application user에게 query rewrite권한이 있어야 하고
파라미터 파일에 QUERY_REWRITE_ENABLED=true 이어야 하고,
QUERY_REWRITE_INTEGRITY 값도 적당히 변경해야 합니다.
몇가지 이외에도 mview를 만들 때에 써야하는 조건이 있습니다.
이후에 내가 날린 쿼리가 실제로 mview를 읽는 것인지 확인하는 방법은
application user에서 plan table을 생성하고 set autotrace ~ 명령을
사용해서 쿼리문을 날렸을 경우 쿼리가 어떻게 수행되었는지 정보를
확인하셔야 합니다.
또 한가지 중요한 것이 emp, dept 를 analyze 시키고 나서 create materialized
view 명령을 해야 재대로 생성됩니다.

더 자세한 것은 document를 oracle.com에서 다운로드 받아서
index.html을 열어보고 list of books에서 data warehouse를 보십시오.

제 홈피에 document가 있는데 mview가 있는 data warehouse html 자료는
http://min1004.com/doc/server.920/a96520/toc.htm
에 있습니다..

아.. http://min1004.com 제 홈피에 보시면..
oracel data에 mview 문서가 하나 있습니다. otn에서 구한 문서인데
더 자세히 나와 있습니다.


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

MATERIALIZED VIEW 활용방법

1. MATERIALIZED VIEW

Materialized View(이하 MVIEW)는 DW 환경이나, replication 환경에
유용한 기능으로, inner-join, outer-join, equi-join 등 각종 view를
수동으로 갱신하거나, 주기적으로 자동 갱신을 할 수 있게 해 준다.

원격 데이터베이스의 테이블이 포함된 MVIEW는 양방향 replication을
지원한다. 또한 MVIEW는 사용자에게는 투명하게 cost optimization에
기반을 둔 qurey rewrite 기능을 제공한다. Query rewrite 기능을
제공하기 위해 Oracle 에서는 Dimension이라는 객체를 추가 했는데,
Dimension 객체는 대용량 데이터에 대한 질의를 집계성 데이터에 대한
질의로 자동 변환 해 주는 기능을 제공해 준다.

MVIEW는 질의 실행을 할 때마다 매번 대량의 join이나, aggregation
연산을 수행하지 않고, 미리 계산된 값을 질의하기 때문에 성능 향상을
가져올 수 있으며, optimizer는 MVIEW가 어느때 사용되는 것이
적절할지를 판단할 수 있게 설계되었다.
Query rewrite는 사용자에는 투명하다. 만약 환경이 적절히
셋업 되어 있다면, 대량 대이터에 대한 복잡한 질의 응답 속도를
획기적으로 개선할 수 있게 한다.

2. MVIEW 관련 파라미터

MVIEW와 관련된 파라미터 목록은 다음과 같다.

optimizer_mode
query_rewrite_enabled
query_rewrite_integrity
compatible

1) optimizer_mode
Query Rewrite 기능을 사용하기 위해서는 init.ora 파일의 optimizer
mode값은 "ALL_ROWS" 나 "FIRST_ROWS"로 지정하거나, "CHOOSE"인 상태에
서 모든 테이블을 ANALYZE 시켜 두어야 한다.

2) query_rewrite_enabled
파라미터 query_rewrite_enabled 의 값은 "TRUE"로 지정한다.

3) query_rewrite_integrity
파라미터 query_rewrite_integrity 는 선택적으로 지정할 수 있는
파라미터이지만, "STALE_TOLERATED", "TRUSTED", 또는 "ENFORCED"
으로 지정되어야 한다. 이 파라미터는 query rewrite의 정확성을 제어
하는 파라미터이다.

각각의 의미는 다음과 같다

TRUSTED : optimizer에서 MVIEW의 데이터가 정확하다고
간주하고 질의 수행. Integrity 확인을 하지않음.
ENFORCED: query_rewrite_integrity 의 기본값으로,
사용자가 integrity constraint를 확인하여야
한다. MVIEW는 fresh한 데이터를 포함하여야 한다.
STALE_TOLERATED : Optimizer에서 데이터가 stale 상태이거나
fresh 상태인 경우 모두 MVIEW 사용


3. MVIEW 사용에 필요한 권한

MVIEW를 사용하기 위한 권한은 base 테이블에 대한 사용자의 권한에
달려있다. 두개의 중요한 시스템 권한은 다음과 같다.

grant rewrite
grant global rewrite

1) grant rewrite
MVIEW의 base table이 모두 사용자 자신의 테이블일 경우,
자신이 선언한 MVIWE 사용 가능.

2) grant global rewrite
사용자가 어느 schema에 속한 MVIEW라도 사용 가능.


3) MVIEW 사용에 필요한 권한이 충족된 경우 다음 조건을 만족하여야 한
다.
a. 세션에 query rewrite 기능이 enable 되어 있음.
b. MVIWE 자체가 enable 되어 있음.
c. integrity level이 적절히 셋업 되어 있음.
d. MVIEW에 데이터가 존재함.

Example
--------

다음과 같은 테이블이 있을 때,

Dealer (dealer_num, dealer_name, dealer_city, dealer_state)
Automobile (auto_num, auto_name, auto_year)
Shipping (shipping_num, shipping_day, shipping_month, shipping_time)
Summary (dealer_num, auto_num, shipping_num, auto_value)

MVIEW 생성

Create Materialized View test_mv
as
select d.dealer_num, d.dealer_name, v.auto_value, s.shipping_num,
s.shipping_day, v.dealer_num, v.rowed, s.rowid
from summary v, dealer d, shipping s
where v.shipping_num = s.shipping_num
and v.dealer_num = d.dealer_num



4. Query rewrite에서 MVIEW 사용 여부 판단 알고리즘

1) Full SQL Text Match
질의의 select 문장과 MVIEW를 만들때 사용한 select 문장 비교

2) Partial SQL Text Match

Full SQL Text Match가 실패할 경우 select 문장의 from 절 이하의
내용이 MVIEW를 만들때 사용한 내용과 일치하는지 비교

3) Generla Query Rewrite Method
1, 2 항에서 실패할 경우, optimizer에서 MVIEW 사용 가능 여부를 판단.
필요한 데이터가 MVIWE에서 제공하는 것 보다 적거나, 많거나, 변환 가능
한지를 판단하고, MVIWE 데이터가 충분한지 여부를 joing compatibility,
grouping compatibility, aggregate compatibility 등을 확인하여 판단

5. MVIEW와 Integrity Constraints

MVIEW는 DW 환경에서 유용하게 사용될 수 있는데, 대부분의 DW는
integrity constraint를 사용하지 않는다. 즉 DW는 원천 데이터에서
integrity가 보장되었다고 간주한다.

다른 한편으로 integrity constraint는 query rewrite에 유용하다.
이 모순되는 사항은 NOVALIDATE 와 RELY 옵션을 이용해 조율을 맞추어야 한다.

1) query_rewrite_enabled = enforced
데이터베이스의 constarint는 validate 상태로 두어야 한다.

2) query_rewrite_enabled = stale_tolerated | trusted
데이터베이스의 constraint를 nonvalidate, rely로 지정 해 준다.


6. Query Rewrite와 Hint 사용

Index 관련 Hint를 사용하는 것 처럼, query rewite 관련 Hint를 사용하여
제어할 수 있다.

NOREWRITE :
S-lect /-+NOREWRITE*-...
REWRITE:
S-lect /-+REWRITE(mv1)*-...



7. MVIEW 사용 예제

1) Full SQL Text Match

Select d.dealer_name, shiping_month, a.autonum, sum(v.auto_value) as sum_sales,
count(v.auto_value) as count_values
from summary f, dealer d, shippings, automobile a
where v.shipping_num = s.shipping_num
and v.dealer_num = d.dealer_num
and v.auto_num = a.auto_num
group by d.dealer_name, shipping_month, a.auto_num

위 SQL 문은 다음과 같이 미리 생성된 MVIEW를 이용하도록 rewrite 될 수 있다.

select dealer_name, shipping_month, auto_num, sum_value, count_value
from


2) Partial SQL Text Match

Select d.dealer_name, shiping_month, a.autonum, avg(v.auto_value0 as avg_sales,
count(v.auto_value) as count_values
from summary f, dealer d, shippings, automobile a
where v.shipping_num = s.shipping_num
and v.dealer_num = d.dealer_num
and v.auto_num = a.auto_num
group by d.dealer_name, shipping_month, a.auto_num

위 SQL 문장은 다음과 같이 미리 생성된 MVIEW를 사용할 수 있다.

select dealer_name, shipping_month, auto_num, sum_values/count_values as avg_values
from test_mv

Reference Documents
---------------------


--------------------------------------------------------------
추가자료

(V8I) MATERIALIZED VIEW 생성 시 ORA-12054 ERROR 해결 방법
=========================================================

PURPOSE
-------

Oracle 8i부터 제공되는 기능인 Materialized view를 생성할 때
single table에 대해 ON COMMIT refresh 옵션을 사용하여 생성 시
발생할 수 있는 ORA-12054 에러의 해결방법에 대하여 알아보기로 한다.


Problem Description
-------------------

다음과 같이 Materialized view를 생성하려고 시도할 때 ORA-12054
에러가 발생한다.
현재 테이블 test_v에 다음과 같은 데이타가 저장되어 있다고 가정한다.

SQL> select * from test_v;

KEY BONUS SEQ
----- ---------- ----------
aa 120000 1
aa 120000 2
ab 120500 3
ac 620000 4
aa 120000 8
ab 120500 9
ac 620000 10
....................

현재 사용자가 원하는 형태의 출력 format은 다음과 같다.

..... SU S1 S2 S3 ...
..... -- ---------- ---------- ---------- ....
.... a 720777 241000 1240000 .....
................

이와 같은 결과를 얻기 위해 아래와 같이 Materialized view를 생성하였다.

1 create materialized view mv1
2 build immediate
3 refresh fast on commit
4 as
5 select count(*), substr(key, 1, 1),
6 sum(decode(trim(key), 'aa', bonus, 0)) as s1,
7 sum(decode(trim(key), 'ab', bonus, 0)) as s2,
8 sum(decode(trim(key), 'ac', bonus, 0)) as s3,
9 count(bonus)
10 from test_v
11* group by substr(key,1,1)
SQL> /
from test_v
*
ERROR at line 10:
ORA-12054: cannot set the ON COMMIT refresh attribute for the materialized view

그런데, 이와 같이 ORA-12054 에러가 발생하면서 생성이 되지 않는다.


Workaround
----------
none


Solution Description
--------------------

이 문제에 대한 해결책을 알아보기로 한다.

GROUP BY 절에 의해서 grouping 대상이 되는 컬럼(예:key)에 대하여
COUNT() 함수가 반드시 기술되어야 한다.
이는 single table에 대하여 ON COMMIT refresh 특성을 갖는
materialized view를 생성 시에 반드시 고려해야 할 제약사항 중 하나이다.

For M.V.'s with Single-Table Aggregates, there are some conditions
on refresh that need to be satisfied -

Single Table Aggregates:
=======================

a) They can only have a single table.
b) The SELECT list must contain all GROUP BY columns.
c) E-pressions are allowed in the GROUP BY and SELECT
clauses provided they are the same.
d) They cannot have a WHERE clause.
e) They cannot have a MIN or MAX function.
f) A materialized view log must exist on the table and must
contain all columns referenced in the materialized view.
The log must have been created with the INCLUDING NEW VALUES clause.
g) If AVG(expr) or SUM(expr) is specified, you must have COUNT(expr).
h) If VARIANCE(expr) or STDDEV(expr) is specified,
you must have COUNT(expr) and SUM(expr).

위의 materialized view 생성 문장이 실패한 이유는 위의 제약 조건 중
g)번을 위배했기 때문이다.
즉, SUM(expr)에 대한 각각의 COUNT(expr) statement가 빠져 있기 때문이다.
각 SUM(expr)에 대하여 다음과 같이 모든 COUNT 함수가 추가되어야 한다.

"COUNT(DECODE(TRIM(key), 'aa ', bonus, 0)) AS c1"

위와 같은 제약 조건에 따라서 사용자의 materialized view 생성 문장은
다음과 같이 수정되어야 한다.

SQL> create materialized view mv1
build immediate
refresh fast on commit
as
select count(*), substr(key,1,1),
sum(decode(trim(key),'aa',bonus,0)) as s1,
count(decode(trim(key),'aa',bonus,0)) as c1,
sum(decode(trim(key),'ab',bonus,0)) as s2,
count(decode(trim(key),'ab',bonus,0))as c2,
sum(decode(trim(key),'ac',bonus,0)) as s3,
count(decode(trim(key),'ac',bonus,0)) as c3
from test_v
group by substr(key,1,1)

Materialized view created


Reference Documents
-------------------

국가별 전압 및 플러그 생활의 지식

아시아/중동 (Asia)

국가명
Hz
전압
플러그 타입
일본
50/60
100
A, B
방글라데시
50
110/220
A, I, G
홍콩
50
200
D, G
마카오
50
220
D, G
대만
50
110
A, B
태국
50
220
A, C
필리핀

60

220
A, B, C
베트남
50
127/220
A, C, G
싱가폴
50
230
G
인도네시아
50
127/230
C, F, G
말레이시아
50
240
G
브루나이
50
240
G
인도
50
230
C, D
네팔
50
230
C, D
몰디브
50
230
A, D, G, J, K, L
캄보디아
50
230
A, C
미얀마
50
230
C, D, F, G
스리랑카
50
230
D
요르단
50
220
D, G, G, J
이란
50
220
C
사우디 아라비아
50
127/220
A, B, F, G
터키
50
230
C, F
파키스탄
50
230
C, D
레바논
50
230
A, B, C, D, G
리비아
50
127
D
카타르
50
240
D, G
이스라엘
50
230
C, H
쿠웨이트
50
240
C, G



유럽 (Europe)
국가명
Hz
전압
플러그 타입
영국
50
240
G
프랑스
50
127/200
E
독일
50
230
C, F
이탈리아
50
127/220
F, L
네덜란드
50
220

C, F

벨기에
50
220
E
덴마크

50

230
C, K
핀란드
50
220/230
C, F
노르웨이
50
220
C, F
스웨덴
50
230
C, F
스위스
50
220
J
오스트리아
50
220
C, F
그리스
50
220
C, D, E, F
스페인
50
230
C, F
포르투갈
50
220
C, F
룩셈부르크
50
220
C, F
아이슬란드
50
220
C, F
러시아 (구 소련)
50
220
C, E, F
가자흐스탄
50
220
C
우크라이나
50
220
C
우즈베키스탄
50
220
C, I
루마니아
50
230
C, F
폴란드
50
220
C, E
체코
50
230
E
헝가리
50
230
C, F

북미 / 남미
국가명
Hz
전압
플러그 타입
미국
60
120
A, B
캐나다
60
120
A, B
멕시코
60
127
A
브라질
60
127/220
A, B, C
아르헨티나
50
220
C, I
칠레
50
220
C, L
나카라과
60
120
A
베네수엘라
60
120
A, B
볼리비아
50
115/220/230
A, C
콜롬비아
60
110
A, B
우루과이
50
220
C, F, I
파라과이
50
220
C
자메이카
50
110
A, B
페루
60
220
A, B, C
파나마
60
110/120
A, B
쿠바
60
110/120
A, B, C, L



오세아니아 / 대앙주

국가명(州別)

Hz
전압
플러그 타입
호주
50
240
I
뉴질랜드
50
230
I
60
110
A B
파퓨아 뉴기니
50
240
I
피지
50
240
I
타히티
50
110/220
A, B, E



아프리카

국가명(州別)
Hz
전압
플러그 타입
이집트
50
220
C
케냐
50
240
G
나이지리아
50
240
D, G
남아프리카 공화국
50
220/230
M
카메룬
50
220
C, E
이디오피아
50
220
D, J, L
튀니지
50
230
C, E
세네갈
50
230
C, D, E, K
가봉
50
220
C
잠비아
50
230
C, D, G
모로코
50
127/220
C, E


TABLE별 용량을 파악해보자!

딕셔너리뷰에서
USER_SEGMENTS 에서 확인할수 있습니다.

SELECT SEGMENT_NAME, BYTES
FROM USER_SEGMENTS
where SEGMENT_TYPE='TABLE';

에서 점유용량을 확인할수 있습니다.

//////////////////////////////////////////////////////////////////////////////////

위 delri님의 방법은 해당 Table에 할당되어 있는 크기를 측정하는 방법이며
만일 Table에 공간 할당은 되었으나 아직 (전혀)사용되지 않은 공간을 제외한 실
제 사용되고 있는
공간을 확인하실려면(즉 HWM 아래 공간)...

1. 해당 table을 analyze 해서

     analyze table t_name compute statistics;

2. 해당 table의 blocks를 구한다.

     select blocks
      from dba_tables
     where table_name ='T_NAME';

     ==> blocks +1(segment header block) 이 해당 table이 사용중인 db block 갯수


위 계산에서 물론 사용된 후 delete에 의해 현재 완전히 비어 있는 block도
사용하고 있는 block으로 인식
하므로 완전히 비어 있는 block을 제거하기 위해서는
oracle8 이상인 경우 rowid는 아래처럼 구성되어 있기때문에

object fil block row
------ --- ------ ---
AAABPW AAF AAAAv1 AAA

1. select count(*)
      from (select substr(rowid,1,15)
               from test
              group by substr(rowid,1,15) );
하면..HWM아래 할당은 되었지만 완전히 비어 있는 block을 빼고 조금이라도 사
용된 block의 갯수만 구함


안드로이드 기반 오픈 소스 프로젝트 및 참고 사이트 모음 안드로이드

 
안드로이드 개발 참고 사이트 모음입니다. 

AndroidPub : 안드로이드펍 한국 안드로이드 사용자 및 개발자 커뮤니티. 
  소개       : 한국 안드로이드 커뮤니티
  홈페이지 : http://www.androidpub.com

공식 안드로이드 공식 홈페이지들
  소개글        : 안드로이드의 전체 소스를 다운받을 수 있음
  홈페이지     : 소스 http://source.android.com
                     공식 http://www.android.com
                     마켓 http://market.android.com
                     개발자 http://developer.android.com

- 안드로이드 써드파티 마켓 사이트 모음
  소개글        : 안드로이드의 다양한 써드파티 마켓 정보 모음
  홈페이지     : http://www.androidpub.com/22520


Android Code Snippets
  소개       : 간단한 안드로이드 코드 모음
  홈페이지 : http://www.androidsnippets.org

StackOverflow Android 
  소개       : 안드로이드 질문과 답 (영문)

구글의 안드로이드 개발자들이 만든 애플리케이션 모음 (Apps for Android )
  소개        : 주로 구글의 실제 안드로이드 개발자들이 만든 샘플 애플리케이션들로 안드로이드의 구조를 잘 이해하고
                  작성한 애플리케이션들이라서 주옥같은 예제가 많이 들어있음. PhotoStream는 웹서버와의 통신에서
                  참고하기 좋은 애플리케이션.

안드로이드 플랫폼 스터디 모임
  소개       : 안드로이드 애플리케이션 프로그래밍을 공부하는 것이 아니라, 안드로이드 플랫폼의 자체 이해를 목적으로 합 
                       니다. 이를 통해 안드로이드 프레임워크의 설계 및 동작 원리를 이해하고, 나아가 안드로이드의 내부 구조를 파악 
                      함으로써 효율적인 안드로이드 프로그램의 설계 및 구현 할 수 있는 지식을 쌓는 것이 저희 스터디의 목표입니다.  
  홈페이지 : http://andstudy.springnote.com/

Eyes Free TTS 텍스트 음성 변환 라이브러리
  소개       : 안드로이드 애플리케이션에서 공유해서 사용할 수 있는 TTS 라이브러리 (안드로이드 1.6에 기본 탑재될 것으로 
                 알려짐)

-  SMALI Dex assembler/disassembler
  소개       : JF 가 작업중인 Dex 어셈블러/디스어셈블러

The open mob for android
  소개       : 안드로이드 개발 관련 위키
  홈페이지 : http://wiki.andmob.org/

안드로이드 스크립트 환경 (ASE : Android Scripting Environment)
  소개       : http://www.androidpub.com/11518

Live CD for Android
  소개       : PC에서 안드로이드를 구동시키자? x86 으로 컴파일된 안드로이드 이미지를 CD에 구워서 PC에서 구동.

HTC 안드로이드 개발자 폰 지원 사이트. 
  소개       : 최신 시스템 이미지등을 다운받을 수 있음

MotoDev 모토로라 개발자 사이트
  소개       : 모토로라의 개발자 사이트 최근 안드로이드를 중심으로 구성되고 있음. PodCast등 쓸만한 정보가 제법 올라옴
  홈페이지 : http://developer.motorola.com/

차이나모바일 OMS 개발자 사이트
  소개       : 차이나 모바일 OMS SDK 정체를 드러내다. 
  홈페이지  : http://www.ophonesdn.com 

일본 안드로이드회 기술자료
  소개         : 일본의 안드로이드 개발자 협회의 기술자료 다양한 자료가 잘 정리되어있다.

본 글은 퍼가셔도 좋으나 안드로이드펍 출처를 정확히 명기해주시기 바랍니다. :) 종종 업데이트 하도록 하겠습니다. 쓸만한 링크가 있으면 댓글로 알려주세요 추가시켜놓도록 하겠습니다.
 

안드로이드 강좌 6 - Java 코드(Code)에서 뷰(View) 다루기 안드로이드

이번 Android 강좌에서는 Java 코드에서 View를 다루는 방법을 알아보겠습니다. 화면에 표시한 TextView, Button등의 View를 어떻게 Java Code에서 접근할 수 있는지 알아보고 일부 함수들에 대해서도 설명 하겠습니다. 기본 강좌는 여기까지가 될 것 같습니다. Q&A에서 질문하시는 것 위주로 정리하고 어느 정도 정리가 되면 다음 강좌를 진행하도록 하겠습니다.

안드로이드 강좌 6 - Java 코드(Code)에서 뷰(View)  다루기
id
어플리케이션 실행 시에 Layout XML에서 정해진데로 View와 Layout들이 생성되고 보여집니다. 생성된 View들에서 코드상에서 동적으로 변경해야 하는 값들이 있다면, 변경해야할 View를 코드 상에서 불러오기 위해 먼저 XMl파일에서 id를 지정해야 합니다.
1.<TextView  
2.    android:id="@+id/text"
3.    android:layout_width="fill_parent" 
4.    android:layout_height="wrap_content"
5.    />

id 값은 같은 XML파일 안에서 유일하게 사용되어야 자바 코드에서 제대로 View를 가져 올 수가 있습니다.

Code
XML파일을 고쳐서 새로운 id를 추가하면 자동으로 R.java 파일이 자동으로 생성됩니다. 지정한 id가 R.id.text라는 상수로 들어가 있는 것을 확인할 수 있습니다. 이전에 말씀드렸듯이 R.java는 직접 고쳐서는 안됩니다. 만약 상수값이 제대로 들어가 있지 않은 겨우 XML파일을 다시 저장한다던지, 프로젝트를 refresh한다던지 해서 R.java가 자동으로 생성되게 하면 됩니다.

1.TextView t = (TextView)findViewById(R.id.text);
2.t.setText("Hello");
3.t.setBackgroundColor(0xFFFF0000);
4.t.setGravity(Gravity.LEFT);

위 코드를 setContentView한수 호출 후에 넣어주도록 합니다. setContentView에서 레이아웃 XML파일을 불러서 실제 View 객체들을 생성합니다. 그 다음 findViewById함수를 통해 생성한 View 객체를 id를 통해서 가져옵니다. 해당 View가 TextView라는 것을 알고 있으니 TextView로 Casting해줍니다. 그 다음 표시할 문자열을 바꾼다던지, 배경색을 바꾼다던지 이전에 XML에서 했던 작업과 같은 것을 자바 코드상에서 설정해줄 수 있습니다.

View.onClickListener

코드에서 View값을 변경해야할 가장 일반적인 경우는 버튼이 클릭되었을때의 처리입니다. 

1.Button button = (Button)findViewById(R.id.button);
2.button.setOnClickListener(new View.OnClickListener() {
3.   public void onClick(View v) {
4.      //Code
5.   }
6.});

먼저 findViewById르 해당 Button의 객체를 코드로 불러옵니다. 그 다음 View.onClickListener이라는 Interface를 구현한 객체를 setOnClickListener를 통해서 리스너로 등록을 합니다. 그러면 실제 사용자가 버튼을 클릭했을때 해당 코드가 호출되어 실행됩니다. 클릭을 했을 때 뿐 아니라 다양한 사용자의 입력에 따라 Listener가 정의되어있고 Listener를 등록해서 각각의 경우에 대한 처리를 할 수 있도록 되어있으니 JavaDoc문서를 참고하시기 바랍니다.

예제

TextView와 Button을 화면에 표시하고 Button을 클릭했을때 "클릭됨~"이라는 메시지를 TextView에 표시하는 예제입니다.

myactivity.xml

01.<?xml version="1.0" encoding="utf-8"?>
02.<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
03.    android:orientation="vertical"
04.    android:layout_width="fill_parent"
05.    android:layout_height="fill_parent"
06.    >    
07.<TextView  
08.    android:id="@+id/text"
09.    android:layout_width="fill_parent" 
10.    android:layout_height="wrap_content"
11.    android:text=""
12.    />
13.<Button  
14.    android:id="@+id/button"
15.    android:layout_width="fill_parent" 
16.    android:layout_height="wrap_content"
17.    android:text="버튼"
18.    />
19.</LinearLayout>

MyActivity.java

01.package kr.mobileplace.lecture;
02.import android.app.Activity;
03.import android.os.Bundle;
04.import android.view.Gravity;
05.import android.view.View;
06.import android.widget.Button;
07.import android.widget.TextView;
08.public class MyActivity extends Activity {
09. @Override
10. protected void onCreate(Bundle savedInstanceState) {
11.  super.onCreate(savedInstanceState);
12.  setContentView(R.layout.myactivity);
13.  Button button = (Button)findViewById(R.id.button);
14.  button.setOnClickListener(new View.OnClickListener() {
15.   public void onClick(View v) {
16.    TextView t = (TextView)findViewById(R.id.text);
17.    t.setText("클릭됨~");
18.    t.setBackgroundColor(0xFFFF0000);
19.    t.setGravity(Gravity.LEFT);    }
20.  });
21. }
22.}

이제 Android 프로젝트를 생성하고 화면을 구성하고 사용자 입력에 대한 코드를 처리하는 것까지의 기본 적인 작업들을 한번씩 해보았습니다. 여기까지 실제로 이클립스로 직접 실행시키며 해보면서 전혀 몰랐던 플랫폼과 개발환경에 맛을 보셨을 겁니다. 이제 하나씩 깊이 들어가보도록 하지요.

Creative Commons License
이 저작물은 크리에이티브 커먼즈 코리아 저작자표시-비영리-변경금지 2.0 대한민국 라이선스에 따라 이용하실 수 있습니다.  출처 : http://www.androidpub.com/2353 작성자 : 회색(박성서)

안드로이드 강좌 5 - XML에서의 TextView, ImageView, LinearLayout 안드로이드

이번 강좌에서는 레이아웃 XML파일에서의 TextView, ImageView, LinearLayout의 설정에 관하여 설명을 하도록 하겠습니다.  Android에는 수십개의 View와 Layout이 있지만 그 중에서 가장 기본이 되는 3개를 먼저 배우도록 하겠습니다. 모든 View가 공통적으로 가지는 속성값에 대해서는 이전에 설명했기 때문에 이번에는 각각의 View만이 가지는 값들에 대해서 설명하도록 하겠습니다.

안드로이드 강좌 5 - XML에서의 TextView, ImageView, LinearLayout

먼저 각각의 View가 어떤 XML 속성값을 가질 수 있는지는 Android SDK 문서 (sdk디렉토리의 docs 위치)에서 각각의 View 클래스안에 XML Attributes라는 부분에 문서로 정리되어 있습니다. 자세한 것은 직접 문서를 참조하시고 저는 많이 사용되는 일부 값들에 대해서 정리를 해보겠습니다.

TextView
문자열을 표시해주는 역할을 하는 View 입니다.

android:text               :  문자열을 입력
android:textColor     :  문자열의 색을 지정
android:textSize       :  폰트 크기의 설정
android:textStyle      :  bold, italic등의 스타일 설정
android:gravity         :  View안에서 문자열이 어떻게 정렬될 것인지를 지정 
                                      top, bottom, left, right, center, center_vertical, center_horizontal등이 | 연산자와 함께 쓰일 수 있다.
android:singleLine :  문자열을 여러 줄로 나누지 않고 한 줄로 표시

01.<TextView  
02.    android:layout_width="fill_parent" 
03.    android:layout_height="fill_parent" 
04.    android:text = "안녕하세요 안드로이드 공부하시는 여러분"
05.    android:textColor = "#FF0000FF"
06.    android:textSize = "30sp"
07.    android:textStyle = "italic"
08.    android:gravity = "right|center_vertical"
09.    android:singleLine = "true"    
10.    />


예제 XML을 실행시킨 결과

(그림 5-1)                                                                                          (그림 5-2) singleLine="true"

(그림 5-1)은 singleLine을 설정하지 않았을 때, (그림 5-2)는 singleLine을 설정했을 때의 화면입니다.

ImageView
이미지를 표시해주는 역할을 하는 View 입니다.

android:src                :  Image 설정. 프로젝트 디렉토리의 res/drawable에 있는 이미지를 "@drawable/image"로 넣어줌
android:scaleType   :  이미지의 표시를 위한 크기변환(scaling) 및 채워넣기 옵션
                                        fitCenter : 비율을 유지한채 View의 크기에 맞춰서 표시
                                        fitXY         : 비율을 유지 하지 않고 View의 크기에 맞춰서 표시
                                        center     : 원래 이미지의 크기 변환을 하지 않음
                                        그 외 fitStart, fitEnd, centerCrop, centerInside 등은 문서에서 참조하시기 바랍니다.

새로운 이미지를 추가하기 위해서는 프로젝트 디렉토리의 res/drawable에 jpg, png 등의 파일을 복사해넣으면 이클립스에서 인식해서 표시합니다. 만약 이클립스에서 제대로 표시되지 않는 경우 Package화면에서 프로젝트를 선택한 후에 F5(Refresh)를 눌러주시면 됩니다.

1.<ImageView  
2.    android:layout_width="fill_parent" 
3.    android:layout_height="fill_parent"
4.    android:src="@drawable/icon"
5.    android:scaleType="center" 
6.    />


기본으로 들어있는 icon그림인 icon.png파일을 화면에 표시하는 예제입니다. (그림 5-3)은 scaleType을 center로 (그림 5-4)는 scaleType을 fitCenter로 설정해서 실행시켜본 결과입니다.


(그림 5-3)  scaleType="center"                                                    (그림 5-4) scaleType="fitCenter"

LinearLayout
Layout은 다른 자식 View들을 포함하고 배치해주는 역할을 합니다. 그 중 LinearLayout이 가장 많이 쓰이는데요. 자식 뷰들을 순서대로 한방향으로 나열해주는 역할을 합니다.

android:orientation : vertical일 경우 위에서 아래로 View들을 차례로 배치하고, horizontal일 경우 왼쪽에서 오른쪽으로 View들을 차례로 배치합니다.

01.<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
02.    android:orientation="vertical"
03.    android:layout_width="fill_parent"
04.    android:layout_height="fill_parent"
05.    >    
06.<TextView  
07.    android:layout_width="fill_parent" 
08.    android:layout_height="0dp"
09.    android:layout_weight="1"
10.    android:background="#FF880000"
11.    />
12.<TextView  
13.    android:layout_width="fill_parent" 
14.    android:layout_height="0dp"
15.    android:layout_weight="1"
16.    android:background="#FF008800"
17.    />
18.<TextView  
19.    android:layout_width="fill_parent" 
20.    android:layout_height="0dp"
21.    android:layout_weight="1"
22.    android:background="#FF000088"
23.    />
24.</LinearLayout>


예제에서 LinearLayout은 세개의 TextView를 자식으로 가지고 각 TextView는 android:layout_height="0dp"로 설정하고 android:layout_weight라고 하는 것을 사용했는데 이것은 각각의 View의 높이를 상대적으로 결정한다는 뜻입니다. 여기서 각 View가 1:1:1의 비율의 높이를 가지도록 설정됩니다.

(그림 5-5) 는 예제를 그대로 실행한 것이고, (그림 5-6)은 orientation을 horizontal로 바꾸고, android:layout_width="0dp", android:layout_height="fill_parent"로 설정하고 layout_weight를 각각 1, 2, 1으로 설정한 결과입니다.


(그림 5-5)                                                                                          (그림 5-6)

이번 강좌는 여기 까지입니다. 궁금한점이 있으시면 언제든지 댓글이나 Q&A 게시판에 질문을 남겨주세요.


Creative Commons License
이 저작물은 크리에이티브 커먼즈 코리아 저작자표시-비영리-변경금지 2.0 대한민국 라이선스에 따라 이용하실 수 있습니다.  출처 : http://www.androidpub.com/2198 작성자 : 회색(박성서)

1 2 3 4 5 6 7 8 9 10 다음