SQL 레벨업 02
·
Review
UNION은 대부분의 상황에서 비효율적인 쿼리일 가능성이 높다. CASE로 분기하자. - 외부적으로는 하나의 SQL 구문을 실행하는 것처럼 보이지만 - 내부적으로는 여러 개의 select 구문을 실행하는 실행 계획으로 해석된다. - 즉 테이블에 접근하는 횟수가 많아져 I/O 비용이 늘어난다. - (SQL UNION SQL) 이렇게 있으면 SQL 각각 select 연산을 수행한다. - select 구문으로 분기하지 않고 CASE 구문으로 분기하는 접근만으로도 SQL 효율을 올릴 수 있다. 결합 알고리즘 - JOIN 연산을 수행할 때 옵티마이저가 선택하는 알고리즘 - Nested Loops - Hash - Sort Merge의 크게 3가지가 있다. - 참고로 MySQL은 Nested Loops만을 공식적으로..
SQL 레벨업 01
·
Review
DBMS의 개략적인 구조 1. 쿼리 평가 엔진 - Pareser + Optimizer + 플랜 실행 + 연산 평가 - 입력받은 SQL 구문을 분석하고, 어떤 순서로 기억장치의 데이터에 접근할지 결정해 실행 계획을 세움 2. 버퍼 매니저 - DBMS의 버퍼를 관리한다. 3. 디스크 용량 매니저 - 어디에 어떻게 데이터를 저장할지를 관리한다. - 디스크의 읽고 쓰기를 제어해 데이터를 영구적으로 저장하는 것을 보조한다. 4. 트랜잭션 매니저 & 락 매니저 - DBMS의 내부의 추상화된 실행 단위인 트랜잭션을 관리해 정합성을 유지하고, - 필요하다면 데이터에 락을 걸어 다른 사람의 요청을 대기시킨다. 5. 리커버리 매니저 - 장애, 혹은 데이터가 손상되었을 때 이를 복구하는 기능을 제공한다. - 백업, 복구 등..
101. Symmetric Tree
·
Algorithm
Symmetric Tree - LeetCode Level up your coding skills and quickly land a job. This is the best place to expand your knowledge and get prepared for your next interview. leetcode.com 1. in-order 접근(실패) class Solution: def isSymmetric(self, root: TreeNode) -> bool: trace = [] def dfs(cur): if not cur: trace.append(None) else: if not (not cur.left and not cur.right): dfs(cur.left) trace.append(cur.v..
Docker 03
·
Programming
어떻게 컨테이너의 변경 사항 및 데이터를 저장할 수 있을까? - 컨테이너는 하나의 프로세스라고 생각할 수 있다. - 프로세스가 완벽히 종료되어 사라지면 프로세스의 데이터도 같이 사라진다. - 이렇게 컨테이너 내부에서 생성되거나 변경된 파일에 대한 데이터를 관리해야 하는 니즈가 있다. - Docker는 Container Layer의 문제점을 개선한 Docker Volumne이라는 기술로 이것을 해결했다. R/W Container Layer - 컨테이너 내에서 생성/변경된 모든 파일을 Read-Write 가능한 Container Layer에 저장한다. - Docker는 Copy-on-Write 방식으로 변경 사항을 관리한다. - 컨테이너는 이미지의 연속된 층인데 컨테이너 자체에서 관리하는 층(R/W laye..
155. Min Stack
·
Algorithm
Min Stack - LeetCode Level up your coding skills and quickly land a job. This is the best place to expand your knowledge and get prepared for your next interview. leetcode.com 1. event를 flag로 해서 처리하는 풀이 from heapq import * class MinStack: def __init__(self): self.stack = [] self.min_stack = [] self.events = [0] * 30000 self.event_cnt = 0 def push(self, val: int) -> None: self.stack.append((val, ..
160. Intersection of Two Linked Lists
·
Algorithm
Intersection of Two Linked Lists - LeetCode Level up your coding skills and quickly land a job. This is the best place to expand your knowledge and get prepared for your next interview. leetcode.com 1. 객체 ID값을 이용한 분기점 반환 class Solution: def getIntersectionNode(self, headA: ListNode, headB: ListNode) -> ListNode: a_id_list = [] b_id_list = [] p_a, p_b = headA, headB while p_a: a_id_list.append(id..