인덱스 7

인덱스 고민

💡 이 글은 인덱스를 적용할 때 어떤 고민을 했는지 적은겁니다. (매우 부족합니다.) 틀릴수도 있으며 더 좋은 방법이 있을 수도 있습니다. 2장. 인덱스 - 인덱스 구조 및 탐색 2장. 인덱스 - 인덱스 구조 및 탐색 💡 핵심 원리를 알아보자 인덱스 튜닝의 두 가지 핵심 요소 인덱스 스캔 효율화 튜닝 랜덤 액세스 최소화 튜닝(테이블 액세스 횟수를 줄이는 것) ⇒ 이것이 중요!! 인덱스 구조 대용량 테이블에 balldev.tistory.com 친절한 sql 튜닝 책을 보고 나름대로의 생각으로 적용 기본적인 DB 구조 뭔가 많긴한데 대충 broadcast 기준으로 이것저것 있는 구조입니다. 고려했던 부분 조회를 할 경우에 어떤 조건절을 많이 쓸까?? = 조건 위주로 broadcast_state는 ready,..

경험 2023.03.30

3장. 인덱스 튜닝 - 인덱스 설계

인덱스가 만약 많다면? DML 성능 저하 - TPS 저하 데이터 베이스 사이즈 증가 데이터베이스 관리 및 운영 비용 증가 ⇒ 개별 쿼리 성능뿐만 아니라 그 개수를 최소화함으로써 DML 부하를 줄여야 하므로 인덱스 설계가 어렵다. ⇒ 그리고 인덱스 추가는 시스템에 부하를 주고 인덱스 변경은 운영에 리스크가 있기 때문에 처음 설계가 중요하다. 인덱스 선택 조건절에 항상 사용하거나 자주 사용하는 컬럼 ‘=’ 조건으로 자주 조회되는 컬럼을 앞쪽에 두어야한다. 수행빈도, 중요도, 데이터량 등 .. nl 조인할 때 어느쪽에서 자주 액세스 되는지도 중요한 판단 기준이 된다. ⇒ 이후에 nl조인에서 설명함 수행빈도가 높다면 당장 성능이 좋아도 인덱스를 최적으로 구성해야한다. 데이터량이 적다면 굳이 인덱스를 만들 필요가..

3장. 인덱스 튜닝 - 인덱스 튜닝

💡 운영 환경에서 가능한 일반적인 튜닝 기법은 인덱스 컬럼 추가 인덱스 탐색과정에 대해서 알아보자 루트 블록에서 LMC는 자식 노드 중에서 가장 왼쪽 끝에 위치한 블록을 가리킨다. 주의할 점이 C1 = ‘B’인 레코드를 찾을 때 리프블록 3으로 가는 것이 아닌 직전 리프블록 2로 가야한다. 각 조건절에 대해서 원리를 설명하기. where C1 = 'B' where C1 = 'B' and C2 = 3 where C1 = 'B' and C2 >= 3 where C1 = 'B' and C2 = 'a' where c1 = 1 and c2 = 'A' and c3 between '가' and '다' and c4 = 'a' where c1 = 1 and c2

3장. 인덱스 튜닝 - 부분 범위 처리

부분범위 처리 DBMS가 클라이언트에게 데이터를 전송할 때 일정량씩 나누어 전송한다. 전송한 후에 fetch call이 있기 전까지 기다린다. 1억건짜리 테이블인데도 결과를 빨리 출력할 수 있는 이유 한번에 데이터를 모두 읽어 전송하지 않고 먼저 읽는 데이터부터 일정량을 전송하고 멈추기 때문이다. fech call을 받으면 대기 큐에서 나와 그 다음 데이터부터 일정량을 읽어서 전송하고 또다시 잠을 잔다. ⇒ 부분 범위 처리 - 약간 페이징하고 원리가 비슷한듯 정렬 조건이 있을 때 부분 범위 처리 select * from user order by created 인덱스가 안되어 있다면? 모든 데이터를 읽고 created 순으로 정렬 데이터 전송 인덱스가 되어 있다면? 이미 정렬되어 있으므로 부분범위 처리가 ..

3장. 인덱스 튜닝 - 테이블 엑세스 초기화

인덱스 ROWID 인덱스는 스캔한 후에 반드시 테이블을 액세스한다. 인덱스를 스캔하는 이유 검색 조건을 만족하는 소량의 데이터를 인덱스에서 빨리 찾고 거기서 테이블 레코드를 찾아가기 위한 주소값(rowId)를 얻기 위함이다. 여기서 rowId는 물리적 주소라고 할 수도 있지만 논리적 주소에 가깝다. ⇒ 테이블 레코드를 찾아가기 위한 위치 정보를 담는다. (물리적으로 포인터 처럼 위치를 가리키는게 아님) 메인 메모리 DB와의 비교 메인메모리란 메모리를 통해서만 I/O를 통해서 수행하는 DB이다. ⇒ 메인 메모리는 포인터를 가지고 있어 엄청 빠르다. 하지만 우리가 흔히 사용하는 DB들은 수시로 버퍼캐시에서 밀려났다가 다시 캐싱되고 그때마다 다른 주소로 캐싱되기 때문에 포인터로 직접 연결할 수 없는 구조로 메..

2장. 인덱스 - 인덱스 확장 기능 사용법

💡 index full scan, index unique scan, index skip scan, index fast full scan Index range scan 핵심은 필요한 범위만 스캔한다. 컬럼 가공 X 인덱스 스캔 범위, 테이블 액세스 횟수를 얼마나 줄일 수 있느냐 index full scan 인덱스 리프 블록을 처음부터 끝까지 수평적으로 탐색한다. 데이터 검색을 위한 최적의 인덱스가 없을 때 차선으로 선택한다. 인덱스 선두컬럼이 아닌것은 index range scan이 불가능 효용성 인덱스 선두 컬럼이 조건절에 없으면 table full scan 고려 index range scan이 불가능 할 떄 면적이 넓은 테이블을 스캔하는 것보다 면적이 작은 인덱스를 full scan하는 것이 좋기 때문..

인프라를 지탱하는 기본 이론 - 직렬과 병렬, 동기와 비동기

직렬과 병렬 병렬화 분담할 수 있는 처리는 cpu코어를 늘리면 빨라짐 처리시간을 1/N으로 감소 하지만 무조건 좋은건 아님 → 효과가 있을 때 병렬화 한다. 직렬화 분담할 수 없는 처리는 cpu코어를 늘려도 빨라지지 않음 처리시간 변화가 없음 쿨럭 주파수를 올리면 속도 향상 하지만 하드웨어를 어느정도 좋게 할 수 있지만 무한히 늘릴수는 없음( 하드웨어적 한계) 이것이 어디에 사용되나? 웹 서버와 AP서버에서 웹서버(아파치) - 복수의 프로세스가 분담해서 처리 AP서버 - 하나의 프로세스와 복수의 쓰레드로 처리 하지만 만약 CPU코어가 하나만 있다면 1개의 프로세스만 수행 가능 아파치 프로세스를 아무리 늘릴려고 해도 1개씩밖에 수행 못함 → CPU코어수도 고려해야한다 DB서버에서 클라이언트 요청 접수 수만..