현행 시스템 파악이란?

현행 시스템을 구성하는 하위 시스템을 파악하고, 연계정보, 제공기능, 기술요소 등을 파악하는 과정이다.

 

현행 시스템 파악 단계

현행 시스템 구성/기능/인터페이스 파악 -> 현행 시스템 아키텍쳐 및 소프트웨어 구성 파악 -> 하드웨어 및 네트워크 파악

(인터페이스 현황 파악: 데이터 형식,          (소프트웨어 파악: 라이선스 적용방식, 라이선수 

통신규약, 연계유형 등을 표시)                   수 파악)

 

소프트웨어 아키텍처란?

소프트웨어 아키텍처는 여러가지 소프트웨어 구성요소와 그의 특성 그리고 구성요소간의 관계를 표현한 시스템 구조를 말한다.

 

소프트웨어 아키텍처 프레임워크 구성요소

1. 아키텍처 명세서

2. 이해관계자

3. 관심사

4.관점

5. 뷰

6. 근거

 

소프트웨어 아키텍처 4+1 뷰

1. 유스케이스 뷰 (아키텍처를 도출하고 설계하는 작업을 주도)

2. 논리 뷰 (설계 모델의 추상화, 주요 설계 패키지와 서브 시스템, 클래스를 식별하는 뷰)

3. 프로세스 뷰 (런타임 시의 시스템의 테스크, 스레드, 프로세스와 이들사이의 상호작용)

4. 구현 뷰 (소프트웨어 모듈의 구성을 표현하는 뷰, 컴포넌트 뷰라고도 함)

5. 배포 뷰 (물리적 노드 구성과 상호 연결 관계를 배포 다이어그램으로 표현하는 뷰)

 

현행시스템 분석시 취득자료

1단계 - 정보시스템 구성도, 기능 구성도, 인터페이스 현황

2단계 - 현행 시스템 아키텍처 구성도, 소프트웨어 구성도

3단계 - 하드웨어, 네트워크 구성도

 

취득자료를 토대 분석대상

정보시스템 구성/기능 구성도: 정보시스템의 구분, 정보시스템 명......

(정보시스템이 들어가 있으면 맞다) 

인터페이스 현황: 송수신 시스템, 연계방식 및 연계주기, 연동 데이터 형식

(송수신 -> 인터페이스)

현행 시스템 아키텍처 구성도: 운영체제의 종류, 적용 프레임워크, 개층별 적용기술

(운영체제 -> 아키텍처 구성도)

소프트웨어 구성도: 단위 시스템별 필요 소프트웨어의 제품명 및 용도, 라이선스 적용방식, 수

(라이선스 -> 소프트웨어 구성도)

하드웨어 구성도: 하드웨어 관련 내용.....

네트워크 구성도: 네트워크 관련 내용....

 

운영체제란?

컴퓨터 시스템이 제공하는 모든 하드웨어와 소프트웨어를 사용하도록 해주고, 사용자와 컴퓨터 하드웨어 사이의 인터페이스 역할을 한다.

 

분석 시 고려사항

품질 - 신뢰도, 성능

지원 - 주변기기, 기술지원, 구축비용

 

네트워크란?

컴퓨터 장치들의 노드 간 연결을 통해 서로가 데이터를 교환할 수 있도록 하는 기술이다.

OSI7: APSTNDP ,전송(Segment) 네트워크(Packet), 데이터링크(Frame)

 

배치작업이란?

일련의 작업을 하나의 작업 단위로 묶어서 일괄적으로 처리하는 작업.

 

DBMS란?

데이터 집합을 만들고 저장 및 관리할 수 있는 기능들을 제공하는 응용 프로그램.

 

DBMS기능

중복 제어, 접근 통제, 인터페이스 제공, 관계 표현....

 

DBMS 분석 시 고려사항

성능 - 가용성, 성능, 상호 호환성

지원 - 기술 지원, 구축 비용

 

JDBC란?

자바에서 데이터베이스를 이용할수 있도록 연결해주는 응용 프로그램 인터페이스.

 

미들웨어란?

운영체제와 소프트웨어 애플리케이션 사이에 위치하고 있으며 분산 컴퓨팅 환경에서 응용 프로그램과 프로그램의 환경 간의 원만한 통신을 하도록 제어해주는 소프트웨어이다.

 

웹 애플리케이션(WAS)란?

서버계층에서 애플리케이션이 동작할 수 있는 환경을 제공하고 안정적인 트랜잭션 처리와 관리, 다른 이기종 시스템과의 애플리케이션 연동을 지원한다.

 

미들웨어 분석 시 고려사항

성능 - 가용성, 성능

지원 - 기술지원, 구축비용

 

기술 환경 정의를 위한 자료 수집

1. 온라인 트랜잭션(OLTP) 처리 시스템 (트랜잭션 수가 조사항목에 있으면 OLTP)

2. 웹/앱 애플리케이션 서버(WEB/WAS) (접속자수가 조사항목에 있으면)

 

요구사항의 분류

기능적 요구사항:

개념- 시스템이 제공하는 기능

특성- 기,완,일(기능성,완전성,일관성)

EX)최종 주문이 완료되면 배송추적 조회가 가능해야함

 

비기능적 요구사항:

개념- 시스템이 수행하는 기능

특성-신사효유이(신뢰성,사용성,효율성,유지보수성,이식성)

EX)특정 함수의 호출시간은 3초를 넘지 않아야 함

 

요구사항 개발 프로세스

1.요구사항 도출 - 어떻게 수집할지 파악

2.요구사항 분석 - 어떻게 상호작용하는지 이해

3.요구사항 명세 - 검토,평가,승인 가능한 문서를 작성하는 단계

4.요구사항 확인 - 완전한지 검증하는 단계

 

개발 프로세스 주요기법

도출 - 인터뷰,설문조사,브레인스토밍,워크숍

분석 - 자료흐름 지향 분석,객체지향 분석

명세

확인 - 동료검토,워크스루,인스펙션

 

요구사항 관리 절차(협기변확)

