Oracle - 인덱스를 사용하지 않는 쿼리
·
SQL
배경오라클에서 인덱스를 사용하더라도 인덱스를 사용하지 않는 쿼리가 있다. 현재 프로젝트의 레거시 코드도 확인해보면, 쿼리가 비효율적으로 작성되어 성능 문제가 발생하는 경우가 많았다. 오라클 쿼리를 작성할 때나 쿼리 튜닝할 때 알아두면 좋을 것 같아 정리해본다. 개발 환경Oracle 11gDBeaver 복합 인덱스복합 인덱스의 선행 컬럼을 WHERE 절에서 사용하지 않으면 인덱스가 무시된다.WHERE 절에 사용된 컬럼이 복합 인덱스의 선행 컬럼이 아니라면 INDEX SKIP SCAN과 같은 특수한 상황을 제외하고는 FULL SCAN을 사용한다. 그렇기 때문에 복합 인덱스를 생성할 때 WHERE 절에 자주 포함되는 컬럼을 선행 컬럼으로 두는 것이 좋다.INDEX SKIP SCAN은 복합 인덱스의 선행 컬럼이..
Oracle - 실행 계획으로 복잡한 쿼리 최적화해보기
·
SQL
배경백오피스를 운영하면서 항상 거슬렸던 부분이 있었다. 바로 느리게 로딩되는 주문 관리 페이지다. 원인은 굉장히 오래 걸리는 주문 목록 조회 쿼리였다. 주문 관리 페이지는 고객의 주문 정보, 배송 현황 등 다양하고 복잡한 데이터를 실시간으로 처리하고 표시해야 하는 중요한 화면이다. MD들은 업무 특성상 하루에도 수차례 이 페이지에 접속해야 하는데, 긴 로딩 시간을 감내해야 하는 상황이었다. 이는 단순히 개인의 불편함을 넘어서 전체적인 업무 효율성 저하로 이어질 수 있었다.(라고 생각한다.)그래서 팀에 건의하여 쿼리를 최적화해보기로 했다. 개발 환경Oracle11gDBeaver (Community Edition 24.1) 쿼리 구조쿼리 최적화를 할 때 가장 중요한 건 최적화하려는 쿼리의 역할과 기능을 아는..
MySQL - Incorrect coloumn specifier for column 에러 원인과 해결방법
·
SQL
원인 auto_increment 옵션을 특정 컬럼에 부여했을 때 해당 컬럼의 타입은 int 또는 float이어야 한다. 그 외 타입일 때 해당 에러가 발생한다. CREATE TABLE `POST` ( `POST_ID` varchar(11) NOT NULL AUTO_INCREMENT,-- varchar 타입이 문제 `POST_TITLE` varchar(100) NOT NULL, `POST_CONTENT` text NOT NULL, `POST_AUTHOR_USER_ID` varchar(20) NOT NULL, `POST_REG_DT` datetime NOT NULL, `POST_UPD_DT` datetime NOT NULL, PRIMARY KEY (`POST_ID`) ) SQL Error [1063] [42..
Oracle - 다중 Like (Like In)
·
SQL
기존 서비스에서 검색 기능에 대한 요구사항이 있었다.요구사항은 다음과 같다.복수 검색 가능검색 키워드를 포함하는 결과값 모두 조회ex) kim, lee, park 검색 -> 결과값: kimchanbin, leechanbin, parkchanbin, kimleepark 만약 검색어와 일치하는 결과값만 가져오면 됐다면 IN 연산자를 사용했으면 됐을텐데, 검색어를 포함하는 모든 결과값을 가져와야 했기 때문에 LIKE문을 사용해야 했다. IN 연산자SELECT NAMEFROM USERS WHERE NAME IN ('kim', 'leechan', 'parkchanbin');결과값: parkchanbin  LIKE 연산자SELECT NAMEFROM USERSWHERE NAME LIKE 'kim%'결과값: kimch..
MariaDB - 행 번호 출력하기 ROW_NUMBER() OVER PARTITION BY
·
SQL
오라클에서는 RNUM()을 통해 쉽게 순번에 맞는 행 번호를 출력할 수 있었다. 이번에 JSP로 프로젝트를 진행하면서 MariaDB를 사요하게 되었고 MariaDB에서도 행 번호를 출력할 수 있는 방법에 대해 정리해본다. MariaDB에서는 ROW_NUMBER() OVER() 함수를 사용하면 된다. OVER 안에는 PARTITION BY와 OREDER BY를 사용할 수 있다. PARTITION BY : 결과 집합을 분할하는 데 사용하는 열을 지정한다. PARTITION BY를 지정하지 않으면 모든 행이 단일 그룹으로 취급된다. ORDER BY : 지정된 파티션 내에서 각 행의 고유 ROW_NUMBER가 할당되는 순서를 결정한다. 예제 SELECT ROW_NUMBER() OVER(ORDER BY name ..
Oracle - 줄바꿈(개행) 제거
·
SQL
게시글을 작성하거나 댓글을 작성할 때 줄바꿈(개행)이 들어가는 경우가 있다. 개행이 포함된 데이터를 csv파일로 추출해야 할 일이 있었는데, 글씨가 깨져서 추출되었다. 개행을 제거해서 csv파일을 추출해야 했다. 오라클에서 개행을 제거하는 방법을 가볍게 알아보자 SELECT REPLACE(REPLACE(컬럼명, CHR(10), ''), CHR(13), '') FROM 테이블명 CHR(10) : 라인 피드라고 한다. 현재 커서가 위치한 줄에서 한 칸 아래로 이동한다. (\r) CHR(13) : 캐리지 리턴이라고 한다. 캐리지 리턴은 현재 커서가 위치한 줄의 맨 앞으로 보낸다. (\n) 눈치가 빠른 사람은 알겠지만 위 방법을 반대로 사용하면 개행을 추가해줄 수 있다. UPDATE 테이블명 SET '개행을'|..
DB - DB View에 대해서 알아보자
·
SQL
DB View DB View란 데이터베이스에서 특정한 데이터를 보여주는 가상의 테이블이나 뷰를 말한다. 실제 데이터를 저장하고 있는 테이블에서 필요한 데이터를 가져와서 논리적인 구조로 표현하는 것이다. 특정 정보를 자주 조회해야 하는 경우나 복잡한 쿼리를 View로 만들어서 간편하고 일관성 있게 조회할 수 있다. 가상 테이블: DB View는 실제 데이터를 저장하지 않고, 저장된 데이터를 기반으로 쿼리에 따라 동적으로 생성되는 가상 테이블이다. 그래서 데이터의 물리적 공간이 필요하지 않다. 데이터 추상화: DB View는 데이터베이스에 저장된 복잡한 데이터 중에서 필요한 데이터만 선택적으로 조회할 수 있다. 보안 및 접근 제어: 특정 테이블의 일부 컬럼만을 노출하거나, 데이터의 일부를 가공하여 제공함으로..
Oracle - LISTAGG (특정 컬럼의 데이터들을 하나의 로우에 출력)
·
SQL
LISTAGGLISTAGG 함수는 Oracle에서 특정 컬럼의 데이터들을 하나의 로우에 출력해야 할 때 사용한다.SELECT LISTAGG(가져올 컬럼, 구분자) WITHIN GROUP (ORDER BY 순서컬럼)FROM 테이블 이름 예시SELECT FOOD_NMFROM FOOD_INFO FOOD_NM1피자2치킨3햄버거4스파게티5짜장면6비빔밥7불고기 위 데이터를 LISTAGG 함수를 통해 하나의 컬럼으로 조회해보자SELECT LISTAGG(FOOD_NM, ',') AS FOOD_NMFROM FOOD_INFO FOOD_NM1피자, 치킨, 햄버거, 스파게티, 짜장면, 비빔밥, 불고기 여기서 컬럼을 합치기 전 정렬을 하고 싶다면 WITHIN GROUP 함수를 사용한다.SELECT LISTAGG(FOOD_NM,..
SQL - Oracle과 MySQL 문법 차이
·
SQL
드디어 힘들게 취업을 했다.ㅠㅠ 지금까지는 MySQL만 사용했었는데 회사에서는 Oracle을 사용한다. MySQL과 Oracle에는 약간의 문법 차이가 있는데 공부도 할겸 비교해보자. 데이터 타입 MySQL CREATE TABLE mysql ( id INT, name VARCHAR(50) ); Oracle CREATE TABLE oracle ( id NUMBER, name VARCHAR2(50) ); MySQL 정수형 : INT 가변 길이 정수형 : VARCHAR Oracle 정수형 : NUMBER 가변 길이 정수형 : VARCHAR2 날짜 시간 MySQL SELECT * FROM mysql WHERE created_at > '2023-06-28'; Oracle SELECT * FROM oracle WH..
SQL - 가독성 좋은 SQL 작성하기
·
SQL
요즘IT에서 데이터리안의 윤선미님의 글 'SQL 가독성을 높이는 다섯 가지 사소한 습관'을 정리한 내용입니다. 예약어는 대문자로 작성하자 SELECT, FROM, GROUP BY, HAVING, AS, AND와 같은 SQL 예약어를 대문자로 쓰면 훨씬 잘 읽힌다. 에디터가 예약어를 하이라이팅해주기는 하지만 에디터마다 규칙이 다르기 때문에 대문자로 작성해서 가독성을 높이는 것이 좋다. SELECT tip, total_bill FROM tips select tip, total_bill from tips 행갈이를 자주 하자 쭉 작성한 코드는 작성하기에는 편하지만, 의미를 파악하기 위해서 모든 코드를 다 읽어봐야 한다. 적절히 행갈이를 해준 코드는 에약어만 확인하더라도 작성자의 의도와 코드 구조를 쉽게 파악할 ..
Cold Bean
'SQL' 카테고리의 글 목록