본문 바로가기

개발중/sql

(34)
MY SQL 액셀 문서 INSERT 액셀에 엄청나게 많은 데이터가 있는데 이거를 DB TABLE 에 집어넣어야 하는 상황에 "아 이걸 INSERT 다 해야하나" 라고 막막해져있는 나는 또 멍청한 짓을 반복할 뻔했다. 다영선배 덕분에 2초만에 해결 ( ̄︶ ̄)↗
MYSQL 세로 통계를 가로 통계로 내고 싶을 때 내가 놓인 상황은 통계를 내는 과정에서 행으로 각 합을 뽑아야 하는 경우였다. 아래 함수를 이용해서 해결했다. ORACLE 은 DECODE 로 하는데 MYSQL 은 아래처럼 대체 한다. SELECT user_seq, MAX(IF(action_seq = 1,CNT , 0)) AS CNT1, MAX(IF(action_seq = 2,CNT, 0) )AS CNT2, MAX(IF(action_seq = 3,CNT, 0) )AS CNT3, MAX(IF(action_seq = 4,CNT , 0)) AS CNT4 FROM ( SELECT user_seq AS user_seq , action_seq AS action_seq , COUNT(action_seq) AS CNT FROM ACTION_LOG_3 WHERE use..
LIMIT 페이징 성능 향상 LIMIT 으로 범위를 지정해서 DATA를 가지고 오는데 성능이 떨어지는 느낌을 받았다 만건을 가지고 올 때도 성능이 저하 되는데 십만건을 가지고 오면 최악일 것이라는 생각이 들었고 변경하는 방법을 찾아보았다. 지금까지 페이징은 아래처럼 했으나 SELECT demon_seq, i_title, i_content FROM TEST.DEMON_DATA LIMIT 0, 100; 성능 향상을 위해 다른 방법을 이용했다. SELECT demon_seq, i_title, i_content FROM TEST.DEMON_DATA WHERE demon_seq > 200 ORDER BY demon_seq LIMIT 10; 이렇게 사용했을 경우에 LIMIT 200, 10 과 같은 역활을 한다. 장점은 where 절에서 범위에..
HINT HINT 란 ? SQL 튜닝의 핵심 부분으로 일종의 지시 구문이라고 한다. 즉, 오라클 옵티마이저에게 SQL 문 실행을 위한 데이터를 스캐닝하는 경로, 조인하는 방법 등을 알려주기 위해 SQL사용자가 SQL 구문에 작성하는 것을 뜻한다. " 오라클이 항상 최적의 실행 경로를 만들어 내기는 불가능하기 때문에 직접 최적의 실행 경로를 작성해주는 것이다 " 라는 정의가 가장 바른 것 같다. 단, 힌트, 인덱스, 조인의 개념을 정확히 알고 사용하지 않은 무분별한 힌트의 사용은 성능의 저하를 초래한다. 그러기에 잘 알고 최적의 실행 경로를 알고 있을 경우에 사용해야 한다! 힌트의 쓰임새 1. 액세스 경로 2. 조인 순서 3. 병렬 및 직렬 처리 4. Optimizer의 목표를 변경 가능 5. 데이터 값을 정렬해야..
PLAN PLAN ? ( EXPLAIN PLAN ) - SQL 문의 액세스 경로를 확인하고 튜닝할 수 있도록 SQL문을 분석, 해석하며 실핼 계획을 수립한 뒤 PLAN_TABLE 에 저장하는 명령어이다. 사용법 EXPLAIN PLAN FOR SELECT * FROM TABLE_NAME; 이 명령어를 사용하면 Plan 이 생성된다. EXPLAIN PLAN FOR SELECT * FROM GUEST; 이런식으로 실행 계획을 저장한다. SELECT PLAN_TABLE_OUTPUT FROM TABLE(DBMS_XPLAN.DISPLAY('plan_table',NULL,'serial')); 이런 결과가 나온다. 저 뒤에 있는 serial은 뭘까 싶어서 한글자 틀리게 써봤더니 에러가 떨어진다. 정의되어있는 예약어 인거 같다...
SQL문 튜닝 WHERE 조건에 모두 명시하였더라고 LIKE와 같은 연산자를 사용하면 인덱스 효울이 떨어진다. IS NULL, NOT NULL. NOT IN 등도 마찬가지 이다 ( '=' 권장 ) 인텍스 컬럼은 변형하여 사용하지 않는다. OR 보다는 AND를 사용할 것 그룹핑 쿼리를 HAVING 보다는 WHERE 절에서 필터링 할 것 DISTINCT는 가급적 사용하지 않는다. IN, NOT IN 대신에 EXISTS 를 사용할 것. I/O 튜닝이 곧 SQL 튜닝이다. I/O 작업이 일어나는 동안, 프로세스는 잠을 자기 때문이다. 즉, SQL 속도를 높이기 위해서는 I/O 시간을 줄여야 한다.
INDEX 정리 인덱스는 데이터베이스 분야에 있어서 테이블에 대한 동작의 속도를 높여주는 자료의 구조를 일컫는다. 인덱스는 테이블 내의 1개의 컬럼 혹은 여러 개의 컬럼을 이용하여 생성될 수 있다. 고속의 검색 동작뿐만 아니라 레코드의 접근과 관련 효율적인 순서 매김 동작에 대한 기초를 제공한다. 인데스를 저장하는 데 필요한 디스크 공간은 보통 테이블을 저장하는 데 필요한 디스크 공간보다 작다. 왜냐하면 보통 인덱스는 키-필드만 가지고 있고, 테이블의 세부항목들은 갖고 있지 않기 때문이다. 인덱스는 고유 제약 조건을 실현하기 위해서도 사용 된다. 고유 인덱스는 중복된 항목이 등록되는 것을 금지하기 때문에 인덱스의 대상인 테이블에서 고유성이 보장된다. - 클러스터 다중 데이터베이스와 다중 테이블이 조인될 때, 그것을 클러..
ANSI 정리 ANSI ( American National Standards Institute ) / 미국표준협회 각 나라별 표준협회 일본규격협회(JIS) 미국표준협회(ANSI) 한국표준협회(KS) 유럽(DIN) 여러 데이터베이스들의 SQL들이 제공해주는 특성에 따라 SQL이 다를 수 있다. 하지만 ANSI 표준으로 작성된 SQL은 모든 데이터베이스에서 호환된다. Oracle ANSI SELECT a.ename ,b.ename FROM scott.emp a, scott.emp b WHERE a.mgr = b.empno SELECT a.ename ,b.ename FROM scott.emp a JOIN scott.emp b ON a.mgr = b.empno ANSI 를 배우지 않는 이유 기본적인 데이터 조회구문은 ANSI..