1.요구사항 협상

2.요구사향 기준선

3.요구사항 변경관리

4.요구사항 확인 및 검증

 

요구사항 분석 기법(분개할협정)

1.요구사항 분류

2.개념 모델링

3.요구사항 할당

4.요구사항 협상

5.정형 분석

 

요구사항의 확인 기법

1.요구사항 검토

2.프로토타이핑

3.모델 검증(개발된 모델의 품질 검증 필요)

4.인수 테스트(최종 제품을 기준으로 요구사항 만족시키는지 확인)

 

프로토타이핑란?

사용자가 요구한 주요 기능을 프로토타입으로 구현하여 사용자의 피드백을 통해 개선, 보완해나가는 기법이다.

 

요구사항 확인 프로세스

1.요구사항 목록 확인

2.요구사항 정의서 작성 여부 확인

3. 비기능적 요구사항의 확인

4. 타 시스템 연계 및 인터페이스 요구사항 확인

 

요구사항의 기술적 타당성 검토

1.성능 및 용량 산정의 적정성

2.시스템 간 상호 운용성

3.IT 시장 성숙도 및 트렌드 부합성

4.기술적 위험 분석

 

요구사항의 기술적 타당성 분석 프로세스

1.타당성 분석 결과 기록

2.타당성 분석 결과의 이해관계자 검증

3.타당성 분석 결과 확인 및 배포/공유

 

비용산정 모델 분류

하향식 산정방법 - 경험이 많은 전문가에게 의뢰

(전문가 판단, 델파이 기법)

상향식 산정방법 - 세부적인 요구사항과 기능에 따라 필요한 비용을 계산하는 방식

(LOC,ManMonth, COCOMO, 푸트남, 기능점수)

 

분석 모델 검증 방법

1. 유스케이스 모델 검증: 시스템 기능에 대한 유스케이스 모형 상세화 수준 및 적정성 검증을 위해 액터, 유스케이스, 유스케이스 명세서 점검

2. 개념수준의 분석 클래스 검증

3. 분석 클래스 검증

 

분석모델 검증 프로세스

1. 검토의견 컬럼 추가

2. 검토의견 작성

3. 검토의견 정제

 

분석 모델의 시스템화 타당성 분석 프로세스

1.타당성 검토의견 컬럼 추가

2.타당성 검토의견 작성

3.타당성 분석 결과 검증

4.타당성 분석 결과 확인 및 배포/공유

 

(1)소프트웨어 개발 보안 설계

SW 개발 보안의 개념: 소스 코드 등에 존재하는 보안 취약점을 제거하고 보안을 고려하여 기능을 설계 및 구현하는 것

 

SW 개발 보안의 구성요소

C(confidentiality): 기밀성

I(Availability): 가용성

A(Integrity): 무결성

 

SW 개발 보안 용어

1. 자산: 조직의 데이터 또는 조직의 소유자가 가치를 부여한 대상

2. 위협: 조직이나 기업의 자산에 악영향을 끼칠 수 있는 시건이나 행위

3. 취약점: 위협이 발생하기 위한 사전 조건에 따른 상황

4. 위험: 위협이 취약점을 이용하여 조직의 자산 손실 피해를 가져올 가능성

 

Dos 공격: 시스템을 악의적으로 공격 해당 시스템의 자원을 부족하게 하여 원래 의도된 용도로 사용하지 못하게 하는 공격. 

 

DoS공격의 종류

1. 지역 시스템 공격

2. 원격 네트워크 공격

 

DDos 공격: DoS의 또 다른 형태로 여러대의 공격자를 분산 배치하여 동시에 동작하게함으로써 특정 사이트를 공격하는 기법.

 

DDos의 공격 구성요소

1. 핸들러

2. 에이전트

3. 마스터

4. 공격자

5. 데몬프로그램

 

DDos 공격 대응방안

1. 차단 정책 업데이트

2. 좀비 PC IP 확보

3. 보안 솔루션 운영

4. 홈페이지 보안 관리

5. 시스템 패치

 

자원고갈 공격 기법

1. SYN 플러딩: 서버의 동시 가용 사용자 수를 SYN 패킷만 보내 점유하여 다른 사용자가 서버를 사용 불가능하게 하는 공격

2. UDP 플러딩: 응답 메시지(ICMP)를 생성하게 하여 지속해서 자원을 고갈시키는 공격

3. 스머프

4. PoD(Ping of Death)

 

애플리케이션 공격기법

1. HTTP GET 플러딩

2. Slowloris 

3. RUDY

 

네트워크 서비스 공격

1. 네트워크 스캐너, 스니퍼

2. 패스워드 크래킹

3. IP 스푸핑

4. 트로이 목마

 

초 간 단 정 리 

(기본은 미리 학습하고 보시면 좋습니다.)

 

(1)프로시저란?

프로시저는 절자형 SQL을 활용하여 특정기능을 수행할 수 있는 트랜잭션 언어이다. 

 

프로시저의 구성 (빈칸 단답식)

1. 선언부 : 프로시저 명칭, 변수와 인수 타입 정의

2. 시작부/종료부 : 시작 종료 표현 다수 실행을 제어하는 기본 단위

3. 제어부 : 순차처리 조건문과 반복문을 이용

4. SQL : DML 주로 사용 

5. 예외부 : 예외처리

6. 실행부 : DBMS 적용 또는 취소 여부 결정 처리

 

선언부

Create[ or replace] Procedure

파라미터명 [mode] 데이터 타입 - mode(IN, OUT, INOUT) ,데이터타입(CHAR, NUMBER, VARCHAR)

.....

IS

변수 선언

 

제어부 

IF ~THEN

  sentence~
ELSIF ~ THEN

  sentence~

ELSE

  sentence~

END IF

 

Case

When ~ THEN

  SET~

When ~ THEN

  SET~

ELSE

  SET~

 

프로시저 SQL

Select, Insert, Update, Delete

 

프로시저 실행부

Commit, Rollback

 

(2)사용자 정의함수

