22-08-07

Yu RiverΒ·2022λ…„ 8μ›” 7일
0

곡뢀 일지

λͺ©λ‘ 보기
4/28

πŸ—“ 22-08-07

SQLP 3κ³Όλͺ© 이둠 볡슡

SQLP ν•„κΈ° 풀이

[SQLP필기풀이]6μž₯ κ³ κΈ‰SQLνŠœλ‹(5) νŒŒν‹°μ…”λ‹
- 26번 , 27 , 28 , 29 , 30 , 31 , 32
33 , 34 ,35 ,36 , 37 , 38 , 39 , 40
41 , 42번

πŸ‘€ 8/7 볡기

[1] 배치 ν”„λ‘œκ·Έλž¨μ˜ μ •μ˜

βœ… 배치 ν”„λ‘œκ·Έλž¨

  • 일련의 μž‘μ—…λ“€μ„ ν•˜λ‚˜μ˜ μž‘μ—… λ‹¨μœ„λ‘œ λ¬Άμ–΄ μ—°μ†μ μœΌλ‘œ 일괄 μ²˜λ¦¬ν•˜λŠ” 것
  • 온라인 ν”„λ‘œκ·Έλž¨μ—μ„œλ„ μ—¬λŸ¬ μž‘μ—…μ„ λ¬Άμ–΄ μ²˜λ¦¬ν•˜λŠ” κ²½μš°κ°€ μžˆμœΌλ―€λ‘œ 이와 κ΅¬λΆ„ν•˜λ €λ©΄ 'μ‚¬μš©μžμ™€μ˜ μƒν˜Έμž‘μš©(Interaction) μ—¬λΆ€' νŠΉμ§•μ„ 더 μΆ”κ°€ν•΄μ•Όν•œλ‹€.
  • μ‚¬μš©μžμ™€μ˜ μƒν˜Έμž‘μš© 없이 λŒ€λŸ‰μ˜ 데이터λ₯Ό μ²˜λ¦¬ν•˜λŠ” 일련의 μž‘μ—…λ“€μ„ λ¬Άμ–΄ μ •κΈ°μ μœΌλ‘œ 반볡 μˆ˜ν–‰ν•˜κ±°λ‚˜
  • μ‚¬μš©μžμ™€μ˜ μƒν˜Έμž‘μš© 없이 λŒ€λŸ‰μ˜ 데이터λ₯Ό μ²˜λ¦¬ν•˜λŠ” 일련의 μž‘μ—…λ“€μ„ λ¬Άμ–΄ 정해진 κ·œμΉ™μ— 따라 μžλ™μœΌλ‘œ μˆ˜ν–‰ν•œλ‹€.
  • κΈ°μ—…λ§ˆλ‹€ 업무 μš”κ±΄μ΄ μ›Œλ‚™ 볡작 λ‹€μ–‘ν•˜λ―€λ‘œ 이 외에도 μ—¬λŸ¬ 가지 ν˜•νƒœκ°€ μ‘΄μž¬ν•  수 μžˆλ‹€.
  • μ •κΈ° 배치 ν˜•νƒœκ°€ κ°€μž₯ μΌλ°˜μ μ΄λ‹€.

[2] 배치 ν”„λ‘œκ·Έλž¨μ˜ μ’…λ₯˜

