목록SQL (6)
나의 개발 일상 기록
Connection Blocked Error 현상 MySQL 서버를 평시 잘 사용을 하다 Connection을 하려고 하는데 갑작스럽게 아래와 같은 에러가 발생하였습니다. ERROR 1129(00000): Host '*' is blocked because of many connection errors. Unblock with 'mysqladmin flush-hosts' 구글링을 통해 원인을 파악을 해보니 Host로부터 접속 요청 max_connect_errors 와 관련된 접속 연결 설정값 보다 초과하여 발생하여 설정된 값 이상의 Host에서 연결이 발생하여 MySQL에서는 해당 Host를 Block을 하게 된다는 것을 알게 되었습니다. 해결방법 1. MySQL 접속합니다. - mysql -u root ..
ORACLE 실행계획 #2 1. 기본 플랜 예시 위 2개의 플랜에서 쿼리의 차이점은 ROWNUM 2 -> 3 -> 4 -> 5 -> 6 순으로 해석합니다. 그리고 플랜의 내용에서 스캔은 UNIQUE SCAN임을 알 수 있고, 두 테이블의 조인 방식은 NESTED LOOP JOIN임을 알 수 있습니다. 즉, 순차적 루프에 의한 접근 방식입니다. * UNIQUE SCAN - 수직적 탐색만으로 데이터를 찾는 스캔 방식으로서, Unique인덱스를 통해 '=' 조건으로 탐색하는 경우에 작동합니다. * NESTED LOOP JOIN - 2개 이상의 테이블에서 하나의 집합을 기준으로 순차적으로 상대방 Row를 결합하여 원하는 결과를 조합하는 방식입니다. 플랜의 해석순서를 그림으로 변화하면 인덱스 생성도와 동일하다는 ..
ORACLE 힌트절 1. 힌트절이란? CBO 방식에서 옵티마이저는 주어진 환경(통계정보, SQL문)하에서 최적의 실행계획을 제공합니다. 그런데 잘못된 SQL문이나 부정확한 통계정보로 인하여 엉뚱한 실행 계획을 제공할 때도 간혹 있습니다. 이때 힌트절을 통해 잘못된 실행 계획을 바로 잡을 수 있습니다. 결국 힌트절은 옵티마이저의 실수를 만회할 수 있는 개발자의 마지막 무기라 할 수 있습니다. 2. 사용법 SELECT /*+ [힌트절]*/ SQL문에서 힌트절은 주석문 안에 표시합니다. 그래서 잘못된 힌트절로 인하여 에러를 리턴하는 일은 없습니다. 단지 힌트절의 내용대로 적용되지 않을 뿐입니다. 3. 대표적인 ORACLE 힌트절 1) 접근 순서를 결정하는 힌트절 - ORDERED : FROM 절에 나열된 테이..
바인드 변수와 하드 파싱 대부분의 개발자들은 튜닝 시 실행계획을 상수값으로 테스트 하지만, 실제로 바인드 변수로 운영되는 경우에는 실행계획이 다를 수 있습니다. 프로그램에서 바인드 변수로 되어 있다면 반드시 바인드 변수로 실행계획을 확인해야합니다. SELECT * FROM 고객 WHERE 고객명 = '홍길동' => 상수값 SELECT * FROM 고객 WHERE 고객명 = :NAME => 바인드 변수 위의 두 개의 쿼리는 동일한 결과를 조회하지만 실행계획은 다를 수 있습니다. 이와 같은 쿼리들은 대부분의 경우 실행계획이 동일하지만 간혹 다른 경우도 있으므로, 쿼리가 어떤 방식으로 운영되는지에 따라 실행계획을 구분-확인해야 합니다. 1. 바인드 변수를 사용하는 이유 - 바인드 변수 사용은 하드 파싱을 줄이..
실행계획 위 플랜을 해석하면 다음과 같습니다. - ACCESS FULL : 고객 테이블 FULL SCAN(전체 접근) - Cost = 633K : 633,000 비용 발생 - Card = 42M : 42,000,000건 (접근하는 레코드 수) - Bytes = 15G : 15,000,000,000 (42,000,000 * 1 ROW의 총 길이) ACCESS FULL은 고객 테이블을 FULL SCAN하겠다는 의미를 가집니다. 어떠한 인덱스도 통하지 않고 직접 접근해 전체 테이터를 읽는 다는 의미를 가진다고 할 수 있습니다. 실행계획에서 이 용어가 보인다는 것은 3가지 경우를 뜻합니다. 1. 해당 쿼리에 대한 적절한 인덱스가 존재하지 않은 경우로서 필요한 인덱스를 생성함으로 해결 가능합니다. 2. 인덱스는 ..
SELECT문 1. SELECT문 구조 => SELECT문의 실행순서는 FROM -> WHERE -> GROUP BY -> HAVING -> SELECT -> ORDER BY 순서로 진행됩니다. 2. FROM절 - 쿼리에서 가장 처음으로 실행되는 부분입니다. FROM절에는 테이블를 기입하여 해당 테이블의 전체 데이터를 가지고 옵니다. 필수항목입니다. * SELECT 절과 FROM 절만을 사용하여 기본적인 SQL문장을 구성할 수 있습니다. 3. WHERE 절 - 사용자들은 자신이 원하는 데이터만을 검색하기 위해 WHERE절을 이용하여 출력되는 데이터를 제한할 수 있습니다. 4. GROUP BY 절 - 데이터들을 원하는 그룹으로 나눌 수 있습니다. * HAVING 절 : GROUP BY절에 사용되어 집계 함..