오라클피부과
article thumbnail

SQL 처리과정을 알기 전 먼저 알아야 할 것...

트랜잭션(Transaction)

- 더 이상 분할할 수 없는 최소 수행 단위

- 한 개 이상의 DML로 이루어지며, 어떤 기능 한 가지를 수행하는 SQL문 덩어리이다.

- 트랜잭션은 TCL, DDL 명령어를 사용하는 시점에서 끝나며, 새로운 트랜잭션이 시작된다.

 

세션(Session)

- 데이터베이스 접속을 시작으로, 여러 작업을 수행한 후 접속 종료까지의 전체 기간을 의미한다.

- 서버 프로세스와 유저 프로세스 간 연결이 맺어져 있는 기간으로도 정의되며, 사용자가 초기에 데이터베이스에 연결하면 세션이 맺어지고 사용자가 데이터베이스와 연결을 끊으면 세션은 종료가 된다.

- 하나의 세션 안에는 여러 트랜잭션이 들어갈 수 있다.

- 세션이 여러 개라는 것은 현재 DB에 여러 사용자가 동시에 접속 중이거나, 한 사용자가 여러 연결을 맺고 있다는 의미로 해석할 수 있다.

 

트랜잭션과 세션의 관계

- 트랜잭션은 DML이 모인 하나의 작업 단위를 뜻하며, 세션은 접속부터 종료까지의 큰 범위로 세션 내부에는 하나 이상의 트랜잭션이 존재한다.

- 세션이 트랜잭션보다 더 큰 단위이며, 이 세션이 유지되는 동안 여러 COMMIT, ROLLBACK 작업이 진행된다.


프로세스(Process)

- DB 서버와의 실제 처리를 담당하는 실행 단위로 이해할 수 있으며, 오라클에서 프로세스는 크게 유저 프로세스(User Process)와 서버 프로세스(Server Process)로 구분한다.

 

1. 유저 프로세스(User Process)

    (1) 사용자가 쿼리를 실행하기 위해 사용하는 프로그램(ex. TOAD, DBeaver )을 의미한다.

    (2) DB 서버에 연결을 요청하면 유저 프로세스가 생성된다.

    (3) 오라클 서버와 직접 통신(ex. 인스턴스 영역을 직접 다룸)을 하지는 않고, 서버 프로세스에 요청을 전달하는 역할을 한다.

 

2. 서버 프로세스(Server Process)

    (1) 오라클 서버와 직접 통신하여 작업을 수행한다.

    (2) 유저 프로세스가 전달한 쿼리를 실행하고, 그 결과를 다시 유저 프로세스에 전달한다.

    (2) 세션을 설정할 때 새롭게 시작되며, 실제 DB 연산을 담당한다.

    (3) 서버 프로세스는 전용 서버(Dedicated Server) 방식과 공유 서버(Shared Server) 방식으로 구성될 수 있다.

 

전용서버(녹색), 공유서버(파란색) 설명과 아래 그림을 번갈아 읽으시오...

1) 전용 서버(Dedicated Server) 방식

- 일대일 접속 방식으로 유저 프로세스에게 요청이 올때 마다 서버 프로세스를 새로 생성해서 연결하고 요청/응답하고 제거하는 방식

유저 프로세스 연결 요청: 사용자가 DB에 접속하기 위해, 리스너(Listener)에게 연결을 요청한다.

Listener가 서버 프로세스 생성: 리스너는 새로 들어온 연결 요청을 위해 전용 서버 프로세스를 생성하고, 이 프로세스에서 사용할 PGA 메모리를 할당한다.

유저 프로세스와 전용 서버 프로세스 연결: 생성된 전용 서버 프로세스와 사용자 프로세스가 일대일로 매핑되어 연결이 이루어진다. , 각 사용자마다 독립적인 서버 프로세스를 하나씩 갖게 되어 서버 프로세스와 바로 통신할 수 있다.

SGA 접근 및 작업 수행: 유저 프로세스가 SQL문을 전송하면, 전용 서버 프로세스가 요청을 받아서 SGA DB 파일에 접근해 필요한 작업을 수행한다.

작업 결과 반환: 전용 서버 프로세스는 처리된 결과나 메시지를 유저 프로세스에게 직접 응답한다.

2) 공유 서버(Shared Server) 방식

- n:m 방식으로 하나의 서버 프로세스를 여러 사용자 세션이 공유하는 방식, 미리 여러 개의 프로세스를 띄워놓고 이를 공유해서 재사용한다

유저 프로세스 연결 요청: 사용자가 DB에 접속하려고 하면, 먼저 리스너에게 연결 요청을 한다.

리스너가 Dispatcher로 연결 지시: 리스너는 새로 들어온 연결을 디스패처(Dispatcher) 프로세스로 안내한다. 유저 프로세스는 이 디스패처가 열어 둔 포트(ex. 2009 포트)로 접속하게 된다. 디스패처는 해당 포트에 여러 사용자 연결을 동시에 받아들인다.

사용자 프로세스 연결: 사용자는 디스패처와만 연결되며, 이 디스패처가 작업 요청들을 모아서 요청 큐에 넣는다.

공유 서버 프로세스가 작업 수행: 인스턴스에는 여러 개의 공유 서버 프로세스가 대기 중이다. 공유 서버 프로세스 중 하나가 요청 큐에서 작업을 가져와 처리하고, 그 결과를 응답 큐에 넣는다.

디스패처가 결과를 사용자에게 전송: 디스패처는 응답 큐에 있는 결과를 받아서 유저 프로세스에게 전달한다.

 