βœ… 배치 ν”„λ‘œκ·Έλž¨μ˜ μ’…λ₯˜ (μˆ˜ν–‰μ£ΌκΈ° κΈ°μ€€)

  • On-Demand 배치 :: 배치 ν”„λ‘œκ·Έλž¨μ΄ μžλ™μœΌλ‘œ μˆ˜ν–‰λ˜λŠ” μ£ΌκΈ°λŠ” μ›”λ‹¨μœ„, μ£Όλ‹¨μœ„, μΌλ‹¨μœ„κ°€ λ³΄ν†΅μ΄μ§€λ§Œ, μš”μ¦˜μ€ μ£ΌκΈ°κ°€ 점점 짧아져 μ’…μ’… μ‹€μ‹œκ°„μ΄ μš”κ΅¬λ˜κΈ°λ„ ν•œλ‹€. μ‚¬μš©μžκ°€ μš”μ²­ν•œ μ‹œμ μ— λ°”λ‘œ μž‘μ—…μ„ μ‹œμž‘ν•œλ‹€
  • μ •κΈ° 배치 : 정해진 μ‹œμ (주둜 μ•Όκ°„)에 μ‹€ν–‰λœλ‹€.
  • μ΄λ²€νŠΈμ„± 배치 : 사전에 μ •μ˜ν•΄ λ‘” 쑰건이 좩쑱되면 μžλ™μœΌλ‘œ μ‹€ν–‰

βœ… 배치 ν”„λ‘œκ·Έλž¨μ˜ μ’…λ₯˜ (μž‘μ„± ν˜•νƒœ κΈ°μ€€)

  • μ ˆμ°¨ν˜•μœΌλ‘œ μž‘μ„±λœ ν”„λ‘œκ·Έλž¨
    • SQL 결과집합을 루프 λ‚΄μ—μ„œ ν•œκ±΄μ”© Fetchν•œλ‹€.
    • SQL을 λ°˜λ³΅ν•΄μ„œ μˆ˜ν–‰ν•˜λŠ” ν˜•νƒœ
    • 인덱슀 ꡬ성이 μ€‘μš”ν•˜λ‹€.
  • One SQL μœ„μ£Όλ‘œ μž‘μ„±λœ ν”„λ‘œκ·Έλž¨

[3] 배치 ν”„λ‘œκ·Έλž¨μ˜ νŠΉμ§•

  • 배치 ν”„λ‘œκ·Έλž¨μ€ DW/OLAP μ‹œμŠ€ν…œλΏλ§Œ μ•„λ‹ˆλΌ OLTP(온라인 νŠΈλžœμž­μ…˜ 처리) μ‹œμŠ€ν…œμ—μ„œλ„ 많이 ν™œμš©ν•œλ‹€.
  • μ‹€μ‹œκ°„μ— κ°€κΉŒμš΄(Near Real Time) 정보 μ„œλΉ„μŠ€ μš”κ΅¬κ°€ λŠ˜λ©΄μ„œ On-Demand λ°°μΉ˜κ°€ 늘고, νŠΈλžœμž­μ…˜μ„ μΌμ •λŸ‰ λͺ¨μ•˜λ‹€κ°€ 지연(deferred) μ²˜λ¦¬ν•˜λŠ” 배치 ν”„λ‘œκ·Έλž¨μ˜ ν™œμš©λ„ λŠλŠ” μΆ”μ„Έλ‹€.
  • ⭐️야간 배치 ν”„λ‘œκ·Έλž¨μ„ νŠœλ‹ν•  λ•ŒλŠ” κ°œλ³„ ν”„λ‘œκ·Έλž¨ μˆ˜ν–‰μ‹œκ°„μ„ λ‹¨μΆ•ν•˜κΈ°λ³΄λ‹€ 전체 ν”„λ‘œκ·Έλž¨ μˆ˜ν–‰μ‹œκ°„μ„ λ‹¨μΆ•ν•˜λŠ” 데 더 큰 λͺ©ν‘œλ₯Ό 두어야 ν•œλ‹€β­οΈ
  • 배치 ν”„λ‘œκ·Έλž¨μ€ 항상 전체 μ²˜λ¦¬μ†λ„ μ΅œμ ν™”μ— λͺ©ν‘œλ₯Ό 두고 νŠœλ‹ν•΄μ•Ό ν•œλ‹€.

[4] 병렬 μ²˜λ¦¬μ—μ„œμ˜ 데이터 μž¬λΆ„λ°° 방식

