데이터베이스/MSSQL

    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..

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

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

    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 으로 다시 재할당..

    MSSQL (SQL Server) 에서 테이블의 주석 확인하는 방법

    개요 몇몇 DB 관리 도구에서는 테이블 주석을 보기 매우 불편하다. 차라리 쿼리를 날려서 보는 편이 편하다. 쿼리 SELECT A.TABLE_NAME, C.VALUE AS TABLE_COMMENT, A.COLUMN_NAME, A.DATA_TYPE, ISNULL(CAST(A.CHARACTER_MAXIMUM_LENGTH AS VARCHAR), CAST(A.NUMERIC_PRECISION AS VARCHAR) + ',' + CAST(A.NUMERIC_SCALE AS VARCHAR)) AS COLUMN_LENGTH, A.COLUMN_DEFAULT, A.IS_NULLABLE, B.VALUE AS COLUM_COMMENT FROM INFORMATION_SCHEMA.COLUMNS A LEFT OUTER JOIN SY..

    MSSQL (SQL Server) 에서 느린 쿼리 (슬로우 쿼리) 확인하는 방법

    슬로우 쿼리 확인 방법 SELECT TOP 1000 (qs.total_elapsed_time / qs.execution_count) as each_elapsed_time, st.text as query FROM sys.dm_exec_query_stats as qs WITH(NOLOCK) CROSS APPLY sys.dm_exec_sql_text(qs.sql_handle) as st WHERE (qs.total_elapsed_time / qs.execution_count) > 1000000 ORDER BY each_elapsed_time ; MSSQL의 Dynamic Management Views를 이용하는 방식이다. 당연히 elapsed_time 이 높게 잡히는 쿼리가 슬로우 쿼리이다. 레퍼런스 레퍼런스..

    SQL Server, DB 인덱싱 간단 정리

    이 글은 천천히 차근차근 읽으시는 것을 추천드립니다. 처음 접하면 내용이 매우 어렵습니다. DB Server 인덱싱에 대한 간략한 설명 참고링크 인덱싱 했을 때 장점 데이터 검색이 매우 빠르다. 데이터의 중복이 방지된다. (Primary key, Unique) LOCK 이 최소화 된다. 그와 동시에 동시성이 증대된다. 인덱싱 했을 때 단점 물리적인 공간을 차지한다. 기존의 데이터를 복사해 인덱싱하기 때문에 테이블의 소비 용량이 2배가 된다. 인덱스에 대한 유지/관리 부담이 생긴다. 어떤 테이블에 어떤 인덱스가 있는지 잘 관리해야 한다. 데이터가 적다면 유지/관리 부담이 더 클 수 있다. 데이터가 매우 작은 경우, 인덱싱 장점이 별로 쓸모가 없다. 인덱싱에 따른 테이블 구조의 3가지 형태 (힙, 클러스터형..

반응형