전용 서버(Dedicated Server) 방식의 특징

특징

-  사용자 세션마다 전용 서버 프로세스가 배정되므로, 많은 사용자가 동시에 접속하면 그만큼 프로세스(또는 스레드)가 많이 생길 수 있다.

-  각 세션별로 독립된 서버 프로세스를 사용하기 때문에 설정이 비교적 쉽고, 세션 간 간섭이 적다.

-  세션이 매우 많은 환경에서는 프로세스 수가 기하급수적으로 늘어나므로 메모리나 CPU 같은 자원 사용이 많아질 수 있다.

-  OLTP 및 일반적인 운영 환경에서 가장 많이 사용하는 방식이다.

-  연결이 종료되면 서버 프로세스도 종료(또는 캐싱/재사용)된다.

장점

-  각 사용자마다 독립된 서버 프로세스가 있으므로, 대기 없이 작업을 수행할 수 있고 한 세션이 과부하가 걸려도 다른 세션에 영향을 주는 정도가 상대적으로 적다.

-  구조가 직관적이고 구성 설정이 비교적 쉽다.

-  트러블슈팅 시 어떤 프로세스가 어느 세션을 담당하는지 명확히 파악할 수 있어 대응하기에 유리하다.

단점

-  사용자 수가 많아지면 서버 프로세스도 비례해서 늘어나므로, 자원(메모리, CPU ) 소비가 크다.

-  사용자가 실제로 작업하지 않더라도 서버 프로세스는 계속 존재하며 리소스를 점유하게 되는 문제가 발생할 수 있다.

-  대규모 동시 접속 환경에서는 서버 리소스가 급증한다(*SQL을 수행할 때마다 연결 요청을 반복하면 서버 프로세스의 생성과 해제도 반복하게 되므로 DBMS에 큰 부담이 된다. 따라서 전용 서버 방식을 사용하는 OLTP성 애플리케이션에서는 Connection Pooling 기법을 사용해야 한다.).

 

공유 서버(Shared Server) 방식의 특징

특징

- 여러 사용자 세션(N)이 소수(m)개의 서버 프로세스를 공유해 DB 작업을 처리한다.

-  많은 세션이 있어도 서버 프로세스 수가 제한적이므로, 자원 사용이 상대적으로 효율적이다.

-  디스패처, 요청 큐, 응답 큐를 통해 사용자 요청이 전달되고 결과가 반환되기 때문에 구조가 다소 복잡하다.

-  적은 서버 자원으로 많은 세션 처리가 가능하다. 대규모 동시 접속(특히 접속은 많지만 실제로 처리되는 트랜잭션량이 상대적으로 적은 경우)에 유리하다.

-  여러 세션이 서버 프로세스를 공유하므로, PGA도 상대적으로 공유될 수 있는 부분이 존재한다(UGA ).

장점

-  서버 프로세스가 세션마다 늘어나지 않으므로, 사용자 수가 매우 많을 때도 자원을 상대적으로 덜 사용한다. 특히 세션별로 빈번히 사용하지 않는 상황(가벼운 쿼리 요청이 많은 상황)에 효율적이다.

-  여러 사용자가 동시에 사용하므로, 한쪽이 쉬더라도 다른 사용자에게 프로세스가 유연하게 할당된다.

-  많은 사용자 접속이 가능한 환경에서 효과적이다.

단점

-  요청이 몰리면 큐에서 대기해야 하므로, 전용 서버보다 즉각 응답이 늦어질 수 있다. 또한 특정 세션의 긴 쿼리가 공유 서버 프로세스 하나를 오래 점유하면, 다른 사용자 요청들이 대기해야 하는 상황이 생길 수 있다.

-  디스패처, , Shared Server 프로세스 간의 구조가 전용 서버에 비해 복잡하다.

 

서버 방식 선택 기준 및 활용 방안

1) 전용 서버

- 전통적인 OLTP 환경, 또는 세션 수가 상대적으로 적으면서도 요청이 많은 환경에서 주로 사용한다.

- 대규모 트랜잭션 처리가 필요하지만 접속자가 많지 않은 서비스나, 안정적으로 트랜잭션을 처리해야 하는 곳(각 세션의 중요도가 높을 때)에 적합하다.

2) 공유 서버

- 동시에 접속하는 세션 수가 매우 많고, 각 세션의 실제 쿼리나 트랜잭션 양은 그리 크지 않은 환경에 적합하다(ex. 웹 서비스에서 수많은 사용자가 접속하지만 가벼운 요청 위주로 사용).

- 서버의 자원이 한정적일 때, 많은 세션을 수용해야 하는 경우에 효율이 높아진다.

- 구성은 조금 복잡하지만, 메모리 사용량과 프로세스 수를 줄여 고정 자원 안에서, 최대 동시 접속자를 처리할 수 있다.

 

※ Dispatcher : 스케줄러에서 다음에 수행될 서버 프로세스를 선택하여 유저 프로세스의 요청이 수행될 수 있도록 기동하는 일을 수행한다 (사용되지 않는 서버 프로세스를 찾아주는 역할을 한다)

※ Listener : 유저 프로세스의 접속 요구 시 Dispatcher에게 연결해주는 안내자와 같은 역할

접속 요청시 Listener는 요구사항을 검사하고 Dispatcher의 사용여부를 결정하여 사용 가능시 Dispatcher의 주소를 돌려준다

 

 

hang과 lock에 대해서도 다루겠음

profile

오라클피부과

@피부과 코딩네이터

포스팅이 좋았다면 "좋아요❤️" 또는 "구독👍🏻" 해주세요!