묻고 답해요
150만명의 커뮤니티!! 함께 토론해봐요.
인프런 TOP Writers
-
미해결비전공자도 이해할 수 있는 MySQL 성능 최적화 입문/실전 (SQL 튜닝편)
풀 인덱스 스캔 질문있습니다.
CREATE INDEX idx_name ON users (name); EXPLAIN SELECT * FROM users ORDER BY name LIMIT 10; <- 이 부분에서 idx_name을 안쓰고 컬럼명만 작성했는데 어떻게 풀 인덱스 스캔을 썼는지 아는건가요?
-
미해결비전공자도 이해할 수 있는 MySQL 성능 최적화 입문/실전 (SQL 튜닝편)
멀티컬럼인덱스 질문있습니다.
강의자료:https://jscode.notion.site/661a5bcd11c74b4c97520460dbc4a328주의 사항 2에서요. 정렬을 자세히 잘 살펴보면 이름 기준으로 정렬이 되어 있지는 않다. 왜냐면 같은 부서를 가진 데이터끼리만 정렬을 시켰기 때문이다. 실제로 아래 SQL문을 실행시킬 때 인덱스를 활용하지 못한다.윗 부분에 말 뜻이. 처음부터 이름 순으로 정렬이 안되어있어서 멀티컬럼인덱스가 사용이 어렵다는 말씀인가요?즉 아래 컬럼 처럼 안되어 있어서 멀티 컬럼인덱스가 적용이 안된다는 말씀인가요?부서 | 이름 | 순위----------------------회계 | 김미현 | 2 회계 | 김민재 | 3 인사 | 하재원 | 6 운영 | 이재현 | 4 운영 | 조민규 | 5 인사 | 최지우 | 7 회계 | 박미나 | 1
-
미해결오라클 성능 분석과 인스턴스 튜닝 핵심 가이드
HOST CPU 자료를 받으려면?
HOST CPU는 AWR 뷰를 통해서 조회하여 나타나게 할 수 있는데, 저도 실제 서버하고와의 오차는 있다고 듣기도 했고, 보기도 했습니다. 강사님은 보통 실제 CPU 그래프를 표현한다면,서버에서 내려 받은 정보로 하시나요?
-
미해결시니어 백엔드 개발자가 알려주는 데이터베이스 개론 & SQL
강의자료 다운 질문..
안녕하세요..혹시 강의 자료는 어디서 다움받을수 있나요 ?커리클럼에서는 자료 다운이 없어서요..감사합니다.
-
해결됨데이터 분석 SQL Fundamentals
안녕하세요. 튜닝핵심가이드강의 관련해서 여쭤보고 싶어서 남깁니다.
안녕하세요. 튜닝핵심가이드강의 관련해서 여쭤보고 싶어서 남깁니다. 현역으로 5년차 인데 요즘들어 쿼리성능적으로 실행계획에 관심이 가서 해석과 튜닝을 잘하고 싶어서 선생님께서 강의하시는 [오라클 성능 분석과 인스턴스 튜닝 핵심 가이드]를 들으면 실행계획을 해석과 스스로 튜닝까지 할 수 있는데까지 설명해주시는지 궁금합니다!!
-
미해결비전공자도 이해할 수 있는 MySQL 성능 최적화 입문/실전 (SQL 튜닝편)
쿼리 튜닝 관련 질문 (limit)
안녕하세요 강사님 좋은 강의 정말 감사드립니다. 실습 따라면서 튜닝을 익혀가고있는데 이번 강의에서 이해되지 않는 부분이 있어 질문 남깁니다.일단 저는 MariaDB를 이용하여 실습을 하고 있습니다 죄송합니다 ㅠ -- 튜닝 전 쿼리 SELECT st.student_id, st.name, AVG(sc.score) AS average_score FROM students st JOIN scores sc ON st.student_id = sc.student_id GROUP BY st.student_id, st.name, sc.year, sc.semester HAVING AVG(sc.score)=100 AND sc.year=2024 AND sc.semester=1; -- 튜닝 쿼리 SELECT st.student_id, st.name, AVG(sc.score) AS average_score FROM students st JOIN scores sc ON st.student_id = sc.student_id WHERE sc.year=2024 AND sc.semester=1 GROUP BY st.student_id, st.name, sc.year, sc.semester HAVING AVG(sc.score)=100;두 쿼리 실행 속도에 별로 차이가 없어서 1) students, scores 두 테이블 각각 데이터 300만개로 늘리고 2) 두 쿼리 모두 동일하게 limit 10을 붙여줬더니 갑자기 성능 차이가 엄청나게 났습니다. -- 튜닝 전 쿼리 SELECT st.student_id, st.name, AVG(sc.score) AS average_score FROM students st JOIN scores sc ON st.student_id = sc.student_id GROUP BY st.student_id, st.name, sc.year, sc.semester HAVING AVG(sc.score)=100 AND sc.year=2024 AND sc.semester=1 LIMIT 10; -- 튜닝 쿼리 SELECT st.student_id, st.name, AVG(sc.score) AS average_score FROM students st JOIN scores sc ON st.student_id = sc.student_id WHERE sc.year=2024 AND sc.semester=1 GROUP BY st.student_id, st.name, sc.year, sc.semester HAVING AVG(sc.score)=100 limit 10;제가 궁금한 것은 limit 10을 붙이면 튜닝을 하든 안하든 실행 속도가 더 줄어들어야 할 것 같은데 튜닝 전 쿼리가 갑자기 1분넘게 소요되더라고요.튜닝 후 쿼리는 limit을 붙이나 안붙이나 별 차이가 없는데 튜닝 전 쿼리는 왜 limit을 붙이면 갑자기 성능이 엄청나게 저하되는걸까요..?? 확인해주시고 답변 주시면 많은 도움 될 것 같습니다 감사합니다!
-
해결됨비전공자도 이해할 수 있는 MySQL 성능 최적화 입문/실전 (SQL 튜닝편)
페이지기반 페이지네이션 쿼리를 최적화하고 싶습니다.
게시판 비슷한 기능을 구현중인데 아무래도 커서기반보다는 페이지를 원하는대로 넘나들 수 있는 페이지기반 페이지네이션을 구현하고 싶어서 구현은 했는데 대용량 데이터에는 맞지 않은 듯해서 어떻게 최적화를 하면 좋을지 고민하고 있습니다.현재 저는 Postgres DB를 사용하고 있으며SQL를 전부 올리기보다 고민하고 있는 부분에 대해서만 간략히 적도록 하겠습니다.api에서는 SQL를 연속으로 두번 실행시키고 있습니다.1. 조건에 맞는 모든 ROW를 COUNT2. 1페이지당 사이즈와 현재 페이지로 OFFCET FETCH NEXT ROWS ONLY 절을 사용해서 ROW를 건너뛰고 검색을 하고 있는데지금 구현대로면 최악의 경우일때는 거의 DB 전체를 두번 조회하는거나 다름 없을 것 같습니다.사이드 프로젝트일때는 상관없을 것 같긴한데 실무에서는 어떤방식으로 최적화가 가능할까요?검색을 해보니 대용량 데이터에서는 커서기반으로 하라는 의견이 많은 것 같은데 그래도 페이지기반의 장점을 살리고 싶습니다.
-
미해결데이터 분석 SQL Fundamentals
섹션5 Group by 실습-01 강의 예제 질문
안녕하세요.섹션5의 두번째 강의인 Group by 실습-01 에서 다룬 예제에 대해 질문드립니다. -- 부서명 SALES와 RESEARCH 소속 직원별로 과거부터 현재까지 모든 급여를 취합한 평균 급여select b.empno, max(b.ename) as ename, avg(c.sal) as avg_sal from hr.dept ajoin hr.emp b on a.deptno = b.deptnojoin hr.emp_salary_hist c on b.empno = c.empnowhere a.dname in('SALES', 'RESEARCH')group by b.empnoorder by 1; 이 쿼리에서 b.ename을 집계함수에 넣지 않고 아래와 같이 group by에 넣어서 출력하는 방식으로 해봤는데 결과가 동일하게 나옵니다. select b.empno, b.ename, avg(c.sal) as avg_sal from hr.dept ajoin hr.emp b on a.deptno = b.deptnojoin hr.emp_salary_hist c on b.empno = c.empnowhere a.dname in('SALES', 'RESEARCH')group by b.empno, b.enameorder by 1; 두 쿼리 중 실무적으로 더 권장하는 방법이 있으신가요? 성능 혹은 기능 등의 차이가 있는지도 궁금합니다.
-
미해결데이터 분석 SQL Fundamentals
섹션2 조인 기반 메커니즘에서 조인 실습 - 04 강의 예제 질문
안녕하세요.섹션2 조인 기반 메커니즘에서조인 실습 - 04 강의 중예제에서 질문이 있습니다. -- 고객명 Antonio Moreno이 1997년에 주문한 주문 상품 정보를 고객 주소, 주문 아이디, 주문일자, 배송일자, 배송 주소 및 -- 주문 상품 아이디, 주문 상품명, 주문 상품별 금액, 주문 상품이 속한 카테고리명, supplier명을 구할 것. select a.contact_name, a.address, b.order_id, b.order_date, b.shipped_date, b.ship_address, c.product_id, d.product_name, c.amount, e.category_name, f.contact_name as supplier_namefrom nw.customers ajoin nw.orders b on a.customer_id = b.customer_idjoin nw.order_items c on b.order_id = c.order_idjoin nw.products d on c.product_id = d.product_idjoin nw.categories e on d.category_id = e.category_idjoin nw.suppliers f on d.supplier_id = f.supplier_idwhere a.contact_name = 'Antonio Moreno'and b.order_date between to_date('19970101', 'yyyymmdd') and to_date('19971231', 'yyyymmdd') 이 예제에서 볼드친 product_id를 order_items 테이블이 아닌 products 테이블의 product_id로 끌어와도 괜찮은지 궁금합니다.결과는 동일하게 나오는데 혹시나 차이가 있는지 궁금합니다.
-
미해결데이터 분석 SQL Fundamentals
섹션2 조인 실습 01 강의 질문
안녕하세요.섹션2 조인 실습 01 강의에서 질문이 있습니다. 조인 실습1의 예제들에서 강사님께서는 join을 사용하시는데 left join을 사용해도 괜찮은지 궁금합니다. 보통 조인 시 일반적으로 left join을 사용한다고 들어서요. 예를 들어 emp 테이블과 dept 테이블을 inner join할 경우 만약의 경우 emp 테이블에 존재하는 직원이 dept 테이블에서 누락되었다면 최종 join 테이블에도 그 직원이 누락될 수 있기 때문에 left join을 쓰는게 안전하지 않나 하는 생각이 들었습니다. 조인 실습1 예제의 4번째 예제에서 날짜 필터링 조건에서 to_date 함수를 쓰지 않고 fromdate >= '1983-01-01' 그냥 이처럼 써도 되는지 궁금합니다. 결과는 동일하게 나오지만 성능적 차이가 있거나 to_date 함수를 사용하는 것이 실무에서 많이 쓰는 방식인건지 궁금합니다. 조인실습1 문제4 - 저의 풀이부서명 SALES와 RESEARCH의 소속 직원들의 부서명, 직원번호, 직원명, JOB 그리고 과거 급여 정보중 1983년 이전 데이터는 무시하고 데이터를 추출하시오SELECTd.dname,e.empno,e.ename,e.job,esh.fromdate,esh.todate,esh.salFROM dept d JOIN emp e ON d.deptno = e.deptno JOIN emp_salary_hist esh ON e.empno = esh.empno WHERE d.dname IN ('SALES', 'RESEARCH')AND esh.fromdate >= '1983-01-01'ORDER BY d.dname, e.empno, e.ename, esh.fromdate;
-
미해결[리뉴얼] 처음하는 SQL과 데이터베이스(MySQL) 부트캠프 [입문부터 활용까지]
섹션4 화면 자체가 안나와요
다른 영상은 괜찮은데 섹션4는 목소리만 나옵니다. 화면은 블랙화면으로 계속 고정이네요. 다른 섹션은 안그런데... 저만 그런건가요??
-
미해결데이터 분석 SQL Fundamentals
lead lag 이해 강의에서 윈도우 절은 사용되지 않습니다.
lead lag 이해 강의에서 윈도우 절은 사용되지 않습니다.라는 내용이 이해가 안갑니다..!! 여러 윈도우 함수 이용시에 공통으로 윈도우 절이 사용가능해 보이는데,SELECT id, employee, sale_amount, COUNT(*) OVER w AS total_sales, SUM(sale_amount) OVER w AS total_amount, LEAD(sale_amount) OVER w AS next_sale, LAG(sale_amount) OVER w AS prev_saleFROM salesWINDOW w AS (PARTITION BY employee ORDER BY sale_date); 이런 내용 말고 다른 내용일까요 ?
-
미해결[리뉴얼] 처음하는 SQL과 데이터베이스(MySQL) 부트캠프 [입문부터 활용까지]
강의 화면이 안 보이고, 목소리밖에 안나와요 ;;
- 강의 영상에 대한 질문이 있으시면, 상세히 문의를 작성해주시면, 주말/휴일 제외, 2~3일 내에 답변드립니다 (이외의 문의는 평생 강의이므로 양해를 부탁드립니다.)- 강의 답변이 도움이 안되셨다면, dream@fun-coding.org 로 메일 주시면 재검토하겠습니다. - 괜찮으시면 질문전에 챗GPT 와 구글 검색을 꼭 활용해보세요~- 잠깐! 인프런 서비스 운영(다운로드 방법포함) 관련 문의는 1:1 문의하기를 이용해주세요.
-
미해결시니어 백엔드 개발자가 알려주는 데이터베이스 개론 & SQL
SQL NOT EXISTS사용과 관련하여 질문이 있습니다.
안녕하세요. 강의 잘 듣고 있습니다.강의 16:18 정도에 나오는 2000년대생이 없는 부서의 id와 name을 찾는 것에서 아래와 같이 쿼리를 하셨는데요:mysql> SELECT D.id, D.name -> FROM department AS D -> WHERE NOT EXISTS ( -> SELECT * FROM employee E -> WHERE D.id = E.dept_id and E.birth_date >= '2000-01-01'); 위의 쿼리를 다음과 같이 바꾸니 아무런 결과가 출력되지 않고 Empty set이라고 나옵니다. 혹시 이유를 알 수 있을까요? 두 쿼리에서 다른점은 빨간 글씨로 써놨는데요. subquery에서 department를 다시 D로 한번 불러준 것 외엔 없습니다. mysql> SELECT D.id, D.name -> FROM department AS D -> WHERE NOT EXISTS( -> SELECT * FROM employee E , department D -> WHERE D.id =E.dept_id AND E.birth_date >= '2000-01-01');Empty set (0.00 sec) 감사합니다.
-
미해결실무 활용 SQL 데이터 분석: 효율적인 데이터 처리와 인사이트 도출
12-2 listing 로드 문제
load할 때 id에 중복값이 있어서 고유키 설정인 안되는데 어떻게 해결하나요
-
해결됨SW 개발자를 위한 성능 좋은 SQL 쿼리 작성법
샘플 쿼리 관련 문의드립니다.
- 학습 관련 질문을 남겨주세요. 상세히 작성하면 더 좋아요! - 먼저 유사한 질문이 있었는지 검색해보세요. - 서로 예의를 지키며 존중하는 문화를 만들어가요. - 잠깐! 인프런 서비스 운영 관련 문의는 1:1 문의하기를 이용해주세요.섹션 3. 쿼리 금기사항> Non-SARG, Index 열 값 변형강의 시간 9분 정도에 나오는 3. datediff vs. dateadd 예제의 정상 구현 쿼리가 이상합니다.WHERE ShippedDate >= DATEADD(dd, -1, '19980506')위 조건이면 ShippedDate가 '19980505' 이후 인 모든 데이터가 조회될 것으로 보입니다. DB를 설치하고 진행한게 아니라 실제 데이터가 어떻게 입력되어 있는지는 알 수 없으나 조건이 이상해서 문의드립니다.WHERE ShippedDate >= DATEADD(dd,-1,'19980506') AND ShippedDate <= '19980506'제 생각으론 이렇게 수정해야 맞는 것 같습니다.
-
미해결실무 활용 SQL 데이터 분석: 효율적인 데이터 처리와 인사이트 도출
2-2. 실습 2A 6, 7번 문제
Ex 7. # fact_orders 테이블에서 product id 순으로 다음 10개의 제품을 표시하세요 select product_id, prod_cat_name_eng from ecommerce.dim_products order by product_id limit 10 offset 10; 왜 문제는 'fact_orders 테이블에서'인데 from ecommerce.dim_products인거죠?
-
미해결비전공자도 이해할 수 있는 DB 설계 입문/실전
관리자 테이블
안녕하세요.관리자 테이블에 이메일이 유저의 이메일과 다르지 않다고 생각이 들어서 합치는 게 낫다고 생각이 들었습니다. 처음에는 유저에 그냥 합쳐서 새로운 컬럼 role로 관리하려고 했는데, 중복이 있어서관리자 테이블엔, role 컬럼을 넣어서 user, admin 2개로 추가해서 이제 유저 테이블에서 FK로 사용하려고 하는데 이 방법은 어떨까요? (강의 너무 잘 듣고 있습니다, 제 멘토이십니다ㅎㅎ)
-
해결됨비전공자도 이해할 수 있는 DB 설계 입문/실전
외래 키 지정은 필수가 아닌 건가요?
안녕하세요. 강의 끝까지 다 들었는데 갑자기 외래 키 부분에서 궁금한 점이 생겼습니다. DB 설계할 때 테이블끼리 관계를 맺기 위해 외래 키를 지정하잖아요?그런데 외래 키로 지정을 안 하는 경우도 있나요? 조인 등에 사용될 속성은 있지만, 외래 키 지정은 안 해서 외래 키 제약 조건이 없도록 하는 경우도 있나요?
-
미해결Real MySQL 시즌 1 - Part 1
GAP 락에 대한 질문 드립니닷..!
해당 강의와 직접적으로 연관있지는 않으나, Lock 관련하여 공부하던 중 성욱님의 MySQL GAP Lock (두번째 이야기) 글을 보게 되었습니다.우선 정말 많은 도움이 되었음에 감사드리며, 해당 글 관련하여 질문을 드리고 싶습니다. (SELECT FOR UPDATE와도 관련있는 내용이라, 이곳 게시판을 통해 질문 드립니다.)위 글의'왜 supremum 레코드를 잠그나요 ?' 단락에서, 8, 9 번째 과정을 보면 다음과 같습니다.8. 다음 페이지에서 id=137 보다 큰 (첫번째) 레코드인 id=138 읽기9. WHERE 조건에 일치하지 않으므로 잠금 걸지 않음그런데 그 아래에서 다음과 같은 내용을 말씀해 주십니다.'REPEATABLE-READ 격리 수준을 사용하는 MySQL 서버에서는 검색하고 스캔했던 인덱스 레코드를 잠근다는 아주 기본적인 규칙 때문에 잠금이 발생하고 있었던 것이죠. 사용자 데이터가 아닌 시스템 레코드(supremum)까지도 말이죠.'그러나 이 설명에 따르면, '왜 supremum 레코드를 잠그나요 ?' 에서 언급한 동작에 모순이 발생하는 것 같습니다.5,6,7 번 과정에서는 supremum record를 읽었기에 잠갔음에도 불구하고,8, 9번의 과정에서는 id=138 읽었지만 잠그지 않고 종료했기 때문입니다.위 내용이 모순된 것이라 가정하고,왜 supremum record에 Lock이 걸리도록 동작했는지에 대한 이유를 개인적으로 찾아보고 공부한 내용들에 기반하여 추측해 보았습니다. (아직 내용을 완벽히 공부하지 못해 틀린 내용이 있을 수 있습니다. 혹시 틀린 부분이 있다면 지적해주시면 감사하겠습니다!)MySQL 의 공식 문서의 내용에 따르면, Gap Lock은 Gap Lock 의 기준이 되는 index record 이전의 간격을 잠급니다.A next-key lock on an index record also affects the “gap” before that index record- MySQL 공식문서 - Next Key Lock그러나 Gap락이 특정 index record 이전의 간격을 잠근다는 위 설명에 따르면, 어떤 index의 가장 마지막 record 이후의 간격을 잠글 수 있는 방법이 없어집니다. (Gap Lock 은 이전 간격을 잠그는 것이므로)따라서, 마지막 record 이후의 값을 잠글 수 있기 위해 supremum pseudo record 를 두었을 것이라 예상합니다.supremum pseudo record(인덱스가 가질 수 있는 가상의 가장 큰 값) 에 대한 GAP Lock은 supremum pseudo record 이전의 간격들을 잠그기 때문입니다.이는 공식 문서의 다음과 같은 내용을 통해 뒷받침할 수 있을 것 같습니다.'Suppose that an index contains the values 10, 11, 13, and 20. The possible next-key locks for this index cover the following intervals, where a round bracket denotes exclusion of the interval endpoint and a square bracket denotes inclusion of the endpoint:'(negative infinity, 10] (10, 11] (11, 13] (13, 20] (20, positive infinity)For the last interval, the next-key lock locks the gap above the largest value in the index and the “supremum” pseudo-record having a value higher than any value actually in the index. The supremum is not a real index record, so, in effect, this next-key lock locks only the gap following the largest index value.- MySQL 공식문서 - Next Key Lock이를 바탕으로 '왜 supremum 레코드를 잠그나요 ?' 의 원인을 분석해보면 다음과 같습니다.- 우선 3,4 번 과정에서 id=137 인 index record를 읽습니다. - 이때 id는 PK 이므로 값이 유니크하기에, BETWEEN 136 AND 137 조건을 통해 137이라는 값을 찾았으면, 해당 값이 조건을 만족하는 가장 마지막 값이라는 것을 알 수 있습니다.- 따라서 id=138 을 더 이상 탐색하지 않고 종료하게 되는데, 이때 id=137은 해당 PK 인덱스(리프노드 페이지) 의 가장 마지막 값이므로, supremum 레코드를 이용하여 추가적인 간격을 잠구는 것이지 않을까 하는 생각이 들었습니다.위 부분에 대한 성욱님의 의견을 듣고 싶어 질문드렸습니다.---이와 별개로, 추가 궁금증이 있습니다.1. MySQL 공식 문서에서도 언급되었던 InnoDB performs row-level locking in such a way that when it searches or scans a table index, it sets shared or exclusive locks on the index records it encounters. 라는 문장에서 검색되거나 스캔된 의 의미가 잘 이해되지 않습니다.예를 들어, id를 PK로 갖는 어떤 테이블에서, id = 3 인 row 를 탐색하기 위해서는,B-tree의 root 부터 시작 ~ leaf 노드로 이동 후, leaf node의 페이지의 전체 데이터를 스캔해야 하지 않나요?예를 들어 id=3 인 record 가 들어있는 leaf 노드의 페이지에 id가 1 ~ 5 까지 있다고 하면,leaf 노드의 페이지로 진입하여 1부터 순차 탐색을 진행할 것 같은데, 그렇게 되면 1~5 까지의 index 값 사이에서 3을 탐색하는 데 1과 2를 먼저 찾을 것이므로, id가 1, 2, 3인 row가 모두 잠겨야 하지 않나 하는 생각이 들었습니다. 혹시 공식문서에서 언급한 검색 혹은 스캔된의 의미가, 조건에 사용된 인덱스가 걸린 필드 값만 확인하는 것은 포함하지 않는 것일까요?(ex - 위 예시에서 id가 1인 인덱스 확인조건에 부합되지 않으므로 넘어감. (스캔되었다고 보지 않음)id가 2인 인덱스 확인조건이 부합되지 않으므로 넘어감id가 3인 인덱스 확인조건에 부합되므로 나머지 값 읽어옴.)위 내용들에서, 제가 어떤 부분을 잘못 생각하고 있는지 알 수 있을까요?정말 좋은 강의와 글 공유해 주셔서 감사합니다.