0314 TIL

looggi·2023년 3월 14일
0

TILs

목록 보기
35/114
post-thumbnail

데이터베이스

저장 프로시저

  1. 저장 프로 시저(stored procedure)를 정의하십시오.

자주 반복적으로 사용되는 쿼리를 함수로 만들어서 SQL 실행 비용을 줄이고 네트워크 부하도 줄여준다
대표적인 예로 페이징 쿼리가 있습니다.

SP의 장점

<옵티마이저가 SQL을 분석 후 실행가능한 코드로 변환>하는 데에 드는 비용을 줄일 수 있다

  • 최초 SP실행 시 바이트코드로 캐시에 저장되어 이후 SP를 실행할 때 속도가 빨라진다
    • 라이브러리 캐시: 옵티마이저가 SQL 파싱, 최적화, Row 소스 생성 과정을 거쳐 생성한 SP를 반복 재사용할 수 있도록 캐싱해두는 메모리 공간

SQL 서버 성능 향상 & 재사용성

하나의 요청으로 여러 SQL문을 실행할 수 있어 데이터 전송량이 줄어 네트워크 부하를 줄일 수 있음

쿼리 변경시 SP파일만 바꿔주면 된다 → 유지보수가 용이

접근 권한을 테이블 전체가 아닌 SP단위로 부여할 수 있기때문에 보안이 강화된다

일반 쿼리문 vs SP

⚡SQL 실행 과정

파싱 (구문 분석 -> 개체 이름 확인 -> 사용 권한 확인) -> 최적화 -> 컴파일 및 실행계획 등록(캐시) -> 실행

⚡SP 실행 과정

  1. 정의
    구문 분석 -> deferred name resolution -> 생성 권한 확인 -> 시스템 테이블에 등록
    - deferred name resolution: 실행 시점에 이미 존재하는 테이블인지 확인함-> 정의시에는 확인을 하지 않음
    - 시스템 테이블에는 SP 이름과 코드가 등록됨
  2. 실행
    구문 분석X -> 사용 권한 확인 -> 최적화 -> 컴파일 및 실행계획 등록 -> 실행

➡️ 일반 쿼리문과의 차이

일반 쿼리가 캐싱되는 것(쿼리문이 완전히 일치해야함)과는 다르게 SP는 같은 로직에서 값만 변경해서 함수처럼 사용할 수 있어 값이 변경되어도 캐싱된 SP를 사용할 수 있다

SP의 문제점

각 쿼리에 최적화되지 않은 실행계획

  • 최초 수행시 최적화가 이루어져 실행계획이 수립되면 인덱스의 사용여부가 결정됨
    이때 최적화에 인덱스가 필요했다면 이후에는 필요없어도 사용하게 됨
    (가져올 데이터가 많을 때 인덱스를 사용하면 DB성능이 나빠짐)

문자 및 숫자 연산이 java/c 보다 느리다

데이터 분석이 어렵다

  • 이력관리, APP에서 호출해서 사용하는 경우 추적이 어렵다

DB확장이 어렵다❓

https://devkingdom.tistory.com/323
https://pangtrue.tistory.com/196
https://velog.io/@sweet_sumin/%EC%A0%80%EC%9E%A5-%ED%94%84%EB%A1%9C%EC%8B%9C%EC%A0%80-Stored-Procedure


  1. 인덱스 헌팅으로 무엇을 이해하고 있습니까?

쿼리 성능과 데이터베이스 속도를 향상시키는 데 도움이 되는 인덱스 수집을 강화하는 프로세스


  1. 인덱스 헌팅을 사용하여 쿼리 성능을 향상시키는 방법은 무엇입니까?❓

인덱스 헌팅을 사용하면 인덱스 및 테이블에 대한 관찰을 통해 각 경우에 맞는 DB성능 향상 방법을 통해 옵티마이저를 사용하거나 인덱스와 쿼리 분포도의 성능을 체크하고 데이터베이스 튜닝을 하는 등의 방법을 사용함으로써 쿼리 성능을 향상시킬 수 있습니다

https://www.ambitionbox.com/interviews/mphasis-question/dbms-question-how-does-index-hunting-help-in-improving-query-performance-jv7MeX2l?campaign=company_interview_page_view_answer
https://www.glassdoor.co.in/Interview/How-does-Index-hunting-help-in-improving-query-performance-QTN_2216104.htm


  1. 데이터베이스에서 다양한 유형의 관계는 무엇입니까?

