본문 바로가기

DB

(16)
[개념정리] 조인튜닝 - 소트머지조인, 해시 조인 소트머지조인과 해시조인은 PGA (process/program/private global area - 프로세스에 종속적인 고유 데이터를 저장하는 용도)를 사용해 SGA 버퍼캐시에서 데이터를 읽을 때 보다 훨씬 빠르게 대량의 데이터 조인을 처리 할 수 있다. SGA 에 캐싱된 데이터는 여러 프로세스가 공유 할 수 있지만, 동시 엑세스가 안된다. 프로세스간 엑세스를 래치(lock)로 직렬화 하고, 나아가 블록 읽을 때 버퍼 lock이 실행 되기 때문에 PGA에 비해 느릴 수 밖에 없다. 소트 머지 조인 : 조인 컬럼에 인덱스가 없거나 대량 데이터 조인이여서 인덱스가 효과적이지 않거나 NL은 대량 데이터 조인 시 성능이 매우 느림 - 조인 과정에서 액세스 하는 모든 블록을 랜덤 액세스 방식으로 '건건이' DB..
[개념정리] 조인 튜닝 - NL 조인 인덱스를 이용한 조인으로 인덱스 튜닝 원리 적용. Outer, Inner 테이블 모두 인덱스 사용(Outer 테이블크기가 작다면 Table Full Scan 이용할 수도), Inner 테이블은 인덱스 사용(인덱스 사용 안할 경우Outer 결과집합 건수만큼 Table Full Scan하며 조인 하기 때문) (옵티마이저 힌트 - use_nl(테이블 명 or alias)) Nl 조인은 그 수행 과정에 있어, 중첩 루프 처럼 Outer 테이블의 한 레코드씩 순차적으로 진행한다. NL 조인 특징 랜덤 액세스 방식 - 레코드 하나를 읽기 위해 블록 전체 Read (대량 데이터 조인시 NL조인 불리한 이유) 한 레코드씩 순차 진행 - 부분범위 처리가 가능한 상황에서 빠른 응답 인덱스 구성 전략 중요 - 조인 컬럼 인..
[개념정리] 인덱스 스캔 효율화 인덱스 선행컬럼이 조건절에 없거나, '='조건이 아닐 경우 스캔량이 비효율 적으로 많아진다. 인덱스 스캔 효율성 측정 SQL 트레이스에 인덱스 스캔과정에서 읽은 블록(cr 이 블록 개수 인데, 인덱스 리프 블록에는 평균 500개의 레코드가 담기므로, 읽은 블록 수 * 500 = 읽은 레코드 수) 수에 비해 얻은 레코드 수가 현저히 적다면 비효율 정도를 가늠 할 수 있다. 액세스 조건 / 필터 조건 인덱스 스캔 단계에 처리하는 조건절은 액세스 조건 / 필터 조건으로 나뉨 인덱스 액세스 조건 : 인덱스 스캔 범위를 결정하는 조건 (스캔 시작점을 결정, 리프블록 스캔 중 어디서 멈출지를 결정) 인덱스 필터 조건 : 테이블로 액세스 할 지를 결정하는 조건(p.183 c4가 테이블 액세스..? 여기서 테이블 액세..
[개념정리] 인덱스 인덱스 RowId에 대한 오해 인덱스를 통한 RowId로 테이블 액세스는 고비용연산 이다. -> Index Range Scan이 Table Full Scan보다 오래 걸릴 수 있다. RowId가 메인 메모리 DB 처럼 물리적으로 데이터와 바로 연결된 포인터가 아니라, 디스크 상에서 테이블 레코드를 찾아가기 위한 위치정보를 담는 논리적 주소이기 때문. 포인터의 역할을 할 수 없는 이유는? 테이블 블록이 LRU에 의해 캐싱되었다, 밀려났다 다시 캐싱되기를 반복, 그때마다 다른 공간에 캐싱되므로, 인덱스에서 포인터로 연결 할 수 없다. 읽어야 할 데이터가 일정량을 넘는 순간, 테이블 전체를 스캔 하는 것보다 오히려 느려진다.(인덱스 손익 분기점) Table Full Scan은 추출 건수와 상관없이 조회 성능이..
[개념정리] NoSql vs Sql 취업전 mysql, 회사에서는 Sql Server를 사용하며 sql 구문에 익숙해진 나에게 등장한 flutter의 firestore! firestore가 NoSQL 베이스라고 하기에 오랜만에 공부한 내용 정리해두려고 한다. Sql : Structured Query Language RDBMS를 관리하기 위해 고안된 언어로, 흔히 SQL DB라고 하면 엑셀과 비슷하게 이해하면 된다. 사실 SQL에 '행', '열'에서(혹은 where절, group절 등등의 조작으로) 얻어내는 결과값들은 엑셀에서도 얻어낼 수 있다. 엑셀로 생각해보자면, 행과 열에 정해진 타입, 종류 혹은 구분의 데이터를 기입한다. 데이터가 예쁜 모양으로 정형화 되어있음을 말한다. 하지만 데이터가 기하 급수적으로 늘어가고, 소셜 네트워크의 등장..
[코드처리] Update Table Row By Row 상황 정리 임시 테이블[TempTable]에 컬럼 변경할 대상 데이터 ID 변경 데이터 방법1 Cursor로 임시테이블 [TempTable] row by row update 처리 DECLARE @ID BIGINT DECLARE @Cd SMALLINT DECLARE CUR CURSOR FOR SELECT ID, Cd FROM @TempTable; OPEN CUR FETCH NEXT FROM CUR INTO @ID, @Cd WHILE @@FETCH_STATUS=0 BEGIN UPDATE [dbo].[Table] SEt Cd=@Cd WHERE ID = @ID FETCH NEXT FROM CUR INTO @ID, @Cd END DEALLOCATE CUR 방법1이 실행결과에 비해 장황한 코드기술..이라 쉬운 방법..
[개념정리] ISNULL vs NULLIF NULLIF(5, 5) 비교 연산을 통해 비교 대상 데이터가 동일할 경우 NULL을 반환, 동일 하지 않을 경우 첫번째 비교 대상을 반환한다. NULLIF(5,5) => NULL 반환 NULLIF(5,10) => 5 반환(첫번째 인수 반환) CASE로 NULLIF 기능을 구현할 수 있다.(CASE문으로 대체 가능) CASE WHEN 5 = 5 THEN NULL ELSE 5 END 위에 비교대상으로 지정된 5, 10 등은 변수 혹은 테이블 내부 컬럼으로 지정해서 사용하면 된다. ISNULL(A,B) A(첫번째 Param)가 NULL 일 경우 B(두번째 Param)을 반환 활용 예제 사람들의 평균 몸무게를 구하되 몸무게 데이터가 NULL 일 경우 특정 데이터로 대체해서 평균을 구할 때 SELECT AVG(I..
[코드처리] ROW_NUMBER( ) OVER(ORDER BY) Tree 구조를 게시판에 표시 해야 해서 WITH Tree_Query (a,b,c,Level) AS ( SELECT a ,b ,c ,1 FROM 테이블 AS [A] WHERE 부모ID IS NULL--연결된 상위 데이터 ID UNION ALL SELECT a ,b ,c ,C.Level + 1 FROM 테이블 AS [A] INNER JOIN Tree_Query AS [C] ON A.부모ID = C.ID ) 코드를 짜두고는 부모데이터(Root Node)는 최신순으로, 하위데이터들은 최신순 반대로 Sorting해서 데이터를 표시하고 싶은데 방법이 없어서 ROW_NUMBER() OVER(ORDER BY) 처리로 Sorting할 기준 컬럼을 만들었다. Partition개념을 추가해서 쓰는 쿼리가 많던대 이미 Un..