본문 바로가기
반응형

IT/Database112

[SQL 쿼리 튜닝] OR -> UNION ALL 변환 데이터베이스를 사용하다보면 많은 데이터를 갖고 있는 테이블에는 조회를 위해서 인덱스가 필요할 경우가 있다. 하지만 인덱스와는 별개로 쿼리를 좀더 튜닝을 하여 DBMS가 잘 읽을수만 있게 짜주는것만으로도 효과를 낼수가 있다. 요즘엔 DBMS 옵티마이저가 많이 똑똑해져서 실행계획을 잘 만든다고 들었다. 하지만 직접 명시해주는것만큼 확실한 방법은 없을것이다. 이번 포스팅에서는 쿼리 내의 OR조건을 UNION ALL 로 변환을 하며 쿼리를 개선하여 인덱스를 탈수 있도록 변경을 해볼 것이다. 먼저 UNION 과 UNION ALL 에 대한 개념은 아래 참고 포스팅을 참고 바란다. 일단 우선 UNION 과 UNION ALL 의 차이를 다시 소개하면. UNION은 중복제거 + 정렬까지 들어가게 된다. 즉, 연산이 필요.. 2023. 6. 26.
데이터베이스 테이블 합집합, 차집합(UNION, UNION ALL, MINUS, INTERSECT, EXCEPT) 데이터베이스를 사용하면 join이나 서브쿼리를 통해서 테이블을 합치곤 한다. 하지만 이렇게 합치는것은 수평적으로 하여 컬럼이 많아지도록 합치는 것이고, 오늘 소개할 UNION, UNION ALL, MINUS는 수직적으로 레코드들이 합쳐지는 것이다. Join에 대해서는 아래 참고 포스팅을 참고 바란다. UNION 과 UNION ALL의 차이 UNION은 두 개의 테이블을 하나로 만드는 연산이다. 두 개 테이블의 컬럼 수, 컬럼 데이터 형식이 모두 일치해야한다. UNION 연산은 두 개의 테이블을 하나로 합치면서 중복된 데이터를 제거한다. 그래서 UNION은 정렬을 발생시킨다. UNION ALL은 중복을 제거하거나 정렬을 유발하지 않는다. 둘 다 먼저 선행된 테이블의 이름을 기준으로 출력이되게 된다. 이에 .. 2023. 6. 25.
LAG, LEAD 함수에 대해서 데이터베이스를 사용할때 LAG , LEAD 함수에 대해서 들어본 적이 있는지. 먼저 사전 풀이 그대로 사용한다면 LAG - 뒤떨어지다. LEAD - 이끌다. 라는 의미를 가지고 있다. 그럼 이 단어를 데이터베이스에서 적용을 하면 어떻게 될까? 이전의 값과 이 후의 값을 나타낼수 있다. 먼저 사용법은 아래와 같다. LAG/LEAD(컬럼명 {,offset} {,default}) OVER({PARTITION BY} ORDER BY) offset, default, partition by는 생략가능, order by는 생략 불가!! LAG 함수 : 이전 행 값 return LEAD 함수 : 다음 행의 값 return offset : 값을 가져올 행의 위치, default 1 default : 값이 없을 경우 지정.. 2023. 6. 21.
upsert 란? 데이터베이스에서 사용되는 DML 을 보면 insert / select / update / delete 에 대해서 많이 다뤄봤을것이다. 오늘 소개할 구문은 일반적인 DML은 아니고 , 또한 모든 DBMS 마다 존재하는것이 아니라서 잘 모를수도 있지만 알고있다면 효율적으로 작성이 가능한 문법인 UPSERT 이다. 일반적으로 많이 사용하는 ORACLE, MYSQL/MARIA, POSTGRESQL 에 대한 UPSERT 문법에 대해서 정리하면 다음과 같다. ORACLE의 경우 UPSERT MERGE INTO dest_table_name [alias] USING (source_table_name or view or subquery) [alias] ON (join condition) WHEN MATCHED THEN .. 2023. 6. 12.
CLOB 타입 데이터베이스에서 테이블에 데이터 형식을 정해주곤 한다. 대표적으로는 Varchar / Integer / Date 등의 자료형이 있는데, 오늘 다뤄볼 내용은 CLOB, BLOB 등 LOB 타입이다. 일단 사용에 대해서는 CREATE TABLE TEST_TABLE ( ID VARCHAR(10), NAME CLOB ); 이렇게 지정을 해주면 된다. 그럼 CLOB 와 BLOB에 대해서 어떤 자료형인지 알아보면, 데이터 타입 설명 CLOB 문자형 대용량 객체 고정길이와 가변길이 문자집합 지원 NCLOB 유니코드를 지원하는 문자형 대용량 객체 BLOB 이진형 대용량 객체 BFILE 대용량 이진 파일에 대한 위치,이름 저장 이런 설명이다. LOB이란 Large Object의 약자로 대용량 데이터를 저장할 수 있는 데.. 2023. 5. 31.
데이터베이스 최적화 방법 2 (23.04.28) 지난 포스팅은 외부에서 받아온 최적화 방법들이 정리 되었었다. 자세한 내용은 아래 참고 포스팅 참고 바란다. 이번 포스팅에서는 내가 정리한 내용을 추가로 적어두려고 한다. (중복된 내용 존재할수 있음) - JOIN NL -> 인덱스 있을떄 sort merge -> 동등 / 비동등 일떄 hahs -> 동등일때 - function 은 return 필수 / procedure는 필수 아님 - findbyid 할 경우 엔티티 전체가 나와서 만약 id 만 원할 경우나 인덱스 있을경우를 원하면 해당 컬럼만 다루면 테이블 스캔 안하고 인덱스 스캔만 - 만약 where a.id = b.id and a.id=1 인걸 inlineview로 넣으면 b에도 10을 넣어주기 - x+2>5 보단 바인딩 변수는 혼자 두기 x>3 으.. 2023. 4. 29.
데이터베이스 최적화 방법 1 (23.04.27) 옵티마이저의 종류와 DBMS 종류에 따라 다를순 있지만 일반적인 쿼리 튜닝방법에 대해서 정리한 글을 공유하려한다. 저장해두고 보기 위해 글 사용합니다. OR 연산자의 사용을 피하라. 대부분의 경우에 WHERE 절의 조건에 OR 연산자를 가지고 있다면 SQL은 인덱스를 사용하지 않는다. 이러한 명령문은 두가지 방법으로 다시 작성할 수 있는데, 어떤 환경에서는 IN 연산자를 가지고 있는 조건으로 대치하거나 UNIO으로 연결된 두개의 SELECT 문을 사용하여 전체 명령문을 대치할 수 있다. 이렇게 대치하면 SQL은 인덱스를 사용할 것이다. 주의사항 : OR 연산자가 UNION으로 대체 될 때, 자동적으로 중복된 모든 행을 삭제한다. 원래의 SELECT 문에서 기본키를 포함하고 있다면 상관없다. WHERE H.. 2023. 4. 29.
com.mysql.cj.jdbc.Driver와 com.mysql.jdbc.Driver 차이 (23.04.25) 데이터베이스와 연동하는 개발을 하기 위해서는 jdbc를 필수적으로 필요로 한다. 그중 오픈라이선스로 무료인 mysql을 개인으로는 많이 사용하고 필자 역시 사용하는데, driver가 이름은 같지만 도메인 자체가 다른 제목과 같은 두 드라이버에 대한 차이를 알아보려고 한다. - com.mysql.cj.jdbc.Driver - com.mysql.jdbc.Driver 둘의 차이는 사용하는 mysql connector의 버전이다. com.mysql.jdbc.Driver는 Connector/J 5.x 버전까지 사용되었고 Connector/J 8.x 버전부터는 com.mysql.cj.jdbc.Driver를 사용해야 한다. 실제로 mysql-connector-java-8.0.22.jar 파일을 디컴파일러로 까보면 패.. 2023. 4. 28.
[Tibero] view / procedure 조회 이전 포스팅에서 oracle에서 procedure 조회 관련해서 다룬 적이 있다. 아래 참고 포스팅을 참고 바란다. tibero에서 view랑 procedure 조회는 아래와 같이 가능하다. 프로시저 조회 방법 SELECT * FROM DBA_SOURCE WHERE owner = 'owner 명' AND type = 'PROCEDURE' AND name = 'procedure 명'; 뷰 조회 방법 SELECT * FROM USER_VIEWS WHERE VIEW_NAME = 'view 명'; 참고 포스팅 https://thenicesj.tistory.com/521 [Oracle] procedure 조회 전 포스팅에서 procedure와 function에 대해서 차이와, 선언하는법을 다뤘다. 자세한 내용은 .. 2023. 4. 22.
반응형