βœ… 데이터 μž¬λΆ„λ°° λ°©μ‹μ˜ μ’…λ₯˜

  • 데이터 μž¬λΆ„λ°°λŠ” 병렬 μ„œλ²„ ν”„λ‘œμ„ΈμŠ€ 간에 데이터λ₯Ό μž¬λΆ„λ°°ν•˜λŠ” 방식이닀.
  • RANGE 방식
    • order by λ˜λŠ” sort group byλ₯Ό λ³‘λ ¬λ‘œ μ²˜λ¦¬ν•  λ•Œ μ‚¬μš©λœλ‹€.
    • 첫 번째 μ„œλ²„ 집합은 데이터λ₯Ό 읽어 각 ν”„λ‘œμ„ΈμŠ€λ§ˆλ‹€ 처리 λ²”μœ„(예λ₯Ό λ“€μ–΄, A~G, H~M, N~S, T~Z)λ₯Ό μ§€μ •ν•˜μ—¬ κ·Έ 두 번째 μ„œλ²„ μ§‘ν•©μ˜ 정해진 ν”„λ‘œμ„ΈμŠ€μ—κ²Œ β€œμ •λ ¬ ν‚€ 값에 따라 λΆ„λ°°ν•œλ‹€.
    • 두 번째 μ„œλ²„ 집합은 μ •λ ¬ μž‘μ—…μ„ λ§‘λŠ”λ‹€.
    • QCλŠ” 각 μ„œλ²„ ν”„λ‘œμ„ΈμŠ€μ—κ²Œ μž‘μ—… λ²”μœ„λ₯Ό ν• λ‹Ήν•˜κ³  μ •λ ¬ μž‘μ—…μ—λŠ” 직접 μ°Έμ—¬ν•˜μ§€ μ•ŠλŠ”λ‹€.
      정렬이 μ™„λ£Œλ˜κ³  λ‚˜λ©΄ μˆœμ„œλŒ€λ‘œ κ²°κ³Όλ₯Ό λ°›μ•„μ„œ μ‚¬μš©μžμ—κ²Œ μ „μ†‘ν•œλ‹€.
  • BROADCAST 방식
    • QC λ˜λŠ” 첫 번째 μ„œλ²„ 집합에 μ†ν•œ ν”„λ‘œμ„ΈμŠ€λ“€μ΄ 각각 읽은 데이터λ₯Ό 두 번째 μ„œλ²„ 집합에 μ†ν•œ β€œλͺ¨λ“ β€ 병렬 ν”„λ‘œμ„ΈμŠ€μ—κ²Œ μ „μ†‘ν•˜λŠ” 방식이닀.
    • 병렬 μ‘°μΈμ—μ„œ 크기가 맀우 μž‘μ€ ν…Œμ΄λΈ”μ΄ μžˆμ„ λ•Œ μ‚¬μš©ν•œλ‹€.
  • KEY 방식
    • νŠΉμ • 칼럼(λ“€)을 κΈ°μ€€μœΌλ‘œ ν…Œμ΄λΈ” λ˜λŠ” 인덱슀λ₯Ό νŒŒν‹°μ…”λ‹ν•  λ•Œ μ‚¬μš©ν•˜λŠ” λΆ„λ°° 방식이닀.
  • ROUND-ROBIN 방식
    • νŒŒν‹°μ…˜ ν‚€, μ •λ ¬ ν‚€, ν•΄μ‹œ ν•¨μˆ˜ 등에 μ˜μ‘΄ν•˜μ§€ μ•Šκ³  λ°˜λŒ€νŽΈ 병렬 μ„œλ²„μ— λ¬΄μž‘μœ„λ‘œ 데이터λ₯Ό λΆ„λ°°ν•  λ•Œ μ‚¬μš©ν•œλ‹€.
  • HASH 방식
    • μ‘°μΈμ΄λ‚˜ hash group byλ₯Ό λ³‘λ ¬λ‘œ μ²˜λ¦¬ν•  λ•Œ μ‚¬μš©λœλ‹€.
    • 쑰인 ν‚€λ‚˜ group by ν‚€ 값을 ν•΄μ‹œ ν•¨μˆ˜μ— μ μš©ν•˜κ³  λ¦¬ν„΄λœ 값에 따라 데이터λ₯Ό λΆ„λ°°ν•˜λŠ” 방식이닀.