특정 절차형 SQL을 활용하여 SQL을 처리하고 수행결과를 단일값으로 반환하는 SQL.

 

사용자 정의함수 구현

1. 선언부

2. 시작부/종료부

3. 제어부

4. SQL

5. 예외부

6. 반환부 ***

 

선언부 (반환이 있다는 점과 Function의 차이를 제외하고는 유사하다)

Create [OR replace] Function 함수명

Return 데이터_타입

파라미터 명 [Mode] 데이터_차입

...

IS

변수 선언 

 

(3)트리거

특정 테이블에 삽입 수정 삭제 등의 데이터 변경 이벤트가 발생하면 DBMS에서 자동적으로 실행되도록 구현된 프로그램이다.

 

트리거의 목적

특정 테이블에 대한 데이터 변경을 시작점으로 설정 그와 관련한 모든 작업을 자동으로 수행하기 위해 트리거 사용

 

트리거 종류

1. 행 트리거

2. 문장 트리거 

 

트리거의 구성

반환값이 없다는 점 DML을 주된 목적으로 한다는 점에서 프로시저와 유사하지만

EVENT 명령어를 통해 트리거 실행을 위한 이벤트를 인지한다는 점 외부 변수 IN/OUT이 없다는 점은 프로시저와 사용자 정의 함수와 다르다.

1. 선언부

2. 이벤트부

3. 시작/종료부

4. 제어부

5. SQL부

6. 예외부

 

선언부

Create [Or replace] Trigger 트리거 명

 

이벤트부

순서 유형 On 테이블명

[FOR EACH ROW]

 

이벤트 순서 

BEFORE

AFTER

 

이벤트 유형

INSERT

UPDATE

DELETE

 

트리거 작성 시 주의사항

TCL 사용 불가 - 트리거 내에는 Commit, Rollback 등의 TCL 사용시 컴파일 에러 발생

오류의 주의 - 트리거 실행 중 오류가 발생하게 되면 트리거 실행의 운인을 제공한 데이터 작업에도 영향

 

(4)데이터 분석 함수의 개념

데이터 분석을 위해 복수 행 기준의 데이터를 모아서 처리하는 것을 목적으로 하는 다중 행 함수이다.

 

데이터 분석 함수 종류

1. 집계 함수

2. 그룹 함수

3. 윈도 함수

 

집계 함수

여러행 또는 테이블 전체 행으로 부터 하나의 결과값을 반환하는 함수이다.

 

집계 함수의 종류

Count, sum, Avg, Max, Stddev, Varian

 

그룹 함수

테이블의 전체 행을 하나 이상의 컬럼을 기준으로 컬럼 값에 따라 그룹화하여 그룹별로 결과를 출력하는 함수

 

그룹함수 유형(결과를 보고 고르는 문제)

1. Rollup

2. Cube

3. Grouping Sets

 

윈도 함수

윈도 함수는 데이터베이스를 사용한 온라인 분석 처리 용도로 사용하기 위해서 표준 SQL에 추가된 함수

 

윈도 함수의 구문

Select function_name(para~)

 Over

([Partition by columns1, col2,...])

[Order by col1, col2....]

 From table_name

 

윈도 함수의 분류

1. 순위 함수 (rank, Dense_rank, row_number)

2. 행순서 함수 (first_value, Last_value, LAG, LEAD)

3. 그룹 내 비율 함수 (Ratio_To_Report, Percent_rank)

 

(5)응용 시스템 DBMS 접속 기술

 

자바 데이터베이스 연결(JDBC: Java DataBase Connectivity)

JDBC는 SQL을 사용하여 DBMS에 질의하고 데이터를 조작하는 API를 제공한다.

 

MyBatis

MyBatis는 DBMS에 질의하기 위한 SQL 쿼리를 별도의 XML파일로 분리하고 Mapping을 통해 SQL을 실행한다.

 

DCL(데이터 제어어) 

데이터베이스 관리자가 데이터 보안, 무결성 유지, 병행 제어, 회복을 위해 관리자가 사용하는 제어용 언어

 

데이터 제어어의 유형

1. Grant (grant 권환 on 테이블 to 사용자 [with 권한 옵션])

2. Revoke (revoke 권한 on 테이블 from 사용자 [cascade constraints])

 

참고 서적: 수제비 2020 정보처리기사 실기 vol.2

 

 

 

 

SQLD 시험을 본지 시간이 좀 지났지만 늦게나마 많은 사람들에게 도움이 되고자 공부법 및 시험 후기를 알려드리고자 합니다. 먼저 저는 전공자이지만 데이터베이스를 공부한지 오래되어.... Anyway~  저는 37화 시험을 봤고 운좋게도 80점으로 합격을 할수 있었습니다.

이글을 통해 시험을 준비하는 모든사람들이 노랭이에 대해서와 시험공부자료를 얻어갈수 있으면 좋겠습니다.

저는 참고서를 이용하지 않고 데이터진흥원에서 제공하는 자료를 다운받아 공부했습니다.

