본문 바로가기
반응형

CS(Computer Science)55

[ORACLE] 날짜에서 요일 확인하는 방법 오라클에서 날짜로 요일을 조회하는 방법입니다 SELECT TO_CHAR(SYSDATE, 'dy') FROM DUAL 2024. 3. 7.
[ORACLE] PL/SQL 에러 확인 PL/SQL을 작성하다보면 SQL보다 길이가 길어서 오류가 발생하게 됩니다 이때 에러가 발생한 이유와 LINE을 알면 해결하기 편합니다 방법을 알아보겠습니다 DECLARE BEGIN SELECT * FROM TABLE ; WHEN OTHERS THEN DBMS_OUTPUT.PUT_LINE('예외가 발생했습니다.'); DBMS_OUTPUT.PUT_LINE('SQL ERROR CODE: ' || SQLCODE); --에러코드 DBMS_OUTPUT.PUT_LINE('SQL ERROR MESSAGE: ' || SQLERRM); --에러내용 DBMS_OUTPUT.PUT_LINE(SYS.dbms_utility.format_error_backtrace); --에러 발생한 LINE END; 에러내용이 구체적이지 않을 .. 2024. 2. 6.
[ORACLE] LOCK 걸린 개체 확인 락이 걸렸는지 확인하는 방법을 알아보겠습니다 SELECT A.SID , A.SERIAL# , A.STATUS , object_name FROM V$SESSION A , V$LOCK B , DBA_OBJECTS C WHERE A.SID = B.SID AND B.ID1 = C.OBJECT_ID AND B.TYPE = 'TM' AND C.OBJECT_NAME = 'table_name' ; table_name에 테이블명을 집어넣고 쿼리를 돌린다 조회 결과 라인이 생기면 lock 걸린 세션을 찾을 수 있다 sid와 시리얼 번호로 세션 해제 ALTER SYSTEM KILL SESSION 'sid, serial' ; sid와 serial 자리에 락걸린 값을 집어넣으면 됩니다. 쿼리가 돌아가면 lock 걸린 테이블의 .. 2024. 1. 10.
[ORACLE] PL/SQL에서 쿼리 소요시간 확인하기 PL/SQL에서 쿼리의 소요시간을 확인하는 방법입니다. declare v_sysdate date; v_time number := 0; v_tmp number; begin v_sysdate := sysdate; for i in 1..1000000 loop select i into v_tmp from dual; --dbms_output.put_line(v_tmp); end loop; v_time := (sysdate-v_sysdate) * 60 *60 *24; --초로 표시하기 위함 dbms_output.put_line('소요시간 : ' ||v_time ); end; 쿼리가 돌아간 소요시간을 확인할 수 있습니다 2023. 12. 29.
[ORACLE] 데이터 많을 때 count(*) 빠르게하기 데이터가 많을때 count를 빠르게 하는 방법을 알아보겠습니다. 처음 돌리는 쿼리가 아니면 캐시에서 읽어와 빠르게 조회되는 경우가 있으니 주의하세요. 1. 기본 count SELECT count(*) from table A; 2. 오라클 기본 컬럼인 rowid를 count SELECT COUNT(ROWID) FROM table 기본 count보다 빠른 성능을 보여줍니다. 3. 다음은 힌트를 사용해서 병렬로 처리하는 방식입니다. SELECT /*+ full(A) parallel(A 8) */count(*) from table; full(A): "full" 힌트는 전체 테이블 스캔을 수행하도록 옵티마이저에게 알려준다. 테이블 전체를 스캔하는 방식으로 데이터를 검색 parallel(A 8): "parallel.. 2023. 11. 6.
[SQL 튜닝] 실행계획 실행계획: 사용자가 sql을 실행하여 데이터를 추출하려고 할 때 옵티마이저가 수립하는 작업절차 1. sql 해석 2. 실행계획 수립 3. 실행 실행계획 확인 방법 1. explain plan : 실행계획만 확인 가능 2. set autotrace : 한 번의 명령으로 여러 개의 sql에 대한 실행계획을 바로 볼 수 있음 옵티마이저 : 사용자가 실행한 sql을 해석하고 데이터를 추출을 위한 실행계획을 수립하는 프로세스, 속도 결정함 종류 1. RBO : 초창기 버전 - 기본적으로 15개의 순위가 매겨진 규칙이 있음, 이를 기반으로 실행계획 수립 - 계획이 여러개면 순위가 높은 규칙 사용 RANK 1 Rowid에 의한 1 row 2 클러스터 조인 3 unique나 pk를 사용한 해시 클러스터 키 ... .... 2023. 9. 10.
[ORACLE] SQL 튜닝 1. WHERE절 내에서의 JOIN의 위치 테이블 조인은 WHERE절의 조건 보다 먼저 기술되는 것이 좋다. 이는 SQL Parser에 의해 SQL이 해석될 때 WHERE절의 조건이 밑에서부터 위로 해석이 되기 때문이다. 그러므로 아래 부분에서 건수를 줄여 주면 위쪽에서 처리하는 건수가 적어지므로 더 효율적이다. 하지만 ORACLE 버전에 따라 OPTIMIZER가 서로 다른 실행 경로를 생성하고, 데이터의 건수나 통계의 유무등에 의해 생성되는 경로가 달라지므로 반드시 실행계획을 본 후에 실행 시키는 것이 좋다. 2. EXISTS 대신 JOIN의 사용 일반적으로 sub-query 보다는 다음과 같이 join을 하는 것이 더 좋다.: SELECT … FROM ... WHERE EXISTS (SELECT .... 2023. 9. 4.
[ORACLE] 인덱스 타는 방법 인덱스를 타게하는 방법들 인덱스 컬럼에 대한 NOT 사용 제한 Where절 내에서 인덱스 컬럼에 대해 NOT 비교문을 사용할 경우 해당 컬럼을 가공하는 것과 동일한 효과가 나타나서 ORACLE은 NOT을 만나게 되면 해당 컬럼에 대한 인덱스를 사용하지 않는 실행계획을 수립한다. !=보다 다른 범위로 설정해서 사용하자 --인덱스 사용하지 못하는경우 SELECT … FROM ... WHERE A != 0; --인덱스 사용하는 경우 SELECT … FROM ... WHERE A > 0; INDEX 컬럼에 대한 가공 Where절에서 인덱스 컬럼이 가공되어 사용될 경우 optimizer는 해당 인덱스를 사용하지 않게 되고 사용 가능한 다른 인덱스가 없다면 이 SQL문은 full-table scan을 통해 결과값을.. 2023. 9. 4.
[ORACLE] 인덱스 접근 ORACLE은 두 방식으로 index를 통해 접근한다. 1. INDEX UNIQUE SCAN 조회하고자 하는 테이블에 인덱스가 존재하는 경우 optimizer는 인덱스를 이용한다. 예) 테이블에 A 컬럼에 A_PK라는 unique index와 B컬럼에 non-unique index인 B_1이라는 두개의 인덱스가 존재한다. -- INDEX UNIQUE SCAN 작업만으로 수행 SELECT * FROM WHERE A = 'ABCD'; 내부적으로 두 개의 step으로 나뉘어 query를 수행한다. 첫번째는 먼저 A_PK 인덱스를 통한 INDEX UNIQUE SCAN 작업이 수행되어 A_PK에서 A이 'ABCD'인 데이터의 물리적 위치인 RowID를 찾는다. 그 다음에 RowID를 이용한 TABLE ACCESS.. 2023. 9. 4.
728x90