MYSQL vs Oracle 인덱스 차이 MySql과 Oracle은 인덱스 동작 방식에 있어서 약간의 차이가 존재한다. MySql에서는 일반적으로 한번의 쿼리에서는 하나의 인덱스만 사용됩니다. 즉, 여러 인덱스가 걸려있어도 MySQL의 옵티마이저가 쿼리 실행 계획을 결정할때 인덱스의 선택도(카티널리티)를 고려하여 최적의 인덱스 하나만 선택한다. 그렇기때문에 복수 컬럼을 동시에 인덱스를 태우고자 할 경우에는 복합 인덱스 하나만 사용해야 된다. 반면 Oracle은 비교적 더 복잡한 옵티마이저를 갖고 있어, 쿼리 실행 계획을 수립할때 다중 인덱스 조인이나 다중 칼럼 인덱스를 통해 여러 인덱스를 동시에 활영 할 수 있다. 다만, 무조건 Oracle에서도 모든 쿼리에서 여러 인덱스를 동시에 사용하는 것이 아니라 ..
타 업체 혹은 외부에서 데이터를 가져와서 사용할때 인코딩 방식이 다른 경우가 존재하기때문에, 내부적으로 쿼리에서 인코딩을 맞출 필요가 존재합니다. 그럴때 사용하는게 CONVER함수입니다. CONVER함수는 CAST와 비슷하지만, 문자열 인코딩을 설정할 수 있어 조금 더 MYSQL에서 특화된 함수라고 볼 수 있습니다. CONVERT 사용법 기본적으로 CONVERT함수는 CONVERT(EXPRESSION , DATA_TYPE) 으로 표현식이 구성되어있습니다. 하지만, 문자열 인코딩 값을 설정하는 경우에는 콤마 대신 USING 키워드를 사용해 데이터 타입을 구분합니다. CONVERT(EXPRESSION USING DATA_TYPE) SELECT CONVERT('안녕하세요 123 ABC' USING 'euckr..
MYSQL에서 WITH 구문절에 RECURSIVE 키워드를 이용해 재귀 CTE를 구성할 수 있습니다. 기본 재귀 코드 이러한 재귀 CTE는 보통 연속된 값들을 구현하기 위해서 사용합니다. WITH RECURSIVE CTE1 AS ( SELECT 0 RNUM FROM DUAL UNION ALL SELECT RNUM+1 FROM CTE1 WHERE RNUM < 20 ) SELECT * FROM CTE1 위의 쿼리를 수행하게 되면 0부터 20까지의 연속된 숫자를 가지고 있는 데이터를 생성 할 수 있습니다. 타 컬럼 추가 재귀 코드 추가적으로 연속된 값 말고도, 다른 컬럼을 생성할 수 있습니다. 대신에 타 컬럼을 추가할때는 크기 값을 주의 해서 사용해야됩니다!! WITH RECURSIVE CTE1 AS ( SE..
Mysql에서는 WITH 구문 내부안에서 ORDER BY절을 이용하여 정렬을 할 수가 없습니다. 하지만, 임시테이블 내에서 정렬된 순서라든지 값이 필요한 경우가 존재하기때문에 ROW_NUMBER() 함수를 이용해 정렬에 사용합니다. 기본적으로 테이블 데이터들은 PK값이나 인덱스 값을 기준으로 오름차순 정렬되어 있는 경우가 많습니다. 그로인해 정렬을 지정안하고 WITH 구문절에서 데이터를 가지고 와도 오름차순 정렬되어 있는 경우가 존재하지만, 내림차순 정렬을 지정할 경우에는 아래와 같이 ROW_NUMBER 함수를 이용합니다. ROW_NUMBER 이용하기 WITH TEMP_TABLE ( SELECT COL1 , COL2 , ROWNUMBER() OVER(ORDER BY COL2) AS ROW_NUM -- 순..
CTE란? Common Table Expression 의 약어로, 일반적으로 공통 테이블 표현식이라고 번역됩니다. sql 쿼리내에서 임시로 정의된 이름이 지정된 집합으로 간주되는 가상의 테이블로 복잡한 쿼리를 간결하게 작성하고, 재사용 가능한 부분을 정의하며 가독성을 향상시킬 수 있습니다. 이러한 CTE를 Oracle과 Mysql8.0 이상에서는 WITH 구문절로 제공하고 있습니다. WITH(CTE) 구문절 사용법 WITH TABLE_NAME AS ( SELEECT COL1,COL2 FROM TABLE WHERE CONDITION ) SELECT * FROM TABLE_NAME WHERE COL1 = VALUE; 위의 형식으로 ' WITH 테이블명 AS (SELECT ~) ' 의 형식으로 Oracle과 ..
SELECT * TABLE 로 쿼리를 조회 했을때 COLUMN 들을 확인 할 수 있는데, 몇개의 컬럼이 존재하는지 확인 하고싶을 때가 존재합니다. 아래의 쿼리를 통해 TABLE COLUMN 갯수를 확인 할 수 있습니다. SELECT COUNT(*) FROM information_schema.columns WHERE table_name='테이블명';
기존에 Oracle로 쿼리를 짜는게 익숙해진 상태에서 MySql 로 전환하고 있어 오랜만에 정리하고자 글을 쓰려고 합니다 :) 운영 소스에서 보게된 쿼리중 제일 많이 사용하는 부분이 order by Cast (컬럼 as unsigned) 였습니다. 문자열 char형식으로 구성되어 있으나, 해당 컬럼값에 숫자들이 들어가 있으면 정상적으로 정렬되기 어렵기때문에 cast를 이용하여 정렬할때 많이 사용되는 것 같습니다. 그리하여 Cast에 대해 정리를 가져보는 시간을 가져볼께여 Cast 는 형변환을 제공해주는 함수로서, 아래의 형태로 형변환이 가능합니다. BINARY[(N)] CHAR[(N)] [charset_info] DATE DATETIME DECIMAL[(M[,D])] JSON NCHAR[(N)] SIGN..
데이터를 산출해야하는 건이 있었는데 요청건수가 너무 많아서 일반 SQL 문만으로는 불가능했었습니다. COUNT로 대략 건수를 확인해봤을때 14594519 건정도....? 1차로 실행계획을 확인 후에 조인으로 연결된 FROM 절이 PK를 타고 있지 않아서 해당 부분 PK 탈수 있도록 서브쿼리로 변경했습니다 두번 TABLE FULL SCAN하는것을 그나마 한번으로 변경....ㅜ.ㅜ 2차로 힌트절을 이용해보기 위해 관련된 힌트절을 찾다가 PARALLEL 힌트를 알게 되어 공유하고자 합니다. 페러럴 힌트는 병렬 처리 작업을 지원해줍니다. 기본적으로는 한개의 프로세스를 통해서 실행하는데 페러럴 힌트를 이용하면 여러개의 쓰레드에 분산하여 N개의 프로세스로 작업을 수행하기때문에 빠른 속도를 확인해볼 수 있습니다. 하..
DB툴은 PL/SQL Developer 툴을 사용했습니다 SELECT * FROM 테이블명 FOR UPDATE; 상단의 자물쇠 모양을 클릭해주세요 자물쇠 모양이 풀리면서 수정이 가능한 상태로 변경됩니다. 원하는 값을 입력해주세요~ TEST 로 수정했더니 초록색 체크 모양 버튼이 활성화 되었습니다. 변경 내용을 입력 완료 했으면 초록색 체크 모양 버튼을 클릭해주세요 마지막으로 자물쇠 모양 버튼을 다시한번 클릭하면 자물쇠가 잠기면서 수정이 불가능한 상태로 바뀝니다 이제 변경 내용을 커밋만 해주면 수정사항이 반영됩니다~ 저는 PL/SQL Developer 툴에서 제공하는 커밋 버튼을 이용해서 커밋을 진행했습니다 만약에 아래와 같이 기록되어있는 몇천건의 데이터를 INSERT 혹은 UPDATE 해야할때도 사용 가..
힌트에 대한 정의와 사용법 일부를 이전 포스트에 기록을 진행했었다. https://devnoong.tistory.com/4 [DB] 힌트에 대해서 힌트(Hint)란? 오라클 옵티마이저(Optimizer) 대신 개발자가 직접 최적의 실행 경로를 작성해 주는 것이다. 단, 힌트, 인덱스, 조인의 개념을 정확히 알고 사용하지 않은 무분별한 힌트의 사용은 성능 devnoong.tistory.com 이번 포스트에는 사용법과 예제에 대해 조금 더 알아보고자한다. https://livesql.oracle.com/ Oracle Live SQL This tutorial provides an introduction to the Structured Query Language (SQL), learn how to create ..