분류 전체보기

SQL Tuning

[MSSQL] 인덱스란?

인덱스의 개념을 설명할 때 가장 쉬운 것은 책의 예를 드는 것이다. 예를 들어, 자바 프로그래밍 이론에 관련된 책을 보고 있다고 가정하자. 책에서 "객체지향언어" 라는 단어를 찾으려고 한다면 어떻게 할 것인가? 물론 첫페이지 부터 끝페이지까지 다 읽어 나가면서 찾을 수 있지만, 책의 제일 뒤에 있는 를 이용하면 더 빠르게 찾을 수 있을 것이다. 페이지는 가,나,다 순서로 정렬되어 있어서 "객체지향 언어"라는 단어를 쉽게 찾을 수 있다. 인덱스를 만들지 않아도 테이블의 컬럼의 수 자체가 작은 경우에는 성능에는 별 문제가 되지 않았다. 책으로 치면 2~3 페이지 분량의 책이어서 가 없어도 별 불편이 없는 것과 마찬가지다. 하지만, 수천페이지의 책의 경우는 가 없다면 책에서 특정 키워드 하나를 찾는데 몇 시간..

DB ARCHITECTURE

교착상태 - DEAD LOCK

교착 상태(deadlock)이란 두 개 이상의 프로세스가 서로를 차단하고 있는 상태를 말한다. 위의 그림은 일반적인 교착상태의 예제이다. 작업 T1은 리소스 R1에 대한 잠금을 가지며(R1 -> T1) 리소스 R2에 대한 잠금을 요청했다.(R2 -> T2) 작업 T2는 자원 R2에 대한 잠금을 가지며 자원 R1에 대한 잠금을 요청했다. 두 작업은 자원이 사용 가능할 때까지 계속 수행 할 수 없으며 Task가 계속 될 때까지 자원을 해제 할 수 없기 때문에 교착상태가 존재한다. SQL Server DBMS 는 SQL Server 내에서 교착 상태 사이클을 자동으로 감지한다. 특별한 설정을 하지 않는다면 데이터 베이스 엔진이 가장 일을 적게 한 프로세스를 선택해서 중지 시키는데, 그 프로세스의 트랜잭션에서작..

DB ARCHITECTURE

[MSSQL] 격리수준-낙관적 동시성

SQL Server 에서는 "낙관적 동시성(optimistic concurrency)"을 기반으로 하는 두 가지 격리 수준도 제공하고 있다. 1) SNAPSHOT 2) READ COMMITTED SNAPSHOT **행버전 관리를 이용하는 격리 수준 SQL Server에는 커밋된 행들의 이전 버전을 tempdb 에 보관하는 기능이 있다. SQL Server에서는 이러한 행 버전 관리 기술을 기반으로 SNAPSHOT 과 READ COMMITTED SNAPSHOT 이라고 하는 두 가지 격리 수준을 제공한다. SNAPSHOT 격리 수준은 논리적으로는 일관성 문제가 발생하지 않는다는 점에서 SERIALIZABLE 격리 수준과 유사하다. 또한, READ COMMITTED SNAPSHOT 격리 수준은 READ COM..

DB ARCHITECTURE

[MSSQL] 격리수준 - 비관적 동시성

