TRINO DB 에서 매주 목요일 구하기 

 

SELECT date_add('day', -day_of_week(current_date), date_add('day', 4, current_date));

 

@set anl_dt = CAST('2024-02-29' AS DATE)

 

주의 set은 소문자로 써야함

; 붙이면 안됨

 

 

SELECT *

FROM TABLE

WHERE anl_dt = ${anl_dt}; 

 

 

 

INTERVAL '1' DAY를 활용하면 날짜 더하기가 가능하다

 

CAST('2023-07-13' AS DATE) + INTERVAL '1' DAY


이게 맨날 헷갈려서 정리해본다.

1. 오라클 NVL(표현식1, 표현식2), 서버 ISNULL(표현식1, 표현식2): 표현식 1의 결과값이 null인경우 표현식 2를 출력
2. NULLIF(표현식2, 표현식1): 표현식1이 표현식 2와 같으면 null, 같지 않으면 표현식 1을 리턴한다.
3. COLLAESCE(표현식1, 표현식2): 임의의 개수 표현식에서 null이 아닌 최초 표현식을 나타낸다. 모든 표현식이 null이라면 null을 리턴한다

 

 

MS-SQL의 경우 SP를 사용할 때 Declare를 통해 로컬변수를 선언 할 수 있었는데,  마찬가지로 Redshift에서도 @set을 사용하여 로컬변수를 선언 할 수 있다.

 

@set YMD = '20230511'

SELECT TOP 10 *
FROM TABLE
WHERE DATD > ${YMD}

 

 

 

주의할점은 @SET 변수명 = 이후에 들어가는 모든 텍스트가 인식된다는것이다.

 

@SET YMD = '20230511' -- 오늘날짜를 입력

 

이라고 주석을 처리한 경우에 

YMD라는 변수는 "'20230511' -- 오늘날짜를 입력" 으로 인식되어 오류가 날 수 있으니 주의가 필요하다.

 

 

 

Redshift에서는 MSSQL처럼 변수선언 (DECLARE)가 안되는줄 알았는데...?

SET DECLARE가 가능하다.

 

@SET 변수명 = 'TEST'

SELECT TOP 10 *
FROM 테이블
WHERE 컬럼 = $변수명

 

WHERE 조건에 $변수명 이라고 쓰는게 포인트.. 이걸 왜 이제알았지?

Amazon Redshift를 사용하기전에는 MS-SQL을 사용하였는데, 직접 사용해보니 두 SQL의 큰 차이가 체감되어 어떤점이 다른지를 정리해보려고한다.

 

1. OLTP VS OLAP

1) OLTP (Online Transaction Procesisng)

- 다수의 사용자들에게서 발생하는 Transaction을 DB에서 처리하는 과정.

- Insert, Update, Delete등의 과정에서 무결성을 보장하여 처리하고, 그 결과를 Select 하는 과정

 

2) OLAP (Online Analytical Processing)

- OLTP가 트랜잭션 기반의 데이터 자체의 처리를 위한 DB라면 OLAP는 이미 저장된 대용량데이터를 기반으로 

'분석'하는데 중점이 되어있는 DB

 

MS-SQL은 OLTP 이기 때문에 with (nolock) 기능을 제공하여 타 사용자들에 의해 한 테이블에서 트랜잭션이 일어나더라도 테이블을 잠금처리하지 않으면서 Select, Insert, Update, Delete 트랜잭션이 가능했다.

 

반면 Redshift는 DW기반의 OLAP DB이다. 이번에 처음으로 Redshift를 사용하면서 가장 당황한것은 nolock 기능이 없다는 것이었다!! 그래서 DB배치가 실행되는 시간동안에는 테이블을 사용할 수가 없다. ;;  

 

2. Amazon Redshift 세 가지 잠금 모드

LOCK 유형 설명
AccessExclusiveLock LTER TABLE, DROP 또는 TRUNCATE와 같은 DDL 작업 중에 주로 획득. AccessExclusiveLock은 다른 모든 잠금 시도를 차단
AccessShareLock  UNLOAD, SELECT, UPDATE 또는 DELETE 작업 중에 획득. AccessShareLock은 AccessExclusiveLock 시도만 차단. AccessShareLock은 테이블에서 읽기 또는 쓰기를 시도하는 다른 세션을 차단하지 않습니다.
ShareRowExclusiveLock COPY, INSERT, UPDATE 또는 DELETE 작업 중에 획득. ShareRowExclusiveLock은 AccessExclusiveLock 및 기타 ShareRowExclusiveLock 시도를 차단하지만, AccessShareLock 시도는 차단하지 않음.

 

 

 

잠금모드 참고

https://aws.amazon.com/ko/premiumsupport/knowledge-center/prevent-locks-blocking-queries-redshift/

+ Recent posts