(생각보다 양이 좀 많았지만 자세하게 공부할 수 있어서 저에게는 큰 도움을 받았습니다 하지만 비전공자의 경우 참고서를 이용하는 방법도 좋은거 같아요!!!

 

다음으로 문제집입니다. 일명 노@랭@이@책을 5회독 정도했습니다.

저는 기억력이 나빠서 빠르게 여러번을 보는 타입이라.. 횟수는 중요치 않습니다~

각자 공부 방법에 맞춰 진행하시면 될거 같아요!!!  꼭 기 억 하 셔 야 됩 니 다 노 랭 이!!!!(홍보아니에요...ㅠㅠ;;)

출처 : 교보문고

솔직하게 말씀드리면 개념을 빠르게 훑으시고 위의 노랭이 문제를 편하게 풀수 있을정도로 실력을 갖춘다면 시험에서 무리없이 좋은 성적을 얻을거라 확신하고 확신합니다. ^^

 

후기를 쓰는 것이 처음이라 뭘 써야할지 몰라서 뒤죽박죽이지만 이 글을 보고 나갈때는 노랭이 책을 통해 공부하자는 것만 기억한다면 ㅎㅎ 성공입니다 >_0. 

 

제가 공부했던 개념과 문제 자료는 아래에 올려드렸으니 함께 병행하시면 더 좋은 성적을 얻을 수 있을겁니다.

다들 1회 1성공 하세요! 화이팅!!

 

1-1.데이터 모델링의 이해.pdf
2.42MB
1-2.데이터 모델의 성능.pdf
2.83MB
2-1.SQL 기본.pdf
2.63MB
2-2.SQL 활용.pdf
1.82MB
2-3.SQL 최적화 기본 원리.pdf
0.53MB
SQLD 기출문제 모음(21, 24, 25, 26, 30).pdf
1.15MB
SQLD_요약 서브노트.pdf
8.52MB

Connect by 계층적 쿼리는 오라클만이 가진 기능 중 하나로, 데이터를 선택하여 계층적인 순서 그대로 리턴하는데 사용된다.

예를 들면 아래와 같이 직원 테이블이 있다고 생각 하자.

 기본적인 SQl을 사용하여 계층 관계를 표현하는것은 불가능하다. 하지만 재귀 PL/SQL 루틴과 connect by 를 사용한다면 표현이 가능하다.

재귀 PL/SQL은개발과 처리 과정에서 다소 많은 시간이 필요로 한다는 단점이 있으며, 변경사항이 있을 때 다른 저장 프로시저를 만들거나 보다 복잡하게 변경해야 한다는 점도 무시 할 수 없다.

이에 오라클에서는 connect by라는 확장된 select 구문을 지원한다.

select lpad(' ',(level-1)*2,' ')||직원 직원, 직급

  from 직원
start with 직원 = '개똥'
connect by 직속상사 = prior 직원

결과

* start with

select 구문의 start with 절은 계층 구조가 어떤 행에서 시작하는지 지정하는 기능을 한다.

 정의 : start with <조건>

where 절의 내용으로 쓸 수 있는 조건이라면 start with로도 사용이 가능하며, 하나 이상의 조건을 결함하는 것도 가능하다.

 ex) start with 직원='개똥' and 직원='순희'

start with 적의 조건에 맞는 행은 결과셋의 루트 노드가 된다. 주의할점은 조건에 맞는 행이 한 번 이상 등장할 경우이다.

예를 들면 start with 직원 ='개똥'and 직원 ='순희' 사용하면 개똥 이 순희 하위에 있기 때문에 순희 트리가 두 번 만들어지게 된다.

(한번은 개똥의 하위에서, 그리고 한 번은 루트로서) 

select lpad(' ',(level-1)*2,' ')||직원 직원, 직급

  from 직원
start with 직원 = '개똥' or 직원 ='순희'
connect by 직속상사 = prior 직원    직원      직급

결과

 같은 결과셋이 여러 번 만들어지는 것을 방지하기 위해서는 이러한 조건을 사용해서는 안 된다.

 

처음 쿼리의 예제에서 직원 ='개똥'이라는 조건을 사용했으며, 이는 회사의 가장 높은 사람을 의미하는 것으로 전체 직원에 대한 목록이 만들어 진다. 하지만 이러한 방법은 그다지 좋지 않다. 왜냐하면, 개똥이 테이블에서 빠져나간다면 새로운 쿼리를 작성하여 직속상사가 의 값이 NULL 인 직원으로 부터 루트 노드가 다시 시작되도록 해야할 것이다.

 

그러므로, 가능하면 보다 구체적인, 즉 결과셋의 양이 적은 조건을 사용하는 것이 바람직하다. 직원 테이블을 보면 개똥의 직속상사의 값이 NULL로 저장되어 있는데, 이는 개똥이라는 직원이 보고할 사람이 없음을, 즉 가장 최상의 간부임을 의미한다.

select lpad(' ',(level-1)*2,' ')||직원 직원, 직급
  from 직원
start with 직속상사 is null

connect by 직속상사 = prior 직원

결과

* connect by prior

connect by 절은 각 행이 어떻게 연결되는지를 오라클에게 알려주는 역할을 한다. 

즉 계층 구조 내에서 각 행의 관계를 설정하는 것이다.

현재 행과 다른 행은 Prior라는 키워드를 통해 구별된다. Prior는 상위 행을 참조하는 것으로, 우리의 예제에서는 다음과 같이 사용되었다.

connect by 직속상사 = prior 직원

 이는 "방금 전 행의 직원 값이 현재 행의 직속상사 값인 모든 행을 찾아라"라는 의미이다.

쉽게 말하면, 방금전에 살펴본 직원이 현재 직원의 상사가 되는 방식으로 리턴하라는 것이다.

다음 예제 코드를 보면, prior 부분이 = 기호를 사이에 두고 반대편으로 건너갔는데,

결과는 다음과 같이 트리를 거슬러 내려가는 것이 아니라, 거슬러 올라가는 방식으로 리턴되었다.

select lpad(' ',(level-1)*2,' ')||직원 직원, 직급

  from 직원
start with 직원 ='철수'
connect by prior 직속상사 = 직원

결과

 이 쿼리에서는 철수가 루트 노드이며, 그의 상사가 오히려 아래에 표현되어 있다. 

그 이유는 " 방금 전 행의 직속상사 값이 현재 행의 직원 값인 모든 행을 찾아라"라고 선언했기 때문이다. 

이와 같이 prior 키워드를 등호의 반대편으로 넣어도 오류가 발생하지 않고, 전혀 다른 결과가 얻어짐을 알 수 있다.  

prior 키워드는 또한 이전 행의 열을 참조하기 위해 다음과 같이 select 절 내에서 사용 될 수도 있다.

select lpad(' ',(level-1)*2,' ')||직원 직원, prior 직원 상사, 직급

  from 직원
start with 직원 ='철수'
connect by prior 직속상사 = 직원

결과

* level