SQL Server에서는 기본적으로 "비관적 동시성(pessimistic concurrency)"을 기반으로 하는 네 가지 형태의 격리 수준을 제공한다 1) READ UNCOMMITED 2) READ COMMITED(On-premises SQL Server의 기본값 ) 3) REPEATABLE READ 4) SERIALIZABLE 1) READ UNCOMMITED READ UNCOMMITTED은 가장 낮은 수준의 격리 수준이다. 이 격리 수준에서는 읽기 작업은 공유 잠금(S-LOCK)을 요청하지 않는다. 읽기 작업에서 공유 잠금(S-LOCK)을 요청하지 않기 때문에 배타적 잠금(X-LOCK)을 유지하고 있는 쓰기 작업과 충돌이 발생하지는 않는다. 이는 읽기 작업에서는 커밋되지 않는 변경사항(dirty r..

DB ARCHITECTURE

[MSSQL] 격리수준

격리 수준은 데이터를 읽고 쓰는 동시 사용자들의 동작을 결정하는 역할을 한다. 읽기 작업이란, 기본적으로 공유 잠금을 이용해서 데이터를 조회(SELECT)하는 모든 구문을 말한다. 쓰기 작업이란, 테이블에 대해 변경(INSERT,UPDATE,DELETE)을 하며 배타적 잠금을 필요로 하는 모든 구문을 말한다. 쓰기 작업에 대한 동작에서 필요로 하는 잠금과 잠금 지속 시간 등에 대해서는 조절을 할 수 없다. 하지만, 읽기 작업에 대해서는 조절이 가능하다. 또한 읽기 작업의 동작을 조절하게 되면 쓰기 동작에도 간접적인 영향을 미칠 수 있다. 이러한 작업을 격리 수준의 설정을 통해 할 수 있다. 격리 수준 설정은 세션 옵션을 이용해서 세션 수준에서 할 수도 있고, 테이블 힌트를 이용해서 쿼리 수준에서 할 수도..

DB ARCHITECTURE

[MSSQL] LOCK

1. 잠금(LOCK) 잠금(lock)이란 다른 트랜잭션에 의한 충돌이나 불완전한 접근을 방지하면서, 데이터를 보호하기 위해 트랜잭션이 소유하는 관리 리소스를 말한다. 2. 잠금 모드와 호환성 트랜잭션과 동시성을 이해하기 위해서는 두 가지 잠금 모드인 배타적(exclusive) 모드와 공유(shared) 모드에 익숙해져야 한다. 데이터를 변경하는 경우(INSERT,UPDATE,DELETE) 트랜잭션의 수준에 상관없이 데이터 리소스에 대해 배타적 잠금(X-LOCK)을 요청하게 된다. 요청이 승인되면 배타적 잠금은 트랜잭션이 끝날 때까지 유지된다. 단일 구문 트랜잭션에서는 잠금이 하나의 구문이 수행완료 될 때까지만 유지되며, 여러 구문으로 된 트랜잭션에서는 모든 구문이 완료된 후 트랜잭션이 COMMIT TRA..

DB ARCHITECTURE

트랜잭션의 정의 및 동작 원리

1. 트랜잭션(Transaction)의 정의 "트랜잭션(Transaction)" 이란, 작업 단위를 말하며, 여기에는 데이터를 쿼리하고 변경하는 다양한 작업뿐만 아니라 데이터의 정의를 변경하는 작업도 포함된다. "트랜잭션(Transaction)"의 개념을 쉽게 풀어보면 "하나의 논리적 단위로 수행되는 일련의 작업" 이라고 볼 수 있다. 이 의미에서 "전부 되거나, 전부 안되거나"의 의미가 포함되어 있다. 트랜잭션의 경계는 명시적으로 지정할 수도 있고, 암시적으로 지정할 수도 있다. 명시적으로는 트랜잭션이 시작되는 부분에 BEGIN TRAN (Begin Transaction) 구문을 사용해서 정의한다. 명시적으로 트랜잭션의 마지막 부분에서는 해당 트랜잭션이 정상적으로 처리가 되었다고 확인되면 COMMIT ..

DB ARCHITECTURE

SQL-SERVER SCHEDULER : sqlserver 스케쥴러(2)

앞에서 스케줄러를 구성하는 컴포넌트에 대하여 알아보았다. 그러면 이제 클라이언트로부터 받은 쿼리를 처리할 때 스케줄러와 작업자가 어떻게 동작하는 지를 순서대로 확인해보자. 흐름의 포인트 CPU의 사용권을 다른 작업자에게 양보하고, 자신은 리소스를 획득할 때 까지 대기 상태가 된다는 것이다. (1) 클라이언트가 SQL 서버에 접속하면 어느 하나의 스케줄러와 링크 된다. (2-1) 클라이언트는 처리를 실행하기 위해 작업자가 필요하다. (2-2) 작업자 스레드 풀에서 사용 가능한 작업자가 존재하는지 확인한다. (2-3) 작업자가 있다면 클라이언트와 작업자를 바인드한다. (3-1) 처리를 실행하기 위해서는 CPU 리소스를 할당 받아야 한다. (3-2) 작업자 A는 러너블 큐에 추가된다. (4-1) 러너블 큐의 ..

DB ARCHITECTURE

SQL-SERVER SCHEDULER : sqlserver 스케쥴러(1)

SQL 서버 내에서 발생하는 대기 상태는 수많이 존재한다. SQL 서버가 비교적 작은 규모로 사용되고 있는 경우는각각의대기 시간을 짧아 크게 문제가 되는 일은 없다. 그러나 SQL 서버가 보다 큰 사이즈의 데이터베이스를 관리하고 보다 많은 클라이언트의 리퀘스트를 효율적으로 처리하기 위해서는 모든 스레드의 스케줄러 관리를 윈도우 스케줄러에만 맡길 게 아니라 DBMS 자체의 컴포넌트를 사용하게된다. SQLOS 스케줄러 SQLOS 스케줄러는 SQL 서버라는 애플리케이션 내부의 컴포넌트이다. SQL 서버는 윈도우 하에서 동작하는 애플리케이션이므로 여전히 윈도우 스케줄러의 지배하에 있다. 윈도우 스케줄러의 지배하에 있으면서 효율적으로 CPU 리소스를 사용케 하는 장치가 SQLOS 스케줄러이다. SQLOS 스케줄러..

DB ARCHITECTURE

SQL-SERVER SCHEDULER : 윈도우 스케쥴러

윈도우 스케쥴러(Windows Scheduler) 란? 윈도우 스케줄러(Windows Scheduler)는 운영 체제 수준에서 프로세스와 스레드의 스케줄링을 담당한다. 이는 CPU 리소스의 할당과 관리, 실행 우선순위 조정, 작업 조율 등을 처리하는 역할을 한다. 윈도우 스케줄러는 다중 작업 환경에서 CPU 사용을 조절하여 여러 프로세스와 스레드가 적절한 시간에 실행될 수 있도록 보장한다. SQL 서버는 멀티 스레드로 동작하는 애플리케이션이다. SQL 서버가 동작하면 하나의 인스턴스 별로 하나의 프로세스가 윈도우상에 생성된다. 생성된 SQL 서버 프로세스는 쿼리의 실행과 같은 다양한 작업을 처리하기 위해 내부적으로 많은 스레드를 생성한다. SQL 서버 프로세스에 의해서 내부적으로 생성된 모든 스레드는 [..

ssh9308
'분류 전체보기' 카테고리의 글 목록 (19 Page)