[5] 병렬 μ²˜λ¦¬μ—μ„œμ˜ Granule

βœ… λ³‘λ ¬μ²˜λ¦¬μ—μ„œμ˜ Granule

  • 데이터λ₯Ό λ³‘λ ¬λ‘œ μ²˜λ¦¬ν•  λ•Œ 일의 μ΅œμ†Œ λ‹¨μœ„λ₯Ό 'Granule'이라고 ν•œλ‹€.
  • 병렬 μ„œλ²„λŠ” ν•œ λ²ˆμ— ν•˜λ‚˜μ˜ Granuleμ”©λ§Œ μ²˜λ¦¬ν•œλ‹€.
  • 블둝 기반 Granule(=블둝 λ²”μœ„ Granule)
    • QCκ°€ ν…Œμ΄λΈ”λ‘œλΆ€ν„° 읽어야 ν•  일정 λ²”μœ„(Range)의 블둝을 각 병렬 ν”„λ‘œμ„ΈμŠ€μ—κ²Œ ν• λ‹Ήν•œλ‹€.
    • 병렬 ν”„λ‘œμ„ΈμŠ€κ°€ ν•œ Granule에 λŒ€ν•œ 일을 끝마치면 μ΄μ–΄μ„œ λ‹€λ₯Έ Granule을 ν• λ‹Ήν•œλ‹€.
    • λ”°λΌμ„œ ν”„λ‘œμ„ΈμŠ€ κ°„ μ²˜λ¦¬λŸ‰μ— νŽΈμ°¨κ°€ 거의 λ°œμƒν•˜μ§€ μ•ŠλŠ”λ‹€.
    • β­οΈνŒŒν‹°μ…˜ μ—¬λΆ€, νŒŒν‹°μ…˜ κ°œμˆ˜μ™€ λ¬΄κ΄€ν•˜κ²Œ 병렬도λ₯Ό 지정할 수 μžˆλ‹€.⭐️
    • ⭐️병렬 Full Table Scan은 블둝 기반 Granuleμ΄λ―€λ‘œ νŒŒν‹°μ…˜ κ°œμˆ˜λ³΄λ‹€ 큰 병렬도λ₯Ό 지정해도 상관없닀.⭐️
  • νŒŒν‹°μ…˜ 기반 Granule(νŒŒν‹°μ…˜ Granule)
    • ν•œ νŒŒν‹°μ…˜μ— λŒ€ν•œ μž‘μ—…μ„ ν•œ ν”„λ‘œμ„ΈμŠ€κ°€ λͺ¨λ‘ μ²˜λ¦¬ν•œλ‹€.
    • Partition-Wise 쑰인 μ‹œ
    • νŒŒν‹°μ…˜ 인덱슀λ₯Ό λ³‘λ ¬λ‘œ μŠ€μΊ”ν•  λ•Œ(Index Range Scan, Index Full Scan)
    • νŒŒν‹°μ…˜ 인덱슀λ₯Ό λ³‘λ ¬λ‘œ κ°±μ‹ ν•  λ•Œ
    • νŒŒν‹°μ…˜ ν…Œμ΄λΈ” λ˜λŠ” νŒŒν‹°μ…˜ 인덱슀λ₯Ό λ³‘λ ¬λ‘œ 생성할 λ•Œ
    • ν•œ νŒŒν‹°μ…˜μ„ 두 개 ν”„λ‘œμ„ΈμŠ€κ°€ ν•¨κ»˜ μ²˜λ¦¬ν•  수 μ—†λ‹€.
    • 병렬도λ₯Ό νŒŒν‹°μ…˜ κ°œμˆ˜λ³΄λ‹€ 크게 μ§€μ •ν•˜λ©΄ μ„œλ²„ λ¦¬μ†ŒμŠ€λ₯Ό λ‚­λΉ„ν•˜κ²Œ λœλ‹€.
    • 병렬도λ₯Ό νŒŒν‹°μ…˜ 개수 μ΄ν•˜λ‘œ 지정할 λ•ŒλŠ” 블둝 기반 Granuleκ³Ό λ§ˆμ°¬κ°€μ§€λ‘œ λ¨Όμ € 일을 마친 ν”„λ‘œμ„ΈμŠ€μ—κ²Œ λ‹€μŒ νŒŒν‹°μ…˜μ„ ν• λ‹Ήν•œλ‹€.
    • μ²˜λ¦¬ν•  νŒŒν‹°μ…˜μ΄ 없을 λ•Œ λ¨Όμ € 일을 끝마친 ν”„λ‘œμ„ΈμŠ€λŠ” λ‹€λ₯Έ ν”„λ‘œμ„ΈμŠ€κ°€ 일을 마칠 λ•ŒκΉŒ
      지 κΈ°λ‹€λ¦¬κ²Œ λ˜λ―€λ‘œ νŒŒν‹°μ…˜κ°„ 데이터양에 νŽΈμ°¨κ°€ 심할 λ•Œ λ¦¬μ†ŒμŠ€λ₯Ό λ‚­λΉ„ν•˜κ²Œ λœλ‹€.