level은 오라클에서 실행되는 모든 쿼리 내에서 사용 가능한 가상-열로서, 트리 내에서 어떤 단계(level)에 있는지를 나타내는 정수값이다.

계층적인 쿼리가 아니라면 다음과 같이 모든 값이 0, 즉 같은 단계를 가질 것이다.

select 직원,level

  from 직원

결과

한편, 계층적 쿼리에서는 level의 값을 통해 트리에서의 위치를 확인할 수 있다. 루트 노드의 level 값이 1이다.

select lpad(' ',(level-1)*2,' ')||직원 직원,직급,level

  from 직원
start with 직속상사 is null
connect by prior 직원 = 직속상사

결과

 트리를 한 단계씩 거슬러 내려갈 때마다 값이 1씩 증가함을 알 수 있다. 

level은 여러 가지 면에서 아주 유용하다. 먼저, 다음과 같이 각 항목을 출력할 때 앞에 붙는 공백의 양을 조절하여 계층적인 형식을 한눈에 알아볼 수 있도록 하는 것이 가능하다.

select lpad(' ',(level-1)*2,' ')||직원 직원

또한, level 값이 3까지인 내용만을 출력하라. 등의 명령도 가능하다.

select lpad(' ',(level-1)*2,' ')||직원 직원,직급,level

  from 직원
start with 직속상사 is null
connect by prior 직원 = 직속상사 and level <=3

 

결과

철수와 길동의 경우는 level 값이 4이기 때문에 출력되지 않았다

level <=3 이라는 조건을 where 절이 아닌 connect by 절에 넣은 것에 주의해야한다 

어떤 곳에 넣어도 결과는 같지만, where 절에 넣으면 전체 트리를 구성한 후에 다시 선택하는 반면, connect by 절에 넣으면 이 조건을 사용해서 트리를 구성하기 때문에 보다 효과적이라고 할 수 있다.

 

출처: https://vaert.tistory.com/m/166

Compiler?

컴파일러(compiler)는 해석기, 번역기라는 뜻으로 특정 프로그래밍 언어로 쓰여진 문서를 다른 프로그래밍 언어로 옮기는 프로그램을 말한다. 기존의 문서를 소스 코드 또는 원시 코드라 부르고, 출력되는 문서를 목적 코드라고 부른다. 목적 코드는 주로 다른 프로그램이나 하드웨어가 처리하기 용이한 형태로 출력되지만! 그 외에도 사람이 읽을 수 있는 문서 파일이나 그림 파일 등으로 옮기는 경우도 있다. 원시 코드를 목적 코드로 옮기는 과정을 컴파일(compile)이라고 한다.  원시 코드를 컴파일 하는 이유는 사람에게 이해하기 쉬운 형태의 고수준 언어를 기계가 이해하기 쉬운 기계어로 바꿔주기 위해서 이다. 좁은 의미로 컴파일러는 고수준 언어를 저수준 언어(어셈블리어, 기계어)로 번역해주는 프로그램을 말한다.

>>고수준 언어 → 저수준 언어(어셈블리어, 기계어)

Assembler?

어셈블러(assembler)어셈블리어를 기계어 형태의 오브젝트 코드로 해석해주는 컴퓨터 언어 번역 프로그램! 이다. 어셈블러는 컴퓨터 명령어들을 컴퓨터 프로세서가 기본 연산을 수행 할 수 있게 피트 패턴으로 변환시켜주는 프로그램이다.

Linker?

어셈블러를 거친 오브젝트 코드사용된 함수를 포함하고 있는 함수 라이브러리를 묶어주는 작업을 한다. 이 과정을 링킹이라 한다.

Interpreter?

인터프리터(interpreter)는 해석기라는 뜻으로 프로그래밍 언어의 소스 코드를 바로 실행하는 컴퓨터 프로그램! 또는 환경을 말한다. 원시 코드를 기계어로 번역하는 컴파일러와 다르다. 인터프리는 아래 과정 중 적어도 하나의 기능을 가진 프로그램이다.

  1. 소스 코드를 직접 실행한다. 
  2. 소스 코드를 효율적인 다른 중간 코드로 변환하고, 변환한 것을 바로 실행한다.
  3. 인터프리터 시스템의 일부인 컴파일러가 만든 미리 컴파일된 코드의 실행을 호출한다.
  4. 좁은 의미로 인터프리터는 고급언어로 작성된 원시 코드들을 한번에 한 줄씩 읽어들여서 실행하는 프로그램이다.

Compiler vs Interpreter

(1) Compiler 장점

  1. 컴파일러는 컴파일 하는 과정이 복잡하고 그 시간이 많이 걸리게 된다. 한번 컴파일 하면 그대로 사용이 가능하여 반복 작업을 할 경우 처리 시간이 매우 빠르다.
  2. 컴파일 하는 과정에서 단계별로 주기억장치안에 들어 가기 때문에 기억장소의 크기가 조정이 가능하다.
  3. 전체 실행 시간 면에서 매우 효율적이다.
  4. 컴파일러는 매번 번역할 필요가 없다. 

(2) Compiler 단점

  1. 한 줄의 입력 시 프로그램이 때론 몇 백 개의 기계어로 번역되기 때문에 그 프로그램은 큰 기억용량을 요구한다. 특히 입출력 명령은 입출력 형식을 위한 코드 외에 기계 상태 파악코드로 인해 큰 기억 장치가 요구된다.

(3) Interpreter 장점

  1. 프로그램이 될 때까지 원시 언어의 형태를 유지하기 때문에 기억 장소가 따로 필요하지 않다.

(4) Interpreter 단점

  1. 원시 프로그램을 직접 실행하기 때문에 이 실행에 필요한 소프트웨어가 항상 기계 안에 상주하면서 원시 프로그램의 명령들을 받아서 치리해야 한다. 만일 반복을 하게 되면 그때마다 원시 프로그램을 해석하고 처리해야 하기 때문에 많은 시간이 걸리기도 한다.
  2. 인터프리터의 시행 시간은 컴파일러 방법에 비해 비효율적이다.
  3. 실행순서를 맞쳐줘야한다. (실행 시간 설정을 해놔야한다.)