1:1, 1:다, 다:다 관계가 있습니다
1:1은 하나의 테이블이 다른 하나의 테이블과 1:1로 연결된 경우를 말하며 유저와 유저 프로필의 관계가 이에 해당됩니다
1:다는 하나의 테이블이 다른 하나의 테이블에 해당하는 객체를 여러개 가질 수 있는 경우를 말합니다. 유저와 게시물/댓글의 관계가 이에 해당됩니다.
다:다는 하나의 테이블에서 나온 여러 객체가 다른 테이블의 여러 객체와 연결되어있는 경우입니다. 각 테이블의 입장에서 1:다 관계로 생각할 수 있습니다. 좋아요/ 팔로우 기능이 이에 해당됩니다.
장고에서는 MTM필드 생성시 스루테이블이 자동 생성되고, SQL에서는 JOIN테이블을 만들어 관리합니다

테이터베이스 관계 유형

  • 관계차수
    • 1:1
    • 1:다
    • 다:다 두 개의 테이블 + 스루테이블(=중간 테이블, 접합테이블, 교차 참조테이블)
  • 선택관계
    • 선택적 관계: 하나의 엔티티가 다른 엔티티에 속할 수도 있고 속하지 않을 수도 있음
    • 강제적 관계: 하나의 엔티티다 반드시 다른 엔티티에 속함
  • 식별관계
  • 상속관계

https://itwiki.kr/w/%EB%8D%B0%EC%9D%B4%ED%84%B0%EB%B2%A0%EC%9D%B4%EC%8A%A4_%EA%B4%80%EA%B3%84_%EC%9C%A0%ED%98%95
https://velog.io/@gillog/DB-11-1N-NM-%EA%B4%80%EA%B3%84

데이터 베이스 유형

  1. RDBMS
    행(Column)과 열(Row)로 표현되는 테이블간의 관계를 나타낼 때 사용되며, 이렇게 표현된 데이터베이스는 SQL을 통하여 관리 및 접근

  2. NoSQL
    대용량 데이터를 다루거나 데이터 분산 처리에 용이. 유연한 데이터 모델링이 가능. Cloud Computing에 적합
    - Document방식 : Json, XML과 같은 Collection 데이터 모델 구조 사용
    - Key - Value 방식 : Key와 Value의 데이터가 쌍으로 저장되는 가장 단순한 데이터 모델 구조 사용
    - Big Table DB : Key-Value 형에서 발전된 형태인 Column Family 데이터 모델 구조 사용

  3. 계층형 데이터베이스 : 데이터간의 관계가 트리 구조인 데이터 모델 사용

  4. 네트워크형 데이터베이스 : 데이터간의 다양한 관계가 그물망과 같은 모델 사용

https://honeyteacs.tistory.com/19
https://quizlet.com/kr/587074023/%EA%B8%B0%EC%88%A0%EB%A9%B4%EC%A0%91-db-flash-cards/
https://velog.io/@gillog/DB-11-1N-NM-%EA%B4%80%EA%B3%84

프로그래머스 문제 풀기

➡️ 괄호 변환 참고함

# https://school.programmers.co.kr/learn/courses/30/lessons/60058 
# 균형잡힌 괄호 문자열: '(' 의 개수와 ')' 의 개수가 같다
# 올바른 괄호 문자열: '('와 ')'의 괄호의 짝도 모두 맞을 경우

def check(u):
    stack=[]
    for uu in u:
        if uu=='(':
            stack.append(uu)
        else:
            if not stack:
                return False
            stack.pop()
    return True

def solution(p):
    if not p:
        return ''
    p_open,p_close=0,0
    for i in range(len(p)):
        if p[i]=='(':
            p_open+=1
        else:
            p_close+=1
        if p_open == p_close:
            u,v= p[:i+1],p[i+1:]
            break
    if check(u):
        return u+solution(v)
    else:
        answer='('+solution(v)+')'
        for uu in u[1:len(u)-1]:
            if uu == '(':
                answer += ')'
            else:
                answer += '('
        return answer

u,v= p[:i+1],p[i+1:] 이 부분에서 break를 걸어주지 않으면 "균형잡힌 괄호 문자열"로 더 이상 분리할 수 없어야 한다는 조건에 위배됨

profile
looooggi

0개의 댓글