[6] 병렬 쑰인 μ’…λ₯˜

참고링크

βœ… Full Partition Wise 쑰인

  • 같은 κΈ°μ€€μœΌλ‘œ νŒŒν‹°μ…˜λœ 두 ν…Œμ΄λΈ”μ„ 쑰인할 λ•Œ μ‚¬μš©ν•˜λŠ” 병렬 쑰인 방식
  • μ–‘μͺ½ ν…Œμ΄λΈ”μ„ 같은 κΈ°μ€€μœΌλ‘œ νŒŒν‹°μ…˜ν•˜κΈ° μœ„ν•΄ 데이터λ₯Ό μž¬λΆ„λ°°ν•  ν•„μš”κ°€ μ—†λ‹€.
  • 병렬 ν”„λ‘œμ„ΈμŠ€λ₯Ό 2배수둜 ν• λ‹Ήν•˜μ§€ μ•ŠλŠ”λ‹€. 즉 , ν•˜λ‚˜μ˜ μ„œλ²„μ§‘ν•©λ§Œ ν•„μš”ν•˜λ‹€.
  • νŒŒν‹°μ…˜ 기반 λ³‘λ ¬μ²˜λ¦¬μ΄λ―€λ‘œ νŒŒν‹°μ…˜ 갯수 μ΄ν•˜λ‘œ 병렬도λ₯Ό μ œν•œν•œλ‹€.

βœ… Partial Partition Wise 쑰인

  • 첫 μ„œλ²„ 집합이 λΉ„ νŒŒν‹°μ…˜ ν…Œμ΄λΈ”μ„ νŒŒν‹°μ…˜ ν…Œμ΄λΈ” κΈ°μ€€μœΌλ‘œ 동적 νŒŒν‹°μ…”λ‹ν•œλ‹€.
  • 두 개의 μ„œλ²„μ§‘ν•©μ΄ ν•„μš”ν•˜λ‹€.(Partition degree * 2 개 Process)
  • 각 μ„œλ²„μ§‘ν•© κ°„ 데이터 톡신이 λ°œμƒν•œλ‹€.

[6] 병렬 μ²˜λ¦¬μ‹œ νŒŒν‹°μ…”λ‹ 힌트

