안녕하세요 해당 강의 2분 50초 정도에서 궁금한 것이 있습니다. 고객이 한 번도 주문을 하지 않은 경우에도 고객정보는 조회가 되어야하기 때문에 left outer join을 쓰는 이유는 이해가 되는데요. 그 다음 주문접수 직원정보를 구해야 할 때 left join을 하는 부분이 이해가 되지 않습니다. 저는 join key를 b와 c 테이블에 대해서 하니까 b와 c간의 join으로 생각이 되어서 inner join을 걸었었는데요. 이건 사실 customers와 employees 간의 outer join이니까 left outer join을 써야하는걸까요?
질문이 있는 경우 다음과 같이 시도해보고 공유해주세요 구글에 검색한 후, 어떤 결과가 나왔는지 그 결과를 토대로 어떤 시도를 했는지? 시도에서 어떤 과정이 진행되지 않았는지 데이터를 추출하는 과정에 대한 고민은 Input / Output을 작성해주세요 안녕하세요. 시작 전에 문제를 풀고 강의를 수강하라고 하셨는데 말씀주신 문제가 섹션별로 나와있는 퀴즈를 말씀하신걸까요?
안녕하세요. 49강 수강 중 질문이 있습니다. for table_name in TABLES.keys(): extract_from_postgres(postgres_schema, table_name) >> load_to_snowflake(snowflake_schema, table_name) 현재 강사님이 주신 이 코드 기준 테이블 2개 tasks 2개 해서 총 4개의 tasks가 airflow tasks list의 결과로 반환되었는데요, 이때의 결과물인 tasks_id가 어떻게 만들어지는지 궁금합니다. 조금 더 정확히는 forloop으로 task를 정의할 때 어떤 식으로 DAG가 이 task의 개수를 세고 네이밍을 하는지 궁금합니다. 혼자 테스트를 해보고 싶어서 임의의 테이블 하나를 postgres:production에 추가하고 코드내부의 TABLES 딕셔너리에 제가 추가한 테이블의 스키마를 추가하였습니다. 이때 테이블이 총 3개가 되었으므로 airflow tasks list의 결과가 총 6개가 될 것으로 예상하였는데 여전히 4개로 나옵니다. 제가 놓친 부분이 있을까요? 현재 production schema아래 3개의 테이블이 있는 상태입니다. airflow=# SELECT table_name FROM information_schema.tables WHERE table_schema = 'production' AND table_type = 'BASE TABLE' ORDER BY table_name; table_name ------------------------ session_timestamp user_session_channel user_session_channel_2 (3 rows) 감사합니다. 학습 관련 질문을 상세하게 남겨주시면 더 좋습니다. 예를 들어 이해가 안 가는 부분이 있다고 하면 강의에서 어느 부분인지 어떤 부분이 이해가 안되는지 등등 추가 정보가 큰 도움이 됩니다. 그리고 에러가 난다면 어떤 에러 메시지가 나오는지 같이 공유해주세요. 혹시라도 유사한 질문이 있었는지 먼저 확인 부탁 드리겠습니다. 서로 예의를 지키며 존중하는 문화를 만들어갔으면 하고 인프런 서비스 운영 관련 문의는 1:1 문의하기를 이용해주세요.
안녕하세요 공부하다가 보니 FetchGroups방식으로 했을때 Map으로 반환되고 DTO로 변환해야하는 오버헤드가 발생하는데요 Multiset방식으로 하면 1:N 관계에서 바로 DTO로 반환 할 수 있는데요 코드 보기가 조금은 더 복잡해 보이지만 WHERE절이 있을때 현재 테이블 데이터와 인덱스 상으로는 성능적으로 더 괜찮은거 같아서 multiset방식은 강의에 없어서 어떤지 궁금해서 여쭤봅니다 public List<ActorFilmography> findActorFilmographyWithMultiset(ActorFilmographySearchOption searchOption) { final JFilmActor FILM_ACTOR = JFilmActor.FILM_ACTOR; final JFilm FILM = JFilm.FILM; return dslContext.select( ACTOR, DSL.multiset( DSL.select(FILM.fields()) .from(FILM) .join(FILM_ACTOR) .on(FILM.FILM_ID.eq(FILM_ACTOR.FILM_ID)) .where( FILM_ACTOR.ACTOR_ID.eq(ACTOR.ACTOR_ID), containsIfNotBlank(FILM.TITLE, searchOption.getFilmTitle()) ) ).convertFrom(r -> r.into(Film.class)) ) .from(ACTOR) .where( containsIfNotBlank(ACTOR.FIRST_NAME.concat(" ").concat(ACTOR.LAST_NAME), searchOption.getActorName()) ) .fetch(record -> new ActorFilmography( record.value1().into(Actor.class), record.value2() )); } WHERE 조건 포함 시 성능 비교 fetchGroups 방식 (cost=405, rows=609) Film 필터링 먼저 → FilmActor 조인 → Actor 필터링 1. film 테이블 스캔 (1000 rows) └─ LIKE '%COMMANDMENTS EXPRESS%' → 111 rows 2. film_actor 인덱스 조회 (idx_fk_film_id) → 609 rows 3. actor PRIMARY KEY 조회 → 609 rows └─ LIKE '%LOLLOBRIGIDA%' → 1 row (최종) 특징: - Film 조건이 선택적이면 먼저 필터링하여 조인 범위 축소 - 하지만 Actor 필터링은 마지막에 수행 (비효율) - 609개 row가 네트워크 전송 → 애플리케이션에서 1개로 그룹핑 --- multiset 방식 (cost=20.2 + 13.3 × filtered_actors) Actor 필터링 먼저 → 각 Actor의 Film 서브쿼리 1. actor 테이블 스캔 (200 rows) └─ LIKE '%LOLLOBRIGIDA%' → 1 row (필터링 후) 2. 필터링된 1개 actor에 대해 서브쿼리 실행: - film_actor PRIMARY KEY 조회 (27.3 rows 추정) - film PRIMARY KEY 조회 (27.3번) - LIKE '%COMMANDMENTS EXPRESS%' → 1개 매칭 특징: - Actor 조건을 먼저 적용하여 서브쿼리 실행 횟수 최소화 - 필터링된 1개 Actor만 네트워크 전송 (JSON 포함) - Film 필터링은 각 actor 서브쿼리 내부에서 수행 --- 실제 Total Cost 계산 fetchGroups Total: 405 네트워크 전송: 609 rows (Actor + Film 중복 포함) 애플리케이션 처리: Map 생성 + Stream 변환 multiset Total: 20.2 + (13.3 × 1) = 33.5 네트워크 전송: 1 row (Actor + JSON array) 애플리케이션 처리: JSON 역직렬화 결론: WHERE 조건이 있으면 multiset이 압도적으로 유리 (405 vs 33.5) FetchGroups는 Actor를 나중에 필터링하고 multiset은 actor를 먼저 필터링해서 1개에 대한 film을 여러개 가져와서 현재 데이터에서는 더 유리한데 일반적인 사용법이 궁금합니다
안녕하십니까 강사님! 자세하게 좋은 정보 알려주심에 항상 감사드립니다!! 제 짧은 지식으로 궁금한 점이 생겨 질문드립니다. 사용자 인증을 구현할때 jwt토큰을 사용하는 방법도 있는 걸로 압니다. jwt토큰도 마찬가지로 signed cookie처럼 암호화(인코딩)해서 헤더에 같이 보내는걸로 알고 있습니다. 두 방식이 비슷하다고 생각하는데 jwt토큰과 signed cookie로 인증하는 차이가 무엇인지 궁금합니다. 짧은 경험상 모든 기술간의 트레이드 오프가 존재했던 거 같은데 jwt토큰과 signed cookie에도 그러한 부분이 있는지 궁금합니다 ! 항상 감사드립니다~
ORDER BY 절의 NULL값 위치 지정의 설명에서, 강의 자료의 134 페이지에 나온 설명을 보면, NULL 값의 위치가 지정된 항목은 오름/내림차순을 지정하지 않으면 자동으로 오름차순 되는 것은 ORDER BY 함수의 기본 기능으로 충분히 이해 가능하지만, 가장 마지막 문장인, "그 외의 직원들은 급여를 기준으로 오름차순으로 정렬한다."에서 [급여]가 아닌, 커미션 아닌가요? 실습을 같이하면서 계속 다른 조건으로 실행해봐도, 자료에서 제공한 같은 함수를 사용해봐도 COMM기준으로 오름차순 출력됩니다. 급여가 맞나요? 급여를 커미션의 의미로 작성하신 것이라면, 자료 내에서 SAL, COMM 등으로 표기 부탁드립니다. 혼동이 심하게 오네요....
먼저 유사한 질문이 있었는지 검색해보세요. 서로 예의를 지키며 존중하는 문화를 만들어가요. 잠깐! 인프런 서비스 운영 관련 문의는 1:1 문의하기를 이용해주세요. 강의에서 도커 설치 이후 실행을 하였더니 위와 같은 화면으로 뜹니다. 또한 말씀주신 turevoly 또한 파워쉘 화면에서 설치가 되지 않고 에러가 뜨는 문제가 발생되네요;; 어찌해야하는지요. ㅠㅠ
professor_bcnf, enrollment_bcnf로 테이블을 분리하는 과정에서 질문이 있습니다. 이전에 이름과 같은 자연키는 기본키로 두면 안된다고 들었는데 현재는 professor_bcnf에서 professor_name이 기본키로 있습니다. 이런 경우에는 문제가 딱히 생기지 않나요?