Post

Query_processing1

이게 뭐냐면

sql query를 지 마음대로 썼는데 compiler가 착하게 최적화를 해줌.

순서는 sql parser logical optimization physical optimization execute함.

image

logically에선

  1. sql parser가 잘라줌
  2. relation sql tree 만든다.

경우의 수는 많음

physically에선

  1. RA구현을 효과적으로함. join할 때, nested loop, hash -join 등등 선택함

이과정에서효과적으로 RA구현하는것이목표임.

이 두개 합쳐서 query optimizaiton이라함.

쿼리퍼포먼스높이는것중하나가 indexing임.

디스크어케저장되어있는지 인덱스가뭔지 어떻게인덱스고르는것인지 알아야 인덱스를 뭐 쓰거나 할 듯.

인덱스 이름만들어도 느낌온다아님? 잘 짜이게 만들어놓고 인덱스표시해서 바로접근할수잇게하는 느낌임.random access해서 O(1)느낌으로다가..

일단 데이터어케저장됨부터알아보자 이걸알아야 뭐 인덱스를위해 새로 정렬하건 뭐건 할 듯

row-wise로 저장이됨 보통컴에선

이게뭐냐 하나의 블록에 row 몇개를 저장함.

즉 row기준으로 큰 블록 만들고 그 안에 데이터튜플몇개씩넣음..

이러한데이터저장된 데이터파일읽을때 어케효율적으로읽음?그냥똑같다아님? ㅋㅋ

근데충격적사실이데이터순차적으로 읽는게 랜덤하게 지 마음대로 접근하는것보다 훨빠르다는거임. 왜냐하면 cache들어봄?이게 대충 임시저장소같은건데 맨날 디스크까지왓다갓다 ㅈㄴ힘드니까사용을하는거임 배열같은건어지간해서 전부 순회하잖음 그래서 그냥배열함접근할때 오 싑 다 쓸거같다 생각하고(실제로다쓰는진안중요함) os가 배열일부를메모리에다가 저장함 이게거의랜덤하게접근하면 전체데이터 1~2퍼 읽을때순차적으로 그냥하면 캐시사용해가지고 거의 다 읽음 100~50배차이임 ㄷㄷ

이러한데이터파일을 heapfile로 구성(정렬안댐) sequential file(정렬야무짐-key기준)으로정렬됨 key는개발자가지정함. primary key랑다름착각 ㄴㄴ

아니그래서인덱스가머임?

책읽을때생각하삼 표지앞에잇는 뭐순서적힌게 인덱스임 실제로영어책에보면 index라고적힘 그거랑원리가같다 예시를들어보자 대충이진탐색알거임 이거 그냥 탐색하면 O(n)인데, 정렬잘되어잇다면O(logn)으로 ㅈㄴ빠름

그니가 데이터저장할댸정렬을 잘해두자는것임.

근데뭐크기가작으면사실 좀 그렇긴 함 삽입할대마다 정렬해야하니까 ㅈㄴ귀찮거든 왜냐하면 할때마다 디스크까지가서 또 몇개옮겨가지고메모리에두고 등등 이거 은근빡세다

한페이지에잇는 데이터를P개라하자. 한블록이라고생각하면댐 N개삽입할때 시간은 읽기 N/P + 쓰기 N/P라함. 2*N/P걸림.

그럼저장하고나서 정렬 어케 잘 빠르게할순없을까?라는생각을함해보자.

만약 찾을데이터attribute가많다.그럼 이거 다 정렬하고 어느 세월에 다 하노 그래서 걍 정렬된데이터들을 모아두자 복사본으로 와 이러면 디스크 터짐

아 ㅅㅍ 걍 새로운거하나만들자 index data structer임 이게

빠른검색을위해만들어진추가ds임.

(키,값)으로구성됨 아마hashtable 느낌이 ㅈㄴ 난다. key는 attribute고 value는 레코드가리키는 pointer라고한다. 아마c계열로구현된듯 하나의테이블에대해 많은인덱스갖기가능

총row에대한 pointer (즉, [] 가리키는 포인터)일수도잇고 secondary index는 주소를 가리키는 주소임 말장난 ㄹㅈㄷ네 ㅋㅋ image

이렇다고 함 정렬안되어도괜찮쥬? https://sasca37.tistory.com/215출처임

종합해보면

전자는 ㄹㅇ 그냥 속편하게 가리키는것이고

후자는 pkey기준 아닌 다른 중복되는 뭐시기 ㄱㄴ함

일단 인덱스는 무조건 정렬이되어있어야한다 이진탐색하려고..

전자는 찾는기준키도정렬이되어있음 후자는 찾는기준키들 막섞여도상관xx임. 이건 중복허용하니까 아무래도 여러 attribute기준으로 데이터찾을때좋겠죠?

https://m.blog.naver.com/remocon33/221037713789 여기블로그야무짐

예를들어서 어떤attribute에 대한 pointer을값으로갖는게 가능하다

image

바로이렇게말이죠

그럼인덱스ds는뭔데 대충해시테이블이랑 유명한b+트리가있다.

해시는뭐 대충알거임 해시함수 하나 지정하고 해시함수 나오는 값을 인덱스로가져서 거기에 linkedlist형태로 지정하는 형태임

처음에 인덱스로해시테이블접근하고 거기 있는 주소값으로 디스크 블록 접근함 범위쿼리에선 사용하면 ㅈ된다.. 왜냐면범위쿼리에선

  1. 범위해당하는거 다 찾아야 함
  2. 해시나오는값이라도 비슷하면 ok하겟는데 1 2 차이가 어마무시함 따라서 그냥 범위쿼리잇는거 다 탐색해야함 결국 O(1)걸리는해시테이블을 n번반복해야해서(범위만큼) O(n)으로 해시테이블의장점을 다 갖다버리게됨 근데 쿼리에서 보통 범위쿼리많이쓰니까 이건 넘 비효율적이다 사용xxx 그래서나온게 B+트리임. 이건당연히범위검색좋겠다고생각해야함.

근데이게 정렬된 뭐시기에서 좋다고 하는 이유가 다 있음.

왜냐면 clustered는 p key기준으로 정렬이 되어 있음. 인덱스파일은 무조건 정렬이되어있으니까.

그래서 따라가다보면 나머지들은 다 정렬이 되어있는것임. 그래서 범위 search가 좋고. 따라서 범위 많이 물어보면 그걸 기준으로 clustered index 만들어야 하는 것. 왜? 정렬되어 있으니까. 근데 이럴때는 pkey(default)갖다버리고 새롭게 지정해야함

This post is licensed under CC BY 4.0 by the author.