https://www.acmicpc.net/problem/14442 14442번: 벽 부수고 이동하기 2 첫째 줄에 N(1 ≤ N ≤ 1,000), M(1 ≤ M ≤ 1,000), K(1 ≤ K ≤ 10)이 주어진다. 다음 N개의 줄에 M개의 숫자로 맵이 주어진다. (1, 1)과 (N, M)은 항상 0이라고 가정하자. www.acmicpc.net 이번문제는 벽 부수기 문제의 응용버전으로 이번에는 벽을 주어진 횟수만큼 부수고 이동할 경우에 미로탐색을 하여 최단거리를 구해주는 문제이다. 이번 문제도 기본적으로는 BFS(Breadth-First Search) 를 사용하여 해결할 수 있다. 이번에는 미로탐색1 문제에서의 로직을 사용해도 되지만 조금 변형해서 사용해보자. 1. 미로의 map (행렬)을 만들어 탐색..
북마크 룩업에 의한 성능 문제를 해결하는 방법 중 하나가 해당되는 컬럼 자체를 클러스터형 인덱스로 만들어주는 것이다. 모든 인덱스를 클러스터형 인덱스로 만들면 좋겠지만, 클러스터형 인덱스는 테이블당 한개만 만들 수 있다. 그렇다면, 이미 클러스터형 인덱스가 존재하는 상태에서 넓은 범위를 액세스하는 또 다른 검색 조건이 성능 문제를 일으킨다면 어떻게 해결해야 할까? 해당 검색조건이 자주 사용되고 빠른 성능을 요구한다면, 북마크 룩업이 아예 발생하지 않도록 필요한 컬럼을 인덱스에 모두 포함하는 방법을 고려할 수 있다. 이 처럼 쿼리 수행에 필요한 컬럼이 모두 포함된 인덱스를 '커버된 인덱스'(Covered index) 라고 부른다. 커버드인덱스를 실습하기 위해서 기존에 테이블의 인덱스를 모두 지워주고 새로운..
인덱스를 효율적으로 액세스하더라도 테이블 랜덤 액세스에 의한 부하가 심각하다면, 해당 인덱스를 클러스터형 인덱스(Clustered Index)로 변경하는 방법을 고려할 수 있다. 클러스터형 인덱스는 인덱스 키 컬럼과 나머지 컬럼을 리프페이지에 같이 저장하기 때문에 테이블 랜덤 액세스를 획기적으로 줄일 수 있다. 단, 클러스터형 인덱스는 넌클러스터형 인덱스의 효율성에 큰 영향을 미치므로 테이블 전체적인 관점에서 사용 여부를 결정해야한다. 좀더 자세한 실습을 위해 기존에 만들어 두었던 인덱스를 제거해보자. 또한 새로운 인덱스는 ibsaDate 컬럼(입사한 날짜)에 걸어주어 WHERE 절에 해당 조건을 필터링 하여 쿼리해보자. DROP INDEX IDX__TBLINSATEST__BUSEO__JIKWI ON d..
https://www.acmicpc.net/problem/2206 2206번: 벽 부수고 이동하기 N×M의 행렬로 표현되는 맵이 있다. 맵에서 0은 이동할 수 있는 곳을 나타내고, 1은 이동할 수 없는 벽이 있는 곳을 나타낸다. 당신은 (1, 1)에서 (N, M)의 위치까지 이동하려 하는데, 이때 최단 경로 www.acmicpc.net 이번문제는 BFS(Breadth-First Search) 를 사용하여 해결하는 미로탐색 알고리즘의 응용 문제이다. 일단 위의 문제를 푸는 로직은 아래와 같다. 1. 미로의 map (행렬)을 만들어 탐색을 수행한다. 2. 미로와 같은 행렬의 크기인 새로운 행렬 visit(방문확인 행렬) 을 생성한다. 단, 해당 방문행렬의 요소들은 처음부터 모두 정수의 최대값으로 초기화 시켜..
북마크 룩업(Bookmark Lookup) 이란, 인덱스 엔트리에 저장된 rid 값으로 테이블 로우를 액세스하는 오퍼레이션이다. 만약 클러스터형 인덱스가 있다면 RID LOOKUP 값 대신 클러스터형 인덱스의 키 값으로 테이블 로우를 찾아가는데(KEY LOOKUP), 이것도 넓게 보면 북마크 룩업이라고 할 수 있다. 북마크 룩업은 랜덤 액세스 방식으로 수행되며 SQL 성능에 큰 영향을 미친다. 필요한 페이지가 메모리 풀의 '버퍼 캐시'에 모두 있더라도, 랜덤 액세스 횟수가 증가하면 SQL 성능은 떨어질 수밖에 없다. 필요한 페이지가 버퍼 캐시에 하나도 없는 경우가 최악인데, 이때는 랜덤 액세스 횟수만큼 물리적 디스크 I/O 가 발생할 수 있다. 아래의 예시를 보면서 이해해보자.(TBLINSATEST 테이..
sql server 로 코딩을 하다보면 간혹 어떤 데이터의 값들을 특정한 기호로 나눠야 하는 경우가 생긴다. 이럴경우 로직단에서 나눠줘서 작업을 해도 상관없지만, db 단에서 작업을 하여 정리한다음에 로직단에 넘겨서 로직을 깔끔하게 정리 할 수 있다. 이럴 경우에 STRING_SPLIT 함수를 사용할 수 있다. STRING_SPLIT 함수는 지정된 구분 기호 문자에 따라 문자열을 부분 문자열의 행으로 분할하는 테이블 반환 함수이다. STRING_SPLIT 에 대한 상세설명은 아래를 참고바란다. https://docs.microsoft.com/ko-kr/sql/t-sql/functions/string-split-transact-sql?view=sql-server-ver15 STRING_SPLIT(Trans..
DB 버퍼 캐시는 데이터 파일로부터 읽어 들인 데이터 페이지 (또는 인덱스 페이지)를 담는 캐시 영역이다. 일부 Direct Path Read 메커니즘이 작동하는 경우를 제외하면, 모든 페이지 읽기는 버퍼 캐시를 통해 이루어진다. 즉, 읽고자 하는 페이지를 먼저 버퍼 캐시에서 찾아보고 없을 때 디스크에서 읽는다. 디스크에서 읽을 때도 먼저 버퍼 캐시에 적재한 후에 읽는다. 데이터 변경도 버퍼 캐시에 적재된 페이지를 통해 이루어지며, 디스크 I/O는 물리적으로 액세스 암(Arm)이 움직이면서 헤드를 통해 이루어지는 반면, 메모리 I/O는 전기적 신호에 불과하기 때문에 디스크 I/O에 비교할 수 없을 정도로 빠르다. 디스크에서 읽은 데이터 블록을 메모리 상에 보관해 두는 기능이 모든 데이터베이스 시스템에 필..
SQL 서버가 데이터베이스를 구성하는 물리 파일에 액세스할 때는 몇가지 특징적인 패턴이 있다. 시나리오를 예로 들어 어떤 종류의 액세스가 SQL 서버의 데이터베이스 파일에 대해 발생하는지를 생각해보자. 1. 데이터 파일에서의 액세스 패턴 1) 온라인 트랜잭션 처리(OLTP) 시스템의 경우 OLTP 시스템에서는 수 많은 클라이언트가 각각 매우 작은 범위의 데이터를 참조 또는 갱신한다. 또한 각 클라이언트가 필요로 하는 데이터의 종류와 분포범위는 제각각이기 때문에 데이터 파일에 저장된 데이터가 파일 내의 다양한 장소에 점재해 있을 가능성이 높다. 그 결과 데이터 파일에 액세스하는 것은 파일 전체에 랜덤으로 발생하는 경향이 높아진다. 2) OLAP 의 경우 주요 용도가 축적한 데이터를 분석하는 일인 OLAP ..
RAID 란? RAID(Redundant Array of Independent Disk) 란 여러 개의 저장 장치 (예 > 하드디스크 드라이브 등)를 묶어 하나의 고용량/고성능 저장 장치 처럼 사용하는 기술이다. 하드디스크 (HDD) 는 자기 표면으로 구성되어 있어 아주 오랜 시간동안 혹사를 당하게 된다면 물리적인 손상(베드 섹터)이 발생할 가능성이 커진다. 이 경우 심하면 디스크 전체가 사용할 수 없게되는 흔히 '하드 디스크가 깨졌다'고 하는 상태가 되며 중요한 데이터를 손실할 수 있다. 그런데, 만약 서버의 하드디스크에 금융/군사 목적의 아주 중요한 데이터가 저장되어 있었는데 위와 같은 하드디스크의 문제가 발생했다고 생각해보자 백업이 미리 되어있다면 데이터의 유실을 막을 수 있지만, 그렇지 않다면 중..
1.OLTP(Online Transaction Processing) OLTP를 직역하면 온라인 트랜잭션 처리를 뜻한다. 복잡하게 말하면 복수의 사용자 PC에서 발생되는 트랜잭션(Transaction)을 DB서버가 처리하고, 그 결과를 요청한 사용자PC에 결과값을 되돌려주는 과정을 뜻한다. 쉽게 이야기하면 1개의 요청작업을 처리하는 과정을 OLTP라고 생각하면 된다. 예를 들면, 은행에 돈을 입금하는 과정을 생각해보면 약 3단계의 처리과정을 거쳐야 한다고 가정해보자. 1단계 : 돈과 카드를 은행원에게 전달. 2단계 : 은행원이 돈과 카드를 확인한 후 입금을 진행. 3단계 : 입금이 확인된 내역을 확인. 이 3단계는 중간에 그만두면 안되는 과정이며, 모든 단계가 완벽하게 끝나야 한다. 이 3단계를 1개의 요..