5) 컴파일러 언어, 인터프리터 언어 예시

 컴파일러 언어 : Fortran, Algol, PL/1, Pascal, Cobol, C, C++

 인터프리터 언어 : Lisp, Snobol4, APL, Prolog, Python

정리

 Compiler

 C 소스등을 파싱하여, Assemble 코드로 만들어주는 프로그램

 Assembler

 Assemble 코드를 Object(기계어)로 만들어주는 프로그램

 Linker

 Object 코드를 사용된 함수 라이브러리와 묶고 실행파일로 만들어주는 프로그램

 Interpreter

 어떤 대상을 타형태로 만들지 않고 바로 실행하는 프로그램

 

 

출처: https://lastmorning.tistory.com/entry/컴파일러-인터프리터-링커-어셈블러의-정의 

 3절 조인 수행 원리

 

조인이란?

두 개 이상의 테이블을 하나의 집합으로 만드는 연산SQL문에서 FROM 절에 두 개 이상의 테이블이 나열될 경우 조인이 수행조인 연산은 두 테이블 사이에서 수행된다.

조인의 종류

NL Join, Sort Merge Join, Hash Join

 

1. NL Join

NL Join 정의

두개의 테이블을 중첩된 반복문처럼 조인을 수행한다.

반복문 외부(처음 테이블)에 있는 테이블을 선행테이블 또는 외부 테이블

반복문 내부(두번째 테이블)에 있는 테이블을 후행테이블 또는 내부 테이블 이라고 부른다.

# 조인을 반복문으로 표현하면 아래와 같다.

 

for 선행 테이블 읽음            --- 다른말로---> 외부 테이블(Outer Table)

       for 후행 테이블 읽음     ---다른말로---> 내부 테이블(Inner Table)

              (선행 테이블과 후행 테이블 조인)

 

NL Join 중요사항

결과 행의 수가 적은 테이블을 선행 테이블로 선택한다.(왜냐하면 선행 결과값이 많을 경우 일량이 늘어날 수 있기 때문)

NL Join 수행 방식

1. 선행 테이블에서 조건에 맞는 값을 찾음

2. 선행 테이블의 조인 키를 가지고 후행 테이블 조인 키 확인

3. 후행 테이블의 인덱스에 선행 테이블의 조인 키 존재 확인

4. 인덱스에서 추출한 레코드 식별자를 이용하여 후행 테이블 액세스

5 ~ 11 앞의 작업을 반복 수행함

 

 

2. Sort Merge Join

Sort Merge Join 정의

Sort Merge Join은 조인 칼럼을 기준으로 데이터를 정렬하여 조인한다.

 

Sort Merge Join 특징

넓은 범위의 데이터를 처리할 때 주로 이용.

정렬 데이터가 많을 경우 성능이 떨어질 수 있다.(디스크 I/O로 인한 부하 발생)

비동등 조인에 대해서도 조인이 가능

인덱스를 사용하지 않아 인덱스가 존재하지 않을 경우에 사용할 수 있다.

 

Sort Merge Join 수행 방식

 1. 선행 테이블에서 조건에 맞는 행을 찾음.

2. 선행 테이블의 조인 키를 기준으로 정렬 작업 수행.

1 ~ 2번 작업을 반복 수행

3. 후행 테이블에서 조건에 맞는 행을 찾음.

4. 후행 테이블의 조인 키를 기준으로 정렬 작업 수행.

3 ~ 4번 작업을 반복 수행

5. 정렬된 결과를 이용하여 조인 수행 -> 결과값은 버퍼에 저장

 

 

3. Hash Join

Hash Join 정의

해싱 기법을 이용하여 조인 수행

Hash Join 특징

NL Join의 랜덤 액세스 문제점과 Sort Merge Join의 정렬 작업의 부담을 해결 위한 대안으로 사용, 조인 칼럼의 인덱스가 존재하지 않을 경우에도 사용할 수 있다"="로 수행하는 조인 즉, 동등 조인만 가능(왜냐하면 해쉬함수 이용으로..)