βœ… pq_distribute μ‚¬μš©λ²•

  • pq_distribute(inner, none, none)
    • Full-Partition Wise Join으둜 μœ λ„ν•  λ•Œ μ‚¬μš©
    • λ‹Ήμ—°νžˆ, μ–‘μͺ½ ν…Œμ΄λΈ” λͺ¨λ‘ 쑰인 μΉΌλŸΌμ— λŒ€ν•΄ 같은 κΈ°μ€€μœΌλ‘œ νŒŒν‹°μ…”λ‹(equi-partitioning) 돼 μžˆμ„ λ•Œλ§Œ μž‘λ™ν•œλ‹€.
  • pq_distribute(inner, partition, none)
    • Partial-Partition Wise Join으둜 μœ λ„ν•  λ•Œ μ‚¬μš©
    • outer ν…Œμ΄λΈ”μ„ inner ν…Œμ΄λΈ” νŒŒν‹°μ…˜ 기쀀에 따라 νŒŒν‹°μ…”λ‹ν•˜λΌλŠ” λœ»μ΄λ‹€.
    • λ‹Ήμ—°νžˆ, inner ν…Œμ΄λΈ”μ΄ 쑰인 ν‚€ μΉΌλŸΌμ— λŒ€ν•΄ νŒŒν‹°μ…”λ‹ 돼 μžˆμ„ λ•Œλ§Œ μž‘λ™ν•œλ‹€.
  • pq_distribute(inner, none, partition)
    • Partial-Partition Wise Join으둜 μœ λ„ν•  λ•Œ μ‚¬μš©
    • inner ν…Œμ΄λΈ”μ„ outer ν…Œμ΄λΈ” νŒŒν‹°μ…˜ 기쀀에 따라 νŒŒν‹°μ…”λ‹ν•˜λΌλŠ” λœ»μ΄λ‹€.
    • λ‹Ήμ—°νžˆ, outer ν…Œμ΄λΈ”μ΄ 쑰인 ν‚€ μΉΌλŸΌμ— λŒ€ν•΄ νŒŒν‹°μ…”λ‹ 돼 μžˆμ„ λ•Œλ§Œ μž‘λ™ν•œλ‹€.
  • pq_distribute(inner, hash, hash)
    • 쑰인 ν‚€ μΉΌλŸΌμ„ ν•΄μ‹œ ν•¨μˆ˜μ— μ μš©ν•˜κ³  κ±°κΈ°μ„œ λ°˜ν™˜λœ 값을 κΈ°μ€€μœΌλ‘œ μ–‘μͺ½ ν…Œμ΄λΈ”μ„ λ™μ μœΌλ‘œ νŒŒν‹°μ…”λ‹ν•˜λΌλŠ” λœ»μ΄λ‹€.
    • μ‘°μΈλ˜λŠ” ν…Œμ΄λΈ”μ„ λ‘˜ λ‹€ νŒŒν‹°μ…”λ‹ν•΄μ„œ νŒŒν‹°μ…˜ 짝(Partition Pair)을 κ΅¬μ„±ν•˜κ³ μ„œ Partition Wise Join을 μˆ˜ν–‰ν•œλ‹€.
  • pq_distribute(inner, broadcast, none)
    • outer ν…Œμ΄λΈ”μ„ Broadcast ν•˜λΌλŠ” λœ»μ΄λ‹€.
  • pq_distribute(inner, none, broadcast)
    • inner ν…Œμ΄λΈ”μ„ Broadcast ν•˜λΌλŠ” λœ»μ΄λ‹€.
profile
λ„κ΄‘μ–‘νšŒ(ιŸœε…‰ι€Šζ™¦) β€˜λΉ›μ„ 감좔고 μ–΄λ‘ μ†μ—μ„œ νž˜μ„ κΈ°λ₯Έλ‹€β€™

0개의 λŒ“κΈ€