11. 공통된 값이 없어도 두 개 이상의 테이블을 묶어보자.
Q1.OUTER 조인에 대한 설명으로 틀린 것은 무엇인가요?
(1)
1) OUTER 조인의 경우는 데이터가 모두 존재하는 (기준이 되는) 쪽이 드리븐 테이블이 된다.
2) 조인 조건이 2개 이상의 컬럼을 사용한다면 OUTER 조인이 되는 테이블의 모든 컬럼에 (+)를 붙여야 정상적으로 OUTER 조인이 수행된다.
3) 현재 ORACLE 버전에서 WHERE DEPT.DEPTNO(+) IN (10,20) 같이 OUTER 조인에서 IN을 사용하면 에러가 리턴된다.
4) 양쪽 OUTER 조인을 수행하기 위해서는 FULL OUTER JOIN 이란 키워드를 명시해야 한다.
해설) 1) 논리상 데이터가 모자라는 쪽이 드리븐 테이블이 됩니다.
3) OUTER JOIN되는 컬럼에는 IN, BETWEEN, LIKE, OR 등을 사용하지 못하고, 에러가 리턴됩니다.
ORA-01719, "OUTER JOIN OPERATOR (+) NOT ALLOWED IN OPERAND OF OR OR IN"
Q2.A와 B테이블이 하나의 JOIN KEY로 서로 JOIN되고 있다. 사용자가 A 테이블에 있는 내용은 B의 존재여부와 상관없이 모두 보기르 원하는 경우 사용해야 하는 JOIN 방식은 무엇인가요?
(2)
1) SELF JOIN
2) OUTER JOIN
3) NESTED LOOP JOIN
4) NON EQUIJOIN
해설) JOIN에 성공하지 못하더라도 기준되는 한 테이블의 값을 모두 보고 싶을 때는 OUTER JOIN을 사용하여야 합니다.
Q3.STANDARD SQL 중에 조인 서술부(FROM 절)와 비조인 서술부(WHERE 절)를 분리하여 표시하는 가장 좋은 방법은 무엇인가요?
(4)
1) CROSS JOIN
2) NATURAL JOIN
3) OUTER JOIN
4) ON/USING 조건
Q4.두 개의 테이블에서 어느 한쪽 테이블에만 존재하는 데이터를 찾기 위한 방법이 아닌 것은 무엇인가요?
(2)
1) OUTER JOIN
2) INNER JOIN
3) NOT EXISTS
4) NOT IN
해설) INNER JOIN은 조인하는 두 개 테이블에 모두 존재하거나 관계된 데이터를 보기 위한 것입니다.
Q5.CROSS JOIN의 내용으로 틀린 것은 무엇인가요?
(4)
1) CARTESIAN PRODUCT라고도 불린다.
2) CROSS PRODUCT라고도 불린다.
3) 조인 SQL 문에서 조인 조건이 없는 경우와 동일한 결과를 얻을 수 있다.
4) 두 개의 OUTER JOIN으로 CROSS JOIN을 구현할 수 있다.
해설) 크로스 조인은 E.F.CODD 박사가 제안한 일반집합 연산자의 PRODUCT의 개념으로 조인 조건이 없는 경우 생길 수 있는 모든 데이터의 조합을 말합니다.
12. 자주 사용하는 SQL 명령어들을 알아두자.
Q1.어떠한 데이터 타입도 사용이 가능한 그룹함수는 어느 것인가요?
(1)
1) COUNT
2) SUM
3) AVG
4) STDDEV
해설) 그룹함수는 그룹에 대한 정보를 제공하므로 주로 숫자 타입에 사용됩니다.
MAX, MIN, COUNT 함수는 문자, 날짜에 적용이 가능한 함수입니다.
Q2.계산 후에 날짜 타입의 결과가 나오는 문장은 어느 것인가요?
(2)
1) SYSDATE - TO_DATE('03-OCT-02','DD-MON-YY')
2) SYSDATE - 7
3) TO_DATE('03-OCT-02','DD-MON-YY') - SYSDATE
4) MONTH_BETWEEN(SYSDATE,TO_DATE('03-OCT-02','DD-MON-YY'))
해설) (날짜±숫자)는 숫자 만큼의 전후의 날짜 값을 출력합니다.
Q3.POSITION 컬럼 값이 'TD'인 것을 '팀 닥터'로 변경하는 함수를 작성한 것은 무엇인가요?
(4)
1) NVL('TD','팀 닥터', POSITION)
2) NVL(POSITION, 'TD', '팀 닥터')
3) DECODE('TD', '팀 닥터', POSITION)
4) DECODE(POSITION, 'TD', '팀 닥터')
해설) DECODE() 함수는 첫번째 열에 컬럼명, 그 뒤로는 짝수 열에 변환 전 값, 홀수 열에 변환 후 값을 넣습니다.
그리고, 제일 마지막 열에는 앞 쪽에서 정의되지 않은 값들을 변환하는 값을 넣습니다.
Q4.다음 중 DATE 타입으로 정의된 생년월일 컬럼을 YYYY/MM/DD 형식으로 보게 해주는데 가장 가까운 함수는 무엇인가요?
(4)
1) SUBSTR()
2) RTRIM()
3) DECODE()
4) TO_CHAR()
해설) TO_CHAR() 함수는 첫번째 열에 컬럼명, 두번째 열에 변환하고자 하는 포맷을 입력합니다.
Q5.현재의 날짜를 알아보려할 때, 괄호 안에 들어갈 알맞은 말은 무엇인가요?
SELECT TO_CHAR(SYSDATE, 'YYYY/MM/DD') FROM DUAL;
해설) 내장함수 사용시 다른 테이블을 사용하지 않을 때는 가상의 테이블인 DUAL을 FROM 절에 입력합니다.
13. SQL문 안에 또 다른 SQL문을 넣어보자.
Q1.CASE 함수의 특징으로 틀린 것은 무엇인가요?
(2)
1) DECODE 함수와 같은 기능을 할 수 있다.
2) DECODE 함수와 다르게 중첩해서 사용할 수 없다.
3) IF ~ THEN ~ ELSE ~ 논리로 구성할 수 있다.
4) DECODE 함수와 같이 사용할 수도 있다.
Q2.다음 NULL에 대한 내용중 맞는 내용은 무엇인가요?
(4)
1) 공집합도 NVL 함수를 통해 다른 값으로 치환할 수 있다.
2) 관계형 DBMS에서 NULL은 절대 있어서는 안되는 값이다.
3) 숫자를 NULL로 나누면 SYNTAX ERROR가 발생한다.
4) 그룹함수를 사용하면 공집합의 경우 NULL로 표현된다.
해설) 공집합은 NVL함수로 처리가 안되며, 그룹함수를 사용하면 NULL로 출력됩니다.
관계형 DBMS에서 NULL은 필요한 개념입니다.
숫자를 NULL로 나누면 NULL이 됩니다.
Q3.여러 개의 ROW로 만들어진 집합을, 정해진 컬럼 수만큼 확장해서 집계 보고서를 만드는 유용한 기법에서 일반적으로 사용되지 않는 기능은 무엇인가요?
(4)
1) DECODE 함수
2) 그룹 함수
3) GROUP BY 절
4) 파티션 기준
해설) 그룹함수(DECODE) ~ GROUP BY 활용법을 통해 여러 개의 ROW 로 만들어진 집합을,
정해진 컬럼 수만큼 확장해서 집계 보고서를 만들 수 있습니다.
Q4.서브 쿼리에 대한 설명으로 옳지 않은 것은 무엇인가요?
(4)
1) INLINE 뷰는 FROM 절에 사용된 서브쿼리를 말합니다.
2) NESTED 서브쿼리는 WHERE 절에서 사용된 서브쿼리를 말합니다.
3) CORRELATED 서브쿼리는 TOP-LEVEL 쿼리의 결과와 연관을 맺어 실행되는 형태의 서브쿼리를 말합니다.
4) SCALAR 서브쿼리는 질의문의 결과가 두 개 이상의 ROW로 구성되어야 합니다.
해설) SCALAR 서브쿼리는 기본적으로 하나의 ROW를 출력합니다.
Q5.SCALAR 서브쿼리를 사용할 수 없는 SQL 구문은 무엇인가요?
(2)
1) SELECT
2) FROM
3) WHERE
4) ORDER BY
해설) FROM 절에는 INLINE VIEW를 사용합니다.
14. 소계/합계가 나오는 보고서 형태로 데이터를 배열해보자.
Q1.소계, 중계, 합계처럼 계층적 분류를 포함하고 있는 데이터의 집계에 적합한 ORACLE의 새로운 함수 두 가지는 무엇인가요?
(2)
1) ROLLUP, SUM
2) ROLLUP, CUBE
3) GROUPING, SUM
해설) ROLLUP, CUBE는 GROUP BY의 확장된 형태로 사용하기가 쉬우며 병렬로 수행이 가능하기 때문에 매우 효과적입니다.
다차원적인 집계가 필요한 경우는 CUBE를 사용합니다.
Q2.3개 부서별 동일 3개 직무의 급여를 CUBE(부서,직무) 함수를 사용하여 계산하였습니다. 레코드의 개수는 몇개인가요?
(2)
1) 14개
2) 16개
3) 18개
4) 20개
해설) 부서&직무별 합계 9개, 부서별 합계 3개, 직무별 합계 3개, 총 합계 1개로 16개의 레코드가 생성됩니다.
Q3.Analytic Function의 종류가 아닌 것은 무엇인가요?
(4)
1) 그룹 내 순위 관련
2) 일반 그룹 함수 관련
3) 그룹 내 데이터 순서 관련
4) 일반 문자 함수
해설) Analytic Function은 크게 다음
그룹 내 순위 관련,
일반 그룹 함수 관련,
그룹 내 데이터 순서 관련,
그룹 내 비율 관련,
통계 분석 관련,
선형 분석 관련 등 6개의 범주로 구분할 수 있습니다.
Q4.그룹 내 순위 관련 Analytic Function의 특징이 틀린 것은 무엇인가요?
(3)
1) RANK 함수는 동일한 값에 대해서는 동일한 순위를 부여하게 됩니다.
(같은 등수에 여럿이 존재하는 경우 등수가 SKIP될 수 있음)
2) DENSE_RANK 함수는 RANK 함수와 흡사하나, 동일한 순위를 하나의 건수로 취급하는 것이 틀린 점입니다.
(같은 등수에 여럿이 존재하는 경우에도 등수가 SKIP되지 않음)
3) CUBE_RANK 함수는 누적된 순위를 부여할 수 있습니다.
(등수를 누적한 순위로 표현함)
4) RANK함수가 동일한 값에 대해서는 동일한 순위를 부여하는데 반해, ROW_NUMBER 함수는 유니크한 순위를 부여합니다.
(같은 등수가 존재할 수 없음)
해설) 그룹 내 순위 관련 Analytic Function으로는
RANK,
DENSE_RANK,
ROW_NUMBER 3종류의 함수가 있습니다.
Q5.파티션별 윈도우에서 이전 몇 번째 행의 값을 가져올 수 있는 Analytic Function은 무엇인가요?
(3)
1) FIRST_VALUE
2) LAST_VALUE
3) LAG
4) LEAD
해설) LAG 함수를 이용해 파티션별 윈도우에서 이전 몇 번째 행의 값을 가져올 수 있습니다.
LEAD 함수를 이용해 파티션별 윈도우에서 이후 몇번째 행의 값을 가져올 수 있습니다.
* 테이블에서 데이터가 들어 있음을 표시하기 위한 특별한 값이며, 모든 데이터타입으로 사용할 수 있습니다.
* 수치의 제로도, 공백 문자열도 아니며, '제로'라는 값은 전혀 다른 의미를 갖습니다.
* '제로'는 확정적인 값을 가지고 있는 것에 반해, '데이터의 미정', '데이터 설정의 필요/의미없음'이라는 것을 나타냅니다.
15. 내가 직접 쓰지 않더라도 알아두어야할 SQL문을 이해하자.
Q1.다음 중 맞는 것은 무엇인가요?
(4)
1) USER를 생성만하면 생성된 USER로 바로 로그인할 수 있다.
2) ORACLE에서 제공하는 USER이면 누구나 새로운 USER를 만들 수 있다.
3) USER 생성은 누구나 할 수 있지만 권한 설정은 데이터베이스 관리자(DBA)만 가능하다.
4) 다른 USER의 테이블은 그 테이블에 대한 권한이 없이는 조회할 수 없다.
해설) 테이블에 대한 권한은 각 테이블의 소유자가 가지고 있기 때문에 소유자로부터
권한을 받지 않으면 다른 USER의 테이블에 접근할 수 없습니다.
Q2.INDEX에 대한 설명 중 틀린 것은 무엇인가요?
(1)
1) INDEX는 조회속도를 빠르게 함으로 가능한 많이 만드는 것이 좋다.
2) INDEX는 구성되는 컬럼 순으로 자료를 정렬한다.
3) 하나의 테이블에는 여러 개의 INDEX를 생성할 수 있다.
4) INDEX는 가능한 많은 경험을 가지고 있는 사람이 전략적으로 구성하는 것이 좋다.
해설) INDEX를 사용하여 SQL문을 실행하면 처리범위를 줄일 수 있어 자료를 검색하는 속도가 빨라집니다.
하지만, INDEX를 많이 만들면 별도로 생성되기 때문에 INDEX를 차지하는 DISK 사이즈가 생기고,
데이터가 변경될 때마다 각 INDEX를 변경해야 하기 때문에 더 많은 부하를 줄 수 있습니다.
Q3.다음 중 CONNECT ROLE에 포함된 권한이 아닌 것은 무엇인가요?
(4)
1) CREATE SESSION
2) CREATE TABLE
3) CREATE VIEW
4) CREATE PROCEDURE
해설) CREATE PROCEDURE는 RESOURCE ROLE에 부여된 권한입니다.
Q4.다음 중 권한의 종류가 아닌 것은 무엇인가요?
(2)
1) CREATE TABLE
2) CREATE INDEX
3) CREATE VIEW
4) CREATE TRIGGER
해설) INDEX에 대한 권한은 CREATE TABLE 권한에 포함되어 있습니다.
Q5.다음 중 INDEX 생성에 대한 설명 중 잘못된 것은 무엇인가요?
(3)
1) SQL 조건문에 자주 등장하는 컬럼에 INDEX로 만든다.
2) 자주 조합되어 사용되는 경우는 결합 INDEX를 생성한다.
3) INDEX는 처리범위를 줄여주기 때문에 모든 상황별로 INDEX를 생성하는 것이 좋다.
4) 분포도가 적은 컬럼으로 구성하는 것이 좋다.
해설) INDEX는 처리범위를 줄여주기는 하지만 너무 많은 INDEX를 생성하면 오히려 DML 작업시 부하를 줄 수 있습니다.
따라서 종합적으로 판단하여 최소한의 INDEX를 생성하는 것이 좋습니다.
16. SQL문을 함수로 만들어보자.
Q1.( )란 특정한 테이블에 INSERT, UPDATE, DELETE 와 같은 DML문이 수행되었을 때, 데이터베이스에서 자동으로 동작하도록 작성된 프로그램이다.
(2)
1) OPTIMIZER(옵티마이저)
2) TRIGGER
3) 다중행 함수
4) STDDEV
해설) 사용자가 직접 호출하여 사용하는 것이 아니고 데이터베이스에서 자동적으로 수행하게 됩니다.
Q2.PL/SQL의 특징이 아닌 것은 무엇인가요?
(4)
1) 블럭 구조이다.
2) 절차형 언어를 사용하여 절차적인 프로그램을 할 수 있다.
3) 변수를 선언할 수 있고, SQL 간에 값을 교환할 수 있다.
4) PS/SQL은 한번에 하나의 SQL 문장만 처리할 수 있다.
해설) PS/SQL은 여러 SQL문을 BLOCK으로 묶어 한번에 처리할 수 있습니다.
Q3.( )란 절차형 SQL을 로직과 함께 데이터베이스 내에 저장해 놓은 명령문의 집합입니다.
(PROCEDURE)
해설) PROCEDURE는 PL/SQL을 이용하여 만든 절차형 프로그램으로, 값의 입출력이 가능하고 BLOCK내에서 여러 SQL문을 처리할 수 있습니다.
Q4.다음 중 PL/SQL을 이용하여 만들 수 없는 것은 무엇인가요?
(4)
1) PROCEDURE
2) FUNCTION
3) TRIGGER
4) ORDER_LIST
Q5.다음 중 TRIGGER에 대한 설명 중 틀린 것은 무엇인가요?
(3)
1) DML문이 실행되었을 때 자동으로 동작하도록 작성된 프로그램
2) TRIGGER는 테이블과 뷰를 대상으로 정의할 수 있다.
3) TRIGGER는 사용자가 직접 CALL할 수도 있다.
4) TRIGGER는 전체 트랜잭션에 대해 1번 발생되는 TRIGGER와 각 행에 대하여 발생되는 TRIGGER가 있다.
해설) TRIGGER는 사용자가 직접 호출하는 것이 아니라 데이터베이스에서 자동적으로 호출됩니다.
17. SQL문을 규칙과 비용을 생각하면서 만들어보자.
Q1.실행계획을 분석하는 방법으로 틀린 것은 무엇인가요?
(3)
1) 들여쓰기가 많이 된 내용이 먼저 실행된다.
2) 인덱스와 테이블 액세스의 내용은 묶어서 생각하면 좋다.
3) 들여쓰기가 많이 되어 있으면 상위 프로세스라고 할 수 있다.
4) 같은 들여쓰기 레벨이면 위의 내용이 먼저 실행된다.
해설) 들여쓰기가 많이 되어 있으면 하위 프로세스라고 할 수 있습니다.
Q2.옵티마이저 모드가 아닌 것은 무엇인가요?
(1)
1) ALL_ROWS_100
2) CHOOSE
3) RULE
4) ALL_ROWS
해설) 옵티마이저 모드는 RULE, CHOOSE, ALL_ROWS, FIRST_ROWS가 있는데,
FIRST_ROWS의 경우 9i 버젼부터 FIRST_ROWS_100 처럼 최적화 단위의 건수를 지정할 수 있습니다.
Q3.다음 중 힌트를 잘못 지정한 문장은 무엇인가요?
(4)
1) SELECT /*+ INDEX_DESC(EMP PK_EMP) */
EMPNO FROM EMP WHERE EMPNO > 0;
2) SELECT /*+ FULL (A) */
EMPNO FROM EMP A WHERE EMPNO > 0;
3) SELECT --+ INDEX(EMP PK_EMP)
EMPNO FROM EMP WHERE EMPNO > 0;
4) SELECT --+ FULL(EMP) */
EMPNO FROM EMP A WHERE EMPNO > 0;
해설) 테이블의 Alias를 지정한 경우라면 힌트에도 Alias를 사용해야 합니다.
Q4.다음 중에서 옵티마이저 모드 레벨의 우선순위가 제대로 설명된 것은 무엇인가요?
(2)
1) Session > Instance > Statement
2) Statement > Session > Instance
3) Statement > Instance > Session
4) Instance > Session > Statement
해설) Statement Level의 Hint 설정은 Session Level의 설정보다 우선하고,
Session Level의 설정은 Instance Level의 설정보다 우선합니다.
Q5.다음 중 RBO 옵티마이저에 대한 내용으로 틀린 것은 무엇인가요?
(4)
1) RBO의 15가지 RULE은 크게 BY ROWID, BY Index, FTS 로 구분할 수 있다.
2) SQL문을 실행하기 위한 방법이 하나 이상 있다면, 규칙 기준 접근 방식은 우선순위가 높은(적은 숫자의) RULE 을 이용한다.
3) WHERE 절에서 EQUI(=) 조건은 범위/RANGE 조건보다 RBO의 우선 순위가 높다.
4) FIRST_ROWS, ALL_ROWS, CHOOSE 모드 모두 100% CBO 모드이다.
해설) CHOOSE모드의 경우 사용된 테이블의 정보가 모두 없을 경우에는 RBO모드로 수행됩니다.
18. SQL문을 효율적으로 만들어 처리시간을 줄여보자 -1
Q1.ORACLE에서는 EXPLAIN PLAN이란 명령어를 통하여 ( )의 실행계획을 유저가 볼 수 있도록 제공합니다.
(1)
1) OPTIMIZER(옵티마이저)
2) DUAL 테이블
3) 다중행 함수
4) STDDEV
해설) SQL문의 실행계획을 보면 유저가 원하는 대로 실행계획이 수립되었는지 비효율적인 실행계획은 없는지 알 수가 있습니다.
Q2.옵티마이저에 대한 설명 중 틀린 것은 무엇인가요?
(3)
1) SQL문의 실행계획을 수립하는 ORACLE 프로세스의 일종이다.
2) 옵티마이저는 크게 Rule-Based 모드와 Cost-Based 모드로 나눈다.
3) Rule-Based 란 여러 실행계획 중 가장 높은 순위의 실행계획을 이용하는 방식
4) Cost-Based 란 여러 실행계획 중 가장 Cost가 작은 실행계획을 이용하는 방식
5) Cost란 액세스하는 소요시간이다.
해설) Rule-Based 모드는 여러 실행계획 중 가장 낮은 순위의 실행계획을 이용하는 방식입니다.
Cost-Based 모드의 Cost란 실행계획의 각 단계에 대한 소요시간을 의미합니다.
Q3.다음곽 같은 조건이 WHERE절에 있을 때 인덱스 스캔을 하는 경우는 무엇인가?
(2)
1) SUBSTR(ename,1,1) = '김'
2) ename like '김%'
3) ename IS NULL
4) ename <> '홍길동'
해설) 인덱스를 구성하는 칼럼이 변형이 되거나, 부정형 비교, NULL operator를 사용하는 경우는 인덱스 스캔하지 않습니다.
Q4.조인에 대한 설명 중 맞는 것은 무엇인가?
(4)
1) 조인은 조인되는 순서와 관계없이 수행 결과와 속도는 항상 동일하다.
2) 옵티마이저가 최적의 조인 순서를 결정하기 때문에 유저는 순서를 고려하지 않아도 된다.
3) 조인을 많이 하면 성능이 떨어진다.
4) 조인의 순서는 처리범위가 적은 테이블에서 많은 테이블 순으로 한다.
해설) 조인은 순서와 관계없이 결과는 항상 동일하며
일반적으로 조인의 순서는 처리 범위가 적은 테이블에서 많은 테이블 순으로 한다.
Q5.일반적으로 UNION과 UNION ALL 중 실행계획 상 비용이 더 발생하는 것은 무엇인가요?
(4)
1) UNION
2) UNION ALL
해설) UNION은 두 SQL문의 결과를 합칠 때 앞에 있는 컬럼 순으로 자료를 SORT하고,
UNION ALL은 두 SQL문의 결과를 SORT하지 않고 위 부분 SQL문의 결과와 아래 부분 SQL문의 결과를 (+)합니다.
19. SQL문을 효율적으로 만들어 처리시간을 줄여보자 -2
Q1.다음 SQL문중 INDEX 스캔을 하지 않는 것은 무엇인가요?
(4)
1) SELECT empno, ename, sal
FROM emp
WHERE empno > 12 * 100
2) SELECT empno, ename, sal
FROM emp
WHERE empno = 7902
3) SELECT empno, ename, sal
FROM emp
WHERE empno IN (7902, 7876)
4) SELECT empno, ename, sal
FROM emp
WHERE empno LIKE '79%'
해설) empno는 NUMBER type임으로 문자 상수와 LIKE 비교하면 empno 컬럼이 문자 type으로 내부적으로 변형이 일어납니다.
INDEX 컬럼에 변형이 가해지면 해당 INDEX를 사용하지 못합니다.
Q2.다음과 같은 조건이 WHERE절에 있을 때 INDEX 스캔을 하는 것은 무엇인가요?
(가정: sal컬럼은 INDEX를 가지고 있는 NUMBER TYPE 컬럼)
(3)
1) sal * 1000 > 1000000
2) sal IS NULL
3) sal >= 12 * 10000
4) sal <> 0
해설) INDEX를 구성하는 컬럼이 변형이 되거나, 부정형 비교, NULL operator를 사용하는 경우는 INDEX 스캔을 하지 않습니다.
컬럼을 변형시키는 조건은 우측 상수를 계산하는 조건으로 SQL를 변경해야 합니다.
Q3.다음 SQL 문 중 INDEX 스캔을 하는 것을 모두 고르시오.
(가정: 각 컬럼별로 INDEX가 구성되어 있다)
(4)
1) SELECT * FROM TEST
WHERE COL_CHARACTER = 10;
2) SELECT * FROM TEST
WHERE COL_NUMERIC LIKE '100%';
3) SELECT * FROM TEST
WHERE COL_VARCHAR LIKE 'A%';
4) SELECT * FROM TEST
WHERE COL_DATE = '09-SEP-02';
해설) 컬럼의 TYPE가 조건 값으로 주어진 상수 TYPE이 다를 때 SQL 피싱 단계에서 내부적으로 컬럼이 상수 TYPE으로 변형이 됩니다.
INDEX는 INDEX를 구성하는 컬럼이 변형이 되면 INDEX는 무용지물이 됩니다.
보기의 SQL문은 내부적으로 다음과 같이 변형됩니다.
(1) WHERE COLC = 10 -> WHERE TO_NUMBER(COLC) = 10
(2) WHERE COLN LIKE '100%' -> WHERE TO_CHAR(COLN) LIKE '100%'
Q4.다음 SQL 문 중 결과가 999인 것은 무엇인가요?
(4)
1) SELECT 999
FROM DUAL
WHERE 1 = 2
2) SELECT NVL(999,999)
FROM DUAL
WHERE 1 = 2
3) SELECT DECODE(999,NULL,999,999)
FROM DUAL
WHERE 1 = 2
4) SELECT NVL(MIN(999),999)
FROM DUAL
WHERE 1 = 2
해설) SELECT 문의 결과 검색된 자료가 하나도 없으면 NVL함수를 사용해도 결과는 '선택된 레코드가 없습니다'입니다.
반면에, 그룹함수를 사용하면 NULL을 포함하여 항상 하나의 결과가 출력됩니다.
Q5.다음 중 INDEX는 존재하지만 INDEX 스캔을 하지 않는 경우가 아닌 것은 무엇인가?
(4)
1) INDEX 컬럼에 변형이 가해지는 경우
2) NULL, NOT NULL 비교를 하는 경우
3) NOT 비교 검색을 하는 경우
4) TRIGGER가 있는 경우
해설) 테이블에 INDEX는 존재하지만 INDEX 스캔을 하지 않는 경우가 있습니다.
옵티마이저(Cost Based Optimizer)가 실행계획상 테이블 FULL 스캔이 유리하다고 판단하는 경우에는 INDEX 스캔을 하지 않습니다.
20. SQL문을 효율적으로 만들어 처리시간을 줄여보자 -3
Q1.조인의 특징에 대한 설명 중 사실과 다른 것은 무엇인가요?
(4)
1) 조인되는 순서와 관계없이 조인의 결과는 항상 동일하다.
2) 인덱스를 사용하면 조인의 횟수를 줄일 수 있다.
3) 조인의 순서는 처리범위가 적은 테이블에서 많은 테이블 순으로 한다.
4) 옵티마이저는 항상 최적의 조인순서를 결정해 준다.
해설) 옵티마이저는 인덱스와 조회조건 등 상황에 따라 조인 순서 및 방법을 결정하는데 옵티마이저의 결정이 가장 효율적인 조인순서를 결정하는 것은 아닙니다.
따라서 테이블의 구성을 잘 알고 있는 사용자는 옵티마이저가 효율적인 실행계획을 세우는지 항상 확인하고 옵티마이저가 최적의 실행계획을 세울 수 있도록 각종 힌트를 주어야 합니다.
Q2.( 1 )는 Driving 테이블에서 조건을 만족하는 각 레코드들을 차례로 하나씩 조인하면서 가장 나중에 조인되는 테이블까지 자료를 검색하는 조인방식입니다.
1) Nested Loop 조인
2) Sort Merge 조인
해설) Nested Loop 조인은 조인되는 테이블 순서대로 자료를 검색하여 원하는 자료를 추출하는 조인 방식으로 인덱스 순서대로 처리할 경우 처리범위를 줄일 수 있어 수행속도를 높일 수 있습니다.
Q3.( 2 )는 조인되는 각각의 테이블을 분리하여 조건에 맞는 자료를 검색한 후, 다시 결과르 머지하는 조인 방식입니다.
1) Nested Loop 조인
2) Sort Merge 조인
해설) Sort Merge 조인은 넓은 범위의 테이블을 조인하거나 인덱스가 없는 테이블을 조인할 때 각각의 테이블을 따로 검색한 다음, 결과 집합들을 다시 머지하여 원하는 자료를 추출하는 조인방식입니다.
Q4.인덱스를 사용함에도 불구하고 실행계획이 나빠지는 경우에, 이를 해결하는 방법이 아닌 것은 무엇인가요?
(4)
1) 기존 인덱스를 변경하는 방법
2) 새로운 인덱스를 만드는 방법
3) IN을 사용하여 부분별 점 집합으로 결합인덱스를 스캔하는 방법
4) 다른 인덱스 테이블과 JOIN하는 방법
해설) 결합인덱스를 사용하는 인덱스 스캔을 하다 보면 앞에 있는 컬럼 조건의 범위가 넓은 경우 체크 조건이 뒤에 있기 때문에 불필요한 인덱스 스캔이 많아지게 됩니다.
Q5.다음 설명하는 것은 무엇인가요?
- 각각의 액세스에서 추출한 자료들을 합하는 OPERATION
(1)
1) CONCATENATION
2) UNION ALL
3) Cluster-Join
4) Hash-Cluster
해설) 각각의 액세스에서 추출한 자료들을 합하는 OPERATION이며, IN조건을 사용할 때의 실행계획입니다.
[GitLab/BFW 스튜디오 #1] 간단 Pull Push 정리 Unstaged Changes, Add to Index, Replace with HEAD Revision, Push to origin 표준개발프레임워크 환경 (2) | 2024.01.04 |
---|---|
버그클리닝 솔루션 - 버그크리너 (0) | 2020.04.03 |
댓글 영역