| |
|
| 후기 |
https://blog.naver.com/juhyunsta/222947132148 |
| https://cafe.naver.com/sqlpd |
DBA로 꽤 오랜 기간동안 일을 하고 있는데도 41회 시험에서 서술형 과락으로 떨어진 이후 이번 46회 두번째 시험에서 턱걸이로 합격을 했습니다. 객관식인 SQL 기본과 SQL 활용&튜닝 부분도 SQL가이드, 성능고도화1/2권에서 구석구석에서 출제되는듯 하고 눈으로 공부해서는 합격하기가 점점 더 어려워지는 것 같습니다. 저는 SQL을 작성할 때 자주사용하는 유형들은 저장해두고 활용하는 편인데 서술형 작성하면서 partition 구문이 기억이 안나는 황당함을 겪으며 튜닝 특히 서술형은 인덱스나 조인방식, DML등 튜닝 패턴마다 직접 타이핑이나 수기로 작성하시면서 준비하시는걸 추천합니다. SQLD 합격하신 분들 SQLP까지 도전하시면 실무에 많은 도움 되실꺼에요. |
Sqlp 주관식 1번
|
우선 제가 쓴 답은 이렇습니다.. 튜닝 포인트로는 1. or을 union all으로 변경하며 겹치는 데이터는 안 생기게 했구요 2. :v2 변수가 넘버 타입으로 들어와서 이걸 to_char으로 감싸줬어요 Merge into t1 A Using ( select c1 from t2 where c1 <> :v1 and c2 = to_char(:v2) Union all select c1 from t1 where c1 = :v1) B On ( a.c1 = b.c1) When matched then update set a.c1 = ‘Y’ where a.c1 <> ‘Y’ 문제 복기 하면서 갑자기 헷갈리는데 c2 컬럼타입이 문자형 맞았죠..? ㅠ 이 문제 15점 맞을까요..? |
| |
-
-
네 c2는 바인드로 숫자형 들어와서 형변환 일어나서 to_char썼습니다. 인덱스 타게하는게 주된 성능튜닝인거같은데 c1은 부정형비교 때문에 인덱스 안타는거 아닌가요?ㅜ
c1 = :v1 or is not null 이라고 실행계획 본거 같은데....
-
셀렉트문에서 C1의 부정형비교를 넣은 이유가 union all의 중복 데이터를 막기 위함이었습니다.. 인덱스를 타기 위해서 적은 의도가 아니었죠..
-
흠... c1컬럼이 not null 아니었나요..? 그래서 제 기억에는 조건절이 더 있는것도 아니었기도 했고.. 따로 바인드변수를 nvl으로 안 감싸줬던걸로 기억합니다.. ㅠ
-
not null 컬럼 맞았어요. 그런데 테이블 t1 필터시 is not null체크거 있더라구요 아마 c1 = null이면 false니 바인드 변수를 체크해서 is not null 조건이 붙어서 인덱스 안타는거구나해서 nvl줬거든요 저는 ...
-
저도 t2.c1 v2는 타입맞춰주면 인덱스 타는의견은 같은데... t1테이븡 c1 v1부분 왜 테이블 필터타나해서 고민하다가 저렇게 적긴했지만 저도 애매하네요
-
2개컬럼 이상의 인덱스일 때는 바인드변수값의 null 체크 유무가 의미 있을 거긴 한데요.. 단일 인덱스는 의미가 없지 않나요..? ㅠ
-
넵 인덱스 컬럼 하나씩만 있었어요.. 그래서 바인드변수가 빈값으로 들어오는 것은 크게 신경 안썼습니다
-
책보면서 생각해보니 c1 = :v1에 옵티마이저가 바인드변수 체크한걸로 보이네요 :v1 is not null으로요. null일 경우에는 아래 or 조건만 타게요.
c1 =:v1 과 and 조건 되는게 없으니 nvl안써도 되겠네요. 저는 t1테이블 인덱스 타는것만 생각하다가 적어버렸네요.
왜 문제에 t1은 인덱스 안탔을까요ㅜㅜ? 컬럼이 아니라 바인드 변수에 부정형 비교니 인덱스 타는데 지장이 없을텐데 말이죠... concat이 안됬던 걸까요?
-
인덱스를 안탔던 이유가.. :v1 변수에 빈값을 입력해서 그런게 아닐까 싶기도 하구요.. 아니면.. select와는 다르게 dml은 전체rows최적화를 목표로 삼는것과 cf등을 고려해서 옵티마이저가 인덱스 스캔을 선택 안한 것일수도 있겠네요
-
후자가 더 맞겠네요. 빈값 입력했어도 오라클에선 빈값도 널처리해서 델레알리스타님이 쓰신 정답기준으로 union all 아래 조건자체가 false니까 굳이 :v1 is not null 안붙여도 되고 옵티마이저가 지문처럼 붙여줄 것으로 보이네요.
감사합니다 생각이 좀 정리 됬네요
|
| |
저는 실기 1 번 문제는 update t1 a set c2 = 'Y' where Exists ( select 'x' from t2 where c2 = to_char(:v2) and c1 = a.c1 union all select 'x' from t1 where c1 = :v1) 2번 문제 truncate table t1; insert /*+ append */ into t1 select /*+ parallel( T2 32 ) */ * from t2 where c2 between Date '2022-01-01' and date '2022-01-31'; 이렇게 풀었습니다 공유 해주세요~ |
| |
-
-
실기 2번 문제 Delete 문에 조건 절이 있었었나요? ㅠ 기억이 안나네요.
-
-
ㅠ 그럼 인덱스 끄고서 데이터 넣는게 문제 답 이였겠네요
-
저랑 비슷하네요~ 저는 실기 2번 delete를 trucate로 고칠라다가 보니까 조건절에 일자 범위가ㅜ있어서 ..그건 못하고 나머지는 저랑 같은듯요!
모르겠어요..근데 저는 1번에서.. Exists문에 nl_sj 세미조인으로 풀었는데..틀린거같아요ㅜ 눈물나네요
-
-
-
2번 문제 pq_distribute 안써도 되는 문제였나요???
-
따로 실행계획에서 문제 되는 걸 못 찾았어서 저는 따로 입력 안 했어요 ㅎㅎ
-
혹시 객관식5번인가 파티션문젠데 인덱스 생성문 맨 뒤에 'ㄱ:' 적는거는 뭐라고 적으셨었나요?
-
-
오오 혹시그럼 객관식문젠데 실행계획에 batched 있고 문제가 아마 성능을 향상시키는법? 이런거였던거 같은데 혹시 기억나시나요??
-
아~ NL 조인 batch 작동 됐다는 문제 말씀 하시는거 맞나요?
-
근데 실기 1번 아래 필터조건중에 c1 = :b1 이게 뭔지 아시는분 바인드로 들어오는게 v1 v2 밖에 없는데 뜬금없이 b1이 어서 뭔가해서용
-
ㅋㅋㅋㅋ 저도 그거 보고 뭐지.. 했는데 OR 연산자 때문이 같이 추가 된거 같더라구요!
-
전 주관식 1, 2번 둘 다 머지문으로 풀었습니다.. 주관식 1번은 using부분에 서브쿼리로 select ~~ union all select ~~ 으로 풀었구요 그리고 :v2에 대해서 to_char로 감싸줬구요 주관식 2번도 one sql인 머지문으로 작성 했구요 힌트는 full, parallel32, pq_distribute(b, partition, none) 방식으로 병렬처리 되도록 수정 했습니다. 다른분들과 다른 방식인데 이번에도 불합격 하겠네요 ㅠㅠ
-
아~ 저도 Merge 문으로 풀려고 했는데 왜 2번 문제에서 제가 truncate 사용한지 모르겠네요^^..
-
저같은 경우에는 truncate를 사용하려다가 다른 날짜의 데이터가 있을 수 있다라고 생각했어서 머지문으로 풀었네요
-
음 Delete from 절에 조건 절로 날짜는 있었던건 맞는거죠? ㅠㅠ
-
넵 그렇습니다! 조건절에서 날짜가 명시 되었으니깐요..
-
ㅠ-ㅠ 속상하네요 저는 다음 시험 준비해야겠습니다.. 혹시 pq_distribute 사용하신 이유가 있나요?
-
저는 머지문으로 했으니 두 테이블에 대해서 비교할 때 파티션 프러닝을 탈 수 있도록 넣었습니다.. 저도 이 부분에 대해서는 애매해서 나중에 시간날 때 책 확인해보려구요..
-
객관식 60점은 넘은 것 같은데.. ㅠ 주관식 1번이라도 15점이면 합격할 것 같은데요.. 혹시.. 주관식 1번은 머지문으로 푼 거에 대해서 어찌 생각하시나요?
-
주관식 1번 Merge문제 on절에서는 어떤 컬럼으로 엮으셨나요?
-
Merge into t1 A Using ( select c1 from t2 where c1 <> :v1 and c2 = to_char(:v2) Union all select c1 from t1 where c1 = :v1) B On ( a.c1 = b.c1) When matched then update set a.c1 = ‘Y’ where a.c1 <> ‘Y’ 으로 튜닝했습니다
-
주관식 1번 튜닝포인트로는 t2와 t1의 컬럼이 동일하다고 문제 지문에 나왔어서 or을 union all으로 풀었구요 바인드 변수에서 형변환 일어난 것을 인덱스를 탈 수 있도록 수정 했습니다
-
님께서 적은 주관식 1번 답안에서 저도 확실치는 않지만.. union all 부분에서 겹칠 데이터가 있을 수 있는게 보이긴 하는데요.. 이 부분만 제외하면 제가 작성한 쿼리랑 비슷한 성능 나올수도 있겠네요.. ㅠ
-
실기2번 delete 절 헥심은 해당 파티션만 truncate 하는거 같습니다
-
실기 1번은 c1은 넘버타입인데 풀스캔 한거 to_number로 변환해서 인덱스 스캔 하게 했고 c2는 varchar2라 to_char로 했습니다 저도 union all은 중복데이터가 걸려서 그냥 뒀어요 ㅎㄷㄷ
|