데이터베이스

    MSSQL 내장함수 STUFF 란?

    SQL Server stuff() 내장 함수란? 기존의 문자열에 새로운 문자열을 끼워넣고 싶을 때 사용한다. 양식 STUFF ( character_expression , start , length , replaceWith_expression ) character_expression: 기존의 문자열 varchar(max) 혹은 nvarchar(max) 유형이 아니라면, 8000 byte 까지만 허용 start: 시작 위치 1부터 시작, 1이 가장 첫번째 글자 앞 음수나 0을 넣으면, 함수가 NULL 을 반환 length: 삭제할 문자의 길이 start 지점 뒤에 있는 글자 중 원하는 만큼 지울 수 있다. replaceWith_expression: 끼워넣을 문자열 예시 SELECT STUFF('SQL..

    SQLite 직접 만들어보기 Step 3 - 메모리에서만 동작하는 단일 테이블 DB 만들어보기

    원본 글 https://cstack.github.io/db_tutorial/parts/part3.html 많은 제약이 걸려있는 DB 구성해보기 종래엔 복잡한 DB 가 완성되어 있겠지만 시작할 땐 작게 개발을 시작하는 전략을 사용한다. start small 어떤 제약이 걸리게 되는가? 단 두가지 연산만 지원한다. insert: 행을 삽입한다. select: 모든 행을 출력한다. 오직 메모리에만 데이터를 올린다. 디스크에 영속화 시키지 않는다. 하드코딩된 단 하나의 테이블만 제공한다. 하드코딩된 단일 테이블의 구조 id: integer username: varchar(32) email: varchar(255) 앞으로 사용할 insert 명령어의 구성 insert 1 jakeseo foo@bar.com 앞에서..

    SQLite 직접 만들어보기 Step 2 - 세상에서 가장 간단한 SQL 컴파일러와 가상머신 만들어보기

    원본 글 https://cstack.github.io/db_tutorial/parts/part2.html SQLite 의 앞단 (front-end) SQLite 의 앞단은 문자열을 구문 분석(parsing) 하고 바이트 코드라는 내부 표현을 뱉어내는 SQL 컴파일러이다. 바이트 코드는 가상 머신(virtual machine) 으로 넘어가 가상 머신에 의해 실행된다. 다시 아키텍처 살펴보기 SQLite 공식 사이트에서 제공하는 아키텍쳐 문자열을 먼저 바이트 코드로 만든 뒤에 바이트 코드를 가상머신에서 실행하는 2가지 절차를 따르면 무슨 장점이 있을까? 2가지 파트를 각각 구현하기 때문에 각 파트에 대한 복잡도를 낮출 수 있다. 가상 머신은 SQL 문법 에러에 대해 걱정하지 않아도 된다. 일반 쿼리를 한번 ..

    SQLite 직접 만들어보기 Step 1 - 매우 간단한 REPL 만들어보기

    원본 글 https://cstack.github.io/db_tutorial/parts/part1.html DB 동작에서 의문점 디스크와 메모리에서 데이터는 어떤 포멧으로 저장되는가? 데이터는 언제 메모리에서 디스크로 이동하는가? 테이블당 기본키 (primary key) 는 왜 하나여야만 하는가? 트랜잭션 롤백은 어떻게 동작하는가? 인덱스는 어떻게 포맷되는가? 풀 테이블 스캔 (full table scan) 은 언제 어떻게 수행되는가? prepared statement 는 어떤 포맷으로 저장되는가? SQLite SQLite 는 작고 내부 구현에 대한 참고자료도 풍부해 공부하기 좋다. 프론트엔드 (front-end) 토크나이저 (tokenizer) 파서 (parser) 코드 생성기 (code generato..

    SQLite 직접 만들어보기 Step 0 - SQLite 아키텍처 살펴보기

    SQLite 직접 만들어보기 Step 0 - SQLite 아키텍처 살펴보기 SQLite 아키텍처 다이어그램 개요 SQLite 의 동작을 간단히 설명하자면, SQL 텍스트 정보를 바이트 코드로 컴파일하고 가상 머신에서 바이트코드를 동작시킨다. sqlite3_prepare_v2() 는 인터페이스로 SQL 텍스트를 바이트코드로 변환시키는 컴파일러 역할을 한다. sqlite3_stmt 객체는 단일 SQL 문을 구현하는 바이트코드 프로그램에 대한 컨테이너이다. sqlite3_step() 인터페이스는 바이트코드 프로그램을 가상머신으로 넘기고 프로그램이 완료될 때까지 실행한다. 완료의 의미는 아래 3가지 중 하나이다. 결과를 반환한다. 에러를 던진다. 인터럽트 된다. 인터페이스 (Interface) 아키텍처 그림에서..

    MSSQL (SQL SERVER) 임시 테이블 생성 방법

    임시 테이블과 SELECT INTO 구문에 대한 간략한 설명 임시 테이블 생성 쿼리 SELECT * INTO #TEMP_TABLE FROM TABLE; 위와 같은 sql 구문으로 임시 테이블을 생성할 수 있다. SELECT INTO 구문이란? 테이블을 조회한 결과를 새로운 테이블에 넣는 구문이다. 참조 링크 테이블 이름 앞에 #이 붙는 이유 #TEMP_TABLE인 이유 위와 같이 #을 붙여 #TEMP_TABLE 이라는 테이블을 생성하면, 이 테이블은 실제로 DB에 생성되는 것이 아니라 현재 세션에서만 접근 가능한 임시 테이블이 된다. 참고로, 세션이란 해당 DB에 로그인 된 상태 동안만 잠시간 갖는 저장 공간이라고 생각하면 된다. 이렇게 임시 테이블을 만들면 나중에 MERGE 하는 방식으로 데이터를 끼워..

    외래키 제약조건 (Foreign Key Constraints) 이란?

    외래키 제약조건 (Foreign Key Constraint) 이란? DB 내부 User 테이블에 다음과 같은 데이터가 있다고 가정하자. 데이터는 임의로 JSON 형태로 표현한다. [{ id: 1, username: 'jake' },{ id: 2, username: 'jack' }] 그리고 Comment 테이블에는 다음과 같은 데이터를 넣으려고 한다. { id: 1, text: '첫번째 댓글입니다!' userId: 3 } 보통 Comment 테이블에 위와 같은 데이터를 넣는다고 가정할 때, join 과 같은 SQL 문을 통해 userId 에 있는 3 이라는 숫자를 User 테이블에 매핑시켜서 해당하는 username 을 찾으려고 생각한다. 그런데 넣으려는 시점인 지금 사실 ID 가 3 인 유저는 현재 존재..

    플래닛 스케일 (Planet Scale) 정리

    PlanetScale 이란? MySQL 과 호환되는 Serverless Database Platform 이다. Serverless Database Platform 이다. 개발자 및 개발자 작업 흐름에 따라 디자인되었다. MySQL 8.0 위에서 작동하여 MySQL 8.0 의 안정성과 오픈소스인 Vitess 의 확장성을 갖춘 완벽히 관리되는 데이터베이스를 10초 안에 배포한다. DB 에 대한 배포, 브랜치, 쿼리를 UI 에서 바로 할 수 있다. 원한다면 CLI 를 다운받아서 실행할 수도 있다. built-in connection pooling 이 있어서 connection limit 을 경험할 일이 없다. Vitess 는 MySQL 의 수평적 스케일링을 제공하는 DB 클러스터링 시스템이다. Youtube ..

    SQL SERVER (MSSQL) 날짜와 날짜 사이 모든 날짜 구하기

    쿼리만 보기 아래에는 내가 겪은 문제와 해결과정을 잡다하게 써놨다. 그런데 검색을 통해 들어온 사람들은 쿼리만 빨리 보고싶을 것 같아서 작성한 쿼리를 맨 위에 올려둔다. 아래의 쿼리를 실행시키면 바로 결과가 나올 것이다. declare @st_search datetime='2022-12-01' declare @ed_search datetime='2023-02-28' ;WITH Nums AS ( SELECT n = ROW_NUMBER() OVER (ORDER BY [object_id]) FROM sys.all_columns ) SELECT HIST_YY, HIST_MM, HIST_DAY, concat(hist_yy, '-', RIGHT('0' + C..

    MSSQL 에서 1~10000 까지의 숫자 반복하여 출력하기

    개요 SQL 구문을 입력하다보면 가끔 '어디 FOR 문 같은 거 없나..?' 생각이 들 때가 있다. 그럴 때 약간의 흑마법을 이용할 수 있다. SQL ;WITH Nums AS ( SELECT n = ROW_NUMBER() OVER (ORDER BY [object_id]) FROM sys.all_columns ) 위와 같이 SQL 을 작성하면 1~30000 까지의 숫자를 반복하여 출력할 수 있다. 이를 다양한 곳에 응용할 수 있다.

    MSSQL 실무 쿼리 튜닝법

    개요 실무에서 모든 이론을 천천히 공부해서 쿼리를 튜닝하기엔 너무 늦다. 간단한 규칙을 지키며 최대한 튜닝해보자. 해야되는 것 PLAN 보기 PLAN 보기는 모든 튜닝 작업 중 가장 선행해서 이루어져야 할 작업이다. 이는 의사로 치면 치료 전에 진단을 먼저 해보는 것과 비슷하다. 인덱스 인덱싱은 쿼리의 빠른 실행에서 가장 중요한 역할을 한다. DB 는 순서가 있는 데이터를 검색할 때 가장 빠르다. 순서가 있는 데이터는 Binary Search 가 가능하고, Binary Search 가 가능한 순간 O(N) 의 복잡도는 O(log N) 으로 줄어든다. 서비스에서 많이 이용되는 검색조건이 있다면, 반드시 인덱스를 걸어주도록 하자. 조건문 유심히 보기 쿼리가 느린 이유는 보통 SELECT 에서 어떤 것을 선택..

    SQL Server 에서 인덱싱을 제대로 타지 못하는 다양한 이유

    개요 SQL 서버는 다양한 이유로 인덱싱을 타지 않을 때가 있다. 데이터가 많은데 인덱싱을 타지 않는 문제가 발생하면, 디비가 매우 느려진 것으로 착각하기 쉽다. 일반적으로 SQL SERVER 의 VARIABLE 타입 매칭이 잘 되지 않을 때 인덱싱을 타지 않는 문제가 많이 발생한다. 가끔 너무 깊은 DEPTH에 변수가 있을 때 인덱싱을 타지 않는다 여기서 DEPTH 가 깊다고 쓴 것은 서브쿼리 내부의 서브쿼리와 같은 경우를 의미한다. 종종 OPTION(RECOMPILE) 을 이용해 인덱싱을 타게 만들 수 있다. 단, PLAN에서는 인덱싱을 안타는 것으로 보이며 실행할 때만 적용된다. 프로시저의 매개변수를 그대로 이용했을 때 인덱싱을 타지 않는다 VARIABLE 을 새로 선언하고 SET 으로 다시 재할당..

반응형