회사/DB 14

[SQL Server] String -> NVARCHAR / VARCHAR

문제 상황디비버에서 쿼리를 조회할 때 보다 로컬을 실행해 화면에서 조회할 때 시간이 훨씬 오래걸렸다.단순히 노트북 사양 문제인가 했는데, SQL Server 문제일 수도 있는 부분을 수정하니, 속도가 일부 개선되었다. SQL Server JDBC Driver는 String type의 파라미터를 기본적으로 NVARCHAR로 매핑한다.이 경우 VARCHAR 타입의 컬럼인데 VARCHAR가 아닌, NVARCHAR로 인식되기 때문에 인덱스를 타지 않고 성능저하가 발생하게 된다.MS 공식문서에 따르면 데이터 형식 우선순위가 있다고 한다.그래서 우선순위가 높은 쪽으로 묵시적 형변환이 일어나는 것이다. 일전에 다른 문제에서 접한 적이 있는데, 아래와 같은 쿼리를 작성했을 때WHERE 123 = '123'우선순위가 높..

회사/DB 2025.02.21

[MSSQL] CROSS APPLY, OUTER APPLY

CROSS APPLY와 OUTER APPLY는 JOIN과 동일한 결과값을 반환할 수 있다.하지만, JOIN과는 다른 실행계획을 가질 수 있고, JOIN 으로는 수행 불가능한 구문을 수행시켜주기도 한다.서브 쿼리에 외부 테이블의 컬럼을 인자로 사용할 수 있다.테이블 반환함수의 인자값으로, 외부 테이블의 컬럼을 적용해 JOIN과 같은 결과값을 낼 수 있다.상황에 따라 JOIN보다 더 좋은 성능을 발휘할 수 있다. CROSS APPLYSELECT * FROM TBL_A CROSS APPLY ( SELECT * FROM TBL_B ) WHERE ...  OUTER APPLYSELECT * FROM TBL_A A OUTER APPLY ( SELECT * FROM TBL_B WHERE A.COL1..

회사/DB 2025.02.04

[DB] Index와 Column, 비교연산자

ColumnMybatis에서 WHERE절을 작성할 때, COLUMN_A = #{VAR_A}를 작성하는데IFNULL(COLUMN_A, 'A') = #{VAR_A}라고 작성하는 경우가 있을 것이다.이처럼 조건식에서 왼쪽 컬럼의 값을 수정할 경우, 이 컬럼이 만약 INDEX에 설정된 컬럼이라면 INDEX를 타지 않게 된다.인덱스를 타지 않는다면 쿼리 속도에 영향을 미치겠죠?쿼리를 작성할 때, 항상 PK와 인덱스에 해당하는 컬럼인지를 고려해서 작성하자. 비교연산자비교연산자를 사용할 땐, DATA TYPE을 명시적으로 맞춰주다.만약, 비교하는 DATA TYPE이 다르다면, 어떤 컬럼의 TYPE을 바꿔서 맞출 지 알 수 없다.무조건 왼쪽과 오른쪽 중 한쪽으로 맞추는 것이 아니기 때문이다.그렇다면 의도했던 결과가 나..

회사/DB 2024.12.16

[DB / MSSQL] LOB (Large Object / 대형 오브젝트)

문제상황데이터가 얼마 없는 테이블의 데이터를 조회하는데, 시간이 너무 오래 걸렸다.그런데 분명 레코드 수가 적은데 테이블 용량이 GB이다. 무언가 이상했다.컬럼들을 확인해보니 한 컬럼이 LOB 이기 때문이었다.컬럼의 DATA TYPE이 varchar(MAX) 로 정의돼있었다.LOB를 조회하기 위해 ACCESS를 해야하기 때문에 시간이 오래 걸렸던 것이다. LOB (Large Object)LOB는 DB에 저장되는 다양한 타입의 데이터들 중 구조화되지 않은 용량이 큰 데이터 (TEXT, 그래픽, 이미지, 비디오, 사운드 등) 를 처리하기 위한 타입이다.DB 내부에선 LOB 형식의 컬럼을 생성하고, 이곳에 데이터의 실제 위치를 가리키는 LOCATOR를 저장한다.DB 외부에선 BFILE을 사용한다. LOB 종류..

회사/DB 2024.10.29

[DB / MSSQL] 날짜조회 BETWEEN

BETWEEN 주의D1 부터 D2 까지의 날짜에 포함되는 데이터를 조회하려고 한다.이 때 WHERE절을 어떻게 작성해야 할지 보자.여기서 D1, D2는 DATETIME2 타입으로  yyyy-MM-dd HH:mm:ss[.nnnnnnn] 형식이다. SELECT *FROM your_tableWHERE your_date_column BETWEEN #{D1} AND DATEADD(DAY, 1, CAST(#{D2} AS DATE))DATEADD()는 #{endDate}에 하루를 더해 yyyy-MM-dd 00:00:00 형태로 처리된다.BETWEEN을 사용해 날짜를 비교할 경우, 시작과 종료값을 '포함해' 비교한다.즉, 하루를 더한 yyyy-MM-dd 00:00:00 도 포함해 데이터를 조회하게 된다.BETWEEN을..

회사/DB 2024.10.28

[DB] 파티션 프루닝 (PARTITION PRUNING)

이건 인덱스랑 파티션 정리한 후 마저 할게요 https://seoulforest.tistory.com/entry/Partition-Pruning-%ED%8C%8C%ED%8B%B0%EC%85%98-%ED%94%84%EB%A3%A8%EB%8B%9D 쉽게 정리하면 " data-og-host="seoulforest.tistory.com" data-og-source-url="https://seoulforest.tistory.com/entry/Partition-Pruning-%ED%8C%8C%ED%8B%B0%EC%85%98-%ED%94%84%EB%A3%A8%EB%8B%9D" data-og-url="https://seoulforest.tistory.com/entry/Partition-Pruning-%ED%8C%8C%..

회사/DB 2024.10.28

[DB / MSSQL] COLLATION (정렬방식)

Collation (정렬방식)주로 DBeaber를 사용하는데 아래와 같은 설정을 볼 수 있다.GPT에게 물어보니 아래와 같이 설명해준다.Korean_Wansung : 한글 완성형 문자셋을 사용한 정렬 방식이다. 한글 음절을 미리 정의해 Unicode와 달리 한글 자모가 분리되지 않고, 완성된 글자로 저장된다.CI (Case Insensitive) : 대소문자를 구별하지 않는다.AS (Accent Insentive) : 악센트나 발음 기호를 구별하지 않는다. ex) é와 e는 동일하게 취급이렇게 데이터베이스의 정렬방식을 지정하는 것이다. COLLATE 명령어COLLATE 절을 이용해 컬럼 || 식의 정렬방식을 명시적으로 지정, 변경할 수 있다.-- 컬럼 정렬방식 지정ALTER COLUMN [COLUMN_N..

회사/DB 2024.10.16

[DB / MSSQL] BEGIN, COMMIT, ROLLBACK TRAN

참고https://learn.microsoft.com/ko-kr/sql/t-sql/language-elements/begin-transaction-transact-sql?view=sql-server-ver15 BEGIN TRANSACTION(Transact-SQL) - SQL Server명시적 로컬 트랜잭션의 시작 위치를 표시합니다. 명시적 트랜잭션은 BEGIN TRANSACTION 문으로 시작되어 COMMIT 또는 ROLLBACK 문으로 끝납니다.learn.microsoft.com BEGIN TRAN ... COMMIT || ROLLBACKMSSQL 기본 설정 : AUTO-COMMIT이다.INSERT, UPDATE, DELETE 명령문을 사용 후 자동으로 COMMIT이 되면, 실수한 경우 ..

회사/DB 2024.10.16