해쉬 테이블의 크기가 메모리에 적재할 수 있는 크기보다 커지면 디스트 사용(I/O에 따른 부하 가중해쉬 조인을 할때 결과 행의 수가 적은 테이블을 선행 테이블로 사용한다.

Hash Join 수행 방식

 

1. 선행 테이블에서 조건에 만족하는 행을 찾음.

2. 선행 테이블의 조인 키를 기준으로 해쉬 함수를 적용하여 해쉬 테이블 생성

1 ~ 2번 작업을 선행 테이블의 조건 만큼 반복

 

3. 후행 테이블에서 조건에 만족하는 행을 찾음

4. 후행 테이블의 조인 키를 기준으로 해쉬 함수를 적용하여 해당 버킷을 찾음

5. 조인에 성공하면 추출버퍼에 저장

3 ~ 5번 작업을 후행 테이블의 조건 만큼 수행

 

 

출처 : http://bysql.net/

 

1. 인덱스 특징과 종류

인덱스는 원하는 데이터를 쉽게 찾을 수 있도록 돕는 책의 찾아보기와 유사한 개념이다

Insert, Update, Delete 등과 같은 DML 작업은 테이블과 인덱스를 함께 변경해야 하기 때문에 오히려 느려질 수 있다는 단점이 존재한다.

 

인덱스에 대한 설명으로 옳은 것

  • 인덱스는 데이터 조회 목적에는 효과적이지만, insert, update, delete 작업에는 오히려 많은 부하를 줄 수 있다.
  • sql server의 클러스터형 인덱스는 oracle의 IOT와 매우 유사하다.
  • 인덱스는 insert 와 delete 작업과는 다르게 update 작업에는 부하가 없을 수도 있다.
    • >>인덱스를 구성하는 컬럼 이외의 데이터가 update될때에는 인덱스로 인한 부하가 발생하지 않는다.
  • 대량의 데이터를 조회하는 경우 인덱스를 이용한 조회보다는 테이블 전체 스캔 방식으로 조회하는 것이 더 빠를 수도 있으며 , 인덱스를 구성하는 컬럼들의 순서는 데이터 조회시 성능적인 관점에서 매우 중요한 역할을 한다.

. 트리 기반 인덱스

DBMS에서 가장 일반적인 인덱스는 B-트리 인덱스이다.

 

B-트리 인덱스 = 브랜치 블록(Branch Block)과 리프 블록(Leaf Block)

  • 브랜치 블록 중에서 가장 상위에서 있는 블록을 루트 블록(Root Block)
  • 브랜치 블록은 다음 단계의 블록을 가리키는 포인터를 가지고 있다.
  • 리프 블록은 트리의 가장 아래 단계에 존재한다.
  • 리프 블록은 인덱스를 구성하는 칼럼의 데이터와 해당 데이터를 가지고 있는 행의 위치를 가리키는 레코드 식별자(RID, Record    Identifier/Rowid)로 구성(****)
  • 인덱스 데이터는 인덱스를 구성하는 칼럼의 값으로 정렬된다.
  • 만약 인덱스 데이터의 값이 동일하면 레코드 식별자의 순서로 저장된다.
  • 리프 블록은 양방향 링크(Double Link)를 가지고 있다.(****)
  • 이것을 통해서 오름 차순(Ascending Order)과 내림 차순(Descending Order) 검색을 쉽게 할 수 있다.
  • B-트리 인덱스는 ‘=’로 검색하는 일치(Exact Match) 검색 ‘BETWEEN’, ‘>’ 등과 같은 연산자로 검색하는 범위(Range) 검색 모두에 적합한 구조

 : 브랜치 브록이 3개의 포인터로 구성된 B-트리 인덱스의 예이다

1단계. 브랜치 블록의 가장 왼쪽 값이 찾고자 하는 값보다 작거나 같으면 왼쪽 포인터로 이동

2단계. 찾고자 하는 값이 브랜치 블록의 값 사이에 존재하면 가운데 포인터로 이동

3단계. 오른쪽에 있는 값보다 크면 오른쪽 포인터로 이동, 이 과정을 리프 블록을 찾을 때까지 반복한다.

 

 

 :

-  1개의 값을 찾을 경우 : 37을 찾을 경우

-  구간값을 찾을 경우 : 37 50사이의 모든 값을 찾고자 한다면(BETWEEN 37 AND 50)

 

Oracle에서 트리 기반 인덱스에는 B-트리 인덱스 외에도 비트맵 인덱스(Bitmap Index),리버스 키 인덱스(Reverse Key Index), 함수기반 인덱스(FBI, Function-Based Index) 등이 존재

 

Bitmap 인덱스

  • Null 저장
  • 부정형 조건 사용 시에도 Scan 가능
  • Random Access 의 Cost 는 B-Tree 와 큰 차이 없음(Index block scan 만 줄어듬)
  • 여러 Bitmap Index 를 동시에 사용하기 쉬움(Bitmap Index Merge)
  • 하나의 인덱스 키 엔트리가 많은 행에 대한 포인터를 저장하고 있는 구조

활용방안

  • Distinct value 의 개수가 적은 컬럼일 때 저장 효율 높음
  • 대용량 데이터 검색 성능 향상
  • 비 정형(ad-hoc) 쿼리 많을 때 적합(***)
  • 변경(DML) 작업 시 동일 Bitmap 범위의 모든 레코드에 Lock
  • 일반적으로 DW 환경에 적합(***)

Reverse Key 인덱스

  • B-Tree 와 유사하나 Leaf 의 Key 값이 글자 역순
  • reverse(column) 함수 적용하여 인덱스 생성 한 것과 같음

활용방안

  • Right Growing 현상으로 Insert 시 동일 인덱스 블록에 대한 경합 심할 때 사용 시 효율적
  • = 조건 입력시만 사용 가능함 - 데이터의 '의미' 적인 부분이 없어지므로 (hash 함수 적용시와 유사)

 

 

나. SQL Server의 클러스터형 인덱스

SQL Server의 인덱스 종류 저장 구조에 따라 클러스터형(clustered) 인덱스와 비클러스터형(nonclustered) 인덱스로 나뉜다.

 

클러스터형 인덱스

(첫째)

인덱스의 리프 페이지가 곧 데이터 페이지(***). 따라서 테이블 탐색에 필요한 레코드 식별자가 리프 페이지에 없다

(인덱스 키 칼럼과 나머지 칼럼을 리프 페이지에 같이 저장하기 때문에 테이블을 랜덤 액세스할 필요가 없다).

클러스터형 인덱스의 리프 페이지를 탐색하면 해당 테이블의 모든 칼럼 값을 곧바로 얻을 수 있다.(***)

 

(둘째) 

리프 페이지의 모든 로우(=데이터)는 인덱스 키 칼럼 순으로 물리적으로 정렬되어 저장(***)된다.

테이블 로우는 물리적으로 한 가지 순서로만 정렬될 수 있다.

그러므로 클러스터형 인덱스는 테이블당 한 개만 생성할 수 있다.

 

 : Employee ID, Last Name, First Name, Hire Date로 구성된 Employees 테이블에 대해 Employee ID에 기반한 클러스터형 인덱스 B-트리 구조를 편의상, 삼각형 모양을 왼쪽으로 90도 돌려서 나타냈다.

 

2. 전체 테이블 스캔과 인덱스 스캔

가. 전체 테이블 스캔

전체 테이블 스캔 방식으로 데이터를 검색한다는 것은 테이블에 존재하는 모든 데이터를 읽어 가면서 조건에 맞으면 결과로서 추출하고 조건에 맞지 않으면 버리는 방식으로 검색한다.

Oracle

그림 -3-9와 같이 검색 조건에 맞는 데이터를 찾기 위해서 테이블의 고수위 마크(HWM, High Water Mark) 아래의 모든 블록을 읽는다. 고수위 마크는 테이블에 데이터가 쓰여졌던 블록 상의 최상위 위치(현재는 지워져서 데이터가 존재하지 않을 수도 있음)를 의미한다.

 

- 참고 HWM : http://jinh2004.blog.me/80110801303

 

전체 테이블 스캔 방식으로 데이터를 검색할 때 고수위 마크까지의 블록 내 모든 데이터를 읽어야 하기 때문에 모든 결과를 찾을 때까지 시간이 오래 걸릴 수 있다. 이와 같이 전체 테이블 스캔 방식은 테이블에 존재하는 모든 블록의 데이터를 읽는다. 그러나 이것은 결과를 찾기 위해 꼭 필요해서 모든 블록을을 읽은 것이다. 따라서 이렇게 읽은 블록들은 재사용성이 떨어진다. 그래서 전체 테이블 스캔 방식으로 읽은 블록들은 메모리에서 곧 제거될 수 있도록 관리된다.

 

옵티마이저가 연산으로서 전체 테이블 스캔 방식을 선택하는 이유는 일반적으로 다음과 같다.

  1. SQL문에 조건이 존재하지 않는 경우 : SQL문에 조건이 존재하지 않는다는 것은 테이블에 존재하는 모든 데이터가 답이 된다는 것이다
  2. SQL문의 주어진 조건에 사용 가능한 인덱스가 존재하는 않는 경우 : 또한 주어진 조건에 사용 가능한 인덱스는 존재하나 함수를 사용하여 인덱스 칼럼을 변형한 경우에도 인덱스를 사용할 수 없다.
  3. 옵티마이저의 취사 선택 : 조건을 만족하는 데이터가 많은 경우, 결과를 추출하기 위해서 테이블의 대부분의 블록을 액세스해야 한다고 옵티마이저가 판단하면, 조건에 사용 가능한 인덱스가 존재해도 전체 테이블 스캔 방식으로 읽을 수 있다.
  4. 그 밖의 경우 : 병렬처리 방식으로 처리하는 경우 또는 전체 테이블 스캔 방식의 힌트를 사용한 경우

 

나. 인덱스 스캔

  • 인덱스의 리프 블록은 인덱스 구성하는 칼럼과 레코드 식별자로 구성되어 있다.
  • 따라서 검색을 위해 인덱스의 리프 블록을 읽으면 인덱스 구성 칼럼의 값과 테이블의 레코드 식별자를 알 수 있다.
  • 인덱스는 인덱스 구성 칼럼의 순서로 정렬되어 있다. 인덱스의 구성 칼럼이 A+B라면 먼저 칼럼 A로 정렬되고 칼럼 A의 값이 동일할 경우에는 칼럼 B로 정렬된다. 그리고 칼럼 B까지 모두 동일하면 레코드 식별자로 정렬된다.
  • 인덱스가 구성 칼럼으로 정렬되어 있기 때문에 인덱스를 경유하여 데이터를 읽으면 그 결과 또한 정렬되어 반환된다따라서 인덱스의 순서와 동일한 정렬 순서를 사용자가 원하는 경우에는 정렬 작업을 하지 않을 수 있다. 
    1. 인덱스 유일 스캔은 유일 인덱스(Unique Index)를 사용하여 단 하나의 데이터를 추출하는 방식이다.
      1. 유일 인덱스는 중복을 허락하지 않는 인덱스이다.
      2. 유일 인덱스 구성 칼럼에 모두 '='로 값이 주어지면 결과는 최대 1건이 된다.
    2. 인덱스 범위 스캔은 인덱스를 이용하여 한 건 이상의 데이터를 추출하는 방식이다.
      1. 유일 인덱스의 구성 칼럼 모두에 대해 ‘=’로 값이 주어지지 않은 경우와
      2. 비유일 인덱스(Non-Unique Index)를 이용하는 모든 액세스 방식은 인덱스 범위 스캔 방식으로 데이터를 액세스하는 것이다.
    3. 인덱스 역순 범위 스캔은 인덱스의 리프 블록의 양방향 링크를 이용하여 내림 차순으로 데이터를 읽는 방식이다.
      1. 이 방식을 이용하여 최대값(Max Value)을 쉽게 찾을 수 있다. 이 또한 인덱스 범위 스캔의 일종이다.
    4. 기타방식들 - 인덱스 전체 스캔(Index Full Scan), 인덱스 고속 전체 스캔(Fast Full Index Scan), 인덱스 스킵 스캔(Index Skip Scan)

다. 전체 테이블 스캔과 인덱스 스캔 방식의 비교

  • 데이터를 액세스하는 방법은 크게 두 가지로 나눠 볼 수 있다. 인덱스를 경유해서 읽는 인덱스 스캔 방식과 테이블의 전체 데이터를 모두 읽으면서 데이터를 추출하는 전체 테이블 스캔 방식이다.
  • 인덱스 스캔 방식은 사용 가능한 적절한 인덱스가 존재할 때만 이용할 수 있는 스캔 방식이지만 전체 테이블 스캔 방식은 인덱스의 존재 유무와 상관없이 항상 이용 가능한 스캔 방식이다.
  • 옵티마이저는 인덱스가 존재하더라도 전체 테이블 스캔 방식을 취사 선택할 수 있다.

인덱스 스캔은 인덱스에 존재하는 레코드 식별자를 이용해서 검색하는 데이터의 정확한 위치를 알고서 데이터를 읽는다. 한번의 I/O 요청에 한 블록씩 데이터를 읽는다.

 

전체 테이블 스캔은 테이블의 모든 데이터를 읽으면서 원하는 데이터를 찾아야 하기 때문에 비효율적인 검색을 하게 된다반대로 테이블의 대부분의 데이터를 찾을 때는 한 블록씩 읽는 인덱스 스캔 방식 보다는 어차피 대부분의 데이터를 읽을 거라면 한번에 여러 블록씩 읽는 전체 테이블 스캔 방식이 유리할 수 있다.

 

 

출처 : http://bysql.net/

 

+ Recent posts