"테이블 파티셔닝이 필요한 이유"중에 "자원 사용 효율 증가 및 쿼리 성능 향상"을 언급주셨습니다. 예를들어 최근에 저장된 데이터들 위주로 조회하는 경우 파티션 프루닝을 통해 최근 데이터만 접근하니까 효율적이라는 내용인데요, 효율적인 부분이 제가 생각했을 때 아래 2가지 정도인 것 같습니다. 테이블의 모든 row를 접근 안해도 되고 더 적은 데이터만 읽어도 됨 버퍼풀에 자주 사용되는 일부 데이터만 로드해도 됨 여기서 질문이 있습니다. 파티셔닝키를 대상으로 인덱스를 걸면, 마찬가지로 최근 데이터만 접근가능하고, 버퍼풀에 최근 데이터만 올라가지 않나요? 인덱스를 거는 방식이 파티셔닝을 사용하는 것에 비해 어떤 점에서 부족한가요?
"DeadLock 예시(2)"에서 INSERT구문이 UNIQUE를 보장하기위해 shared lock을 걸고 확인한다고하였는데요, 그냥 처음부터 exclusive lock을 걸고 값을 확인하게 구현할 수도 있을 것 같은데, 그렇게 안되어있는 특별한 이유가 있을까요? exclusive lock을 건 상태에서는 값이 있는지 확인이 불가능하다 (shared lock을 걸었을때만 가능하다) 그냥 어쩌다보니 MySQL이 그렇게 구현되어있다. lock경합을 줄이기위한 의도로 이렇게 구현했다? 제가 생각나는 이유는 위 2개 정도인데, 어떤 이유인지 아실까요?
SQL table을 생성하면 Field, Type, Null, Key, Default, Ext 순으로 있는데 Field, Type, Null, Key, Ext은 테이블 만들때 다 다뤘던거라 알겠는데 Dafult는 항상 NULL이라고 되어있는데 어떤건지 잘 모르겠더라구요. 그리고 NOT NULL이라고 데이터 형식을 적으면 NULL 에 Yes라고 뜨는데 Default에는 NULL이라고 되어있어서 가끔 헷갈리기도 하는 것 같아요. Default가 의미하는게 무엇이고, 왜 항상 NULL이라고 되어있는지 궁금합니다
안녕하세요! 형변환 관련 문의드리고자 합니다. ::text 등 더블콜론 활용한 기능이 매우 유용하다 말씀주셨는데 ::text의 경우 to_char로 작성했을 때 대비 어떤 이점 또는 차이가 있는지 궁금합니다. 감사합니다. to_char ( hiredate , 'yyyy-mm-dd' ) vs to_timestamp(hiredate, 'yyyy-mm-dd')::text
인덱스에 대해서 약간의 의문을 질문드립니다. 인덱스가 조회의 성능 향상을 위한다는 점은 이해가 갑니다만..특정한 인덱스의 이름을 설정하는 부분이 약간 헷갈립니다. 가령 std_id 라는 인덱스를 학번을 저장 하는 column에 만들었을 때를 예시로 들겠습니다. 제가 학번의 데이터를 조회 하는경우 자체 프로그램에서 std_id의 인덱스만을 쉽게 찾는다는 의미이며, 이름설정은 단순 사용자들의 이해를 편하게 하기 위함인지가 궁금합니당
안녕하세요. 질문 드립니다. 1:N 구조의 웹 어플리케이션입니다. 종종 동일한 insert 요청이 짧은 시간에 발생 합니다. insert는 N(child) 테이블에 되어야 합니다. 해당 테이블에는 유니크 제약조건 이 걸려있어서 중복 데이터는 절대로 insert 되지 않지만 동일 요청에 의해서 DeadLock이 발생 하고 있습니다. (물론 빈도는 많지 않습니다.) 실행 순서는 이렇게 됩니다. Parent테이블의 id를 이용해서 join 쿼리로 select 합니다. (child 테이블 존재 여부 확인) child 테이블에 데이터가 존재한다면 수량 증가, 없다면 insert를 합니다. 이 때 데이터가 없는 상황에서 select-insert 요청이 서로다른 tx에서 발생할 때 데드락이 발생합니다. 이 경우 어떤 전략으로 회피할 수 있을까요? 유니크 제약 조건에 의해서 중복 데이터가 생기는건 방지되고 있고, 데드락 자체가 하루 한 건 정도 발생하고 있어서 시스템 운영상에서는 문제가 없으나 어떤 해결책이 있을지 궁금합니다.
1) index 열에 조건으로 로컬변수를 사용하면 안되는데 매개 변수는 된다는게 좀 희한하네요 혹시 이 부분 관련해서 참조할 수 있는 사이트가 있을까요? 2) 그리고 12분부터 테이블 변수 사용 예를 들어주셨는데 일반 테이블을 사용했을떄는 Order Detais 테이블 검색 후 Orders 테이블하고 결합한다고 설명해주셨는데 ==================================== SELECT TOP(5) * FROM dbo.Orders AS o INNER JOIN dbo.[Order Details] AS d ON o.OrderID = d.OrderID WHERE d.ProductID < 2 ==================================== 테이블 변수(@Orders)를 사용했을때는 @Orders를 먼저 처리하고 Order Details을 처리한다고 해주셨는데 이게 문제인 이유는 @Orders 를 먼저 검색하게 되면 where 조건이 쓸모 없게 되어 인건가요? ==================================== SELECT TOP(5) * FROM [Order Details] AS d INNER JOIN @Orders AS o ON o.OrderID = d.OrderID WHERE d.ProductID < 2 ====================================
안녕하세요. 현재 강의를 수강중인 학생입니다. RATERAL 사용 관련되어 질문이 있어 글 남겨드립니다. 잘못된 지식일 수 있지만, 서브쿼리를 사용하면 DBMS에서 지원하는 최적화를 지원받지 못해 서브쿼리를 사용하는 것보다는 최대한 조인을 사용하거나 차라리 쿼리를 나눠서 사용하는 것을 권장한다고 알고 있었습니다. 그런데 해당 강의를 수강하고 LATERAL의 사용을 적극 권장하셔서 제가 알고 있는 지식과 충돌하는 것 같습니다 혹시 어떤 경우에 LATERAL을 사용 하는 것이 좋을 지 여쭤보고자 글을 작성합니다. 감사합니다.
로직 상 서가가 등록될 때 서고id가 null값이 되면 안되는 경우에서 서가 id와 서고 id를 둘 다 primary key를 주셨는데 서가 id만 primary key 주고 서고 id는 not null 조건으로 해서 테이블 설계 해도 되는지요? 만약 된다면 두 방식의 장단점도 설명해주시면 감사하겠습니다.
안녕 하세요.. 이런 질문을 드려도 될까 모르겠습니다만.. 현재 운영 되는 사이트는 ms-sql 로 bak 파일 기준 약 50기가 정도 됩니다. 사이트를 개편 하려고 하고 있는데요..mysql 로 바꾸는 것을 논의 중 입니다. 처음 부터 데이터가 50기가 가 입력 되는 것은 아니고..운영 하면서 데이터가 늘어날텐데.. 경험 상 50기가 정도 될 것으로 예상 됩니다. 특정 테이블은 몇천만건의 데이터가 입력 될 수도 있는데요.. mysql 이나 mariadb 로 이 정도의 데이터베이스를 운영 할 수 있을지.. 사이트 속도 에는 큰 문제가 없을지.. 조언 부탁 드립니다. 감사 합니다.
안녕하세요. 이제 2회차로 다시 잘 보고 있는 수강생입니다 🙂 Ep15를 보던 중 복합 인덱스의 컬럼들 중 선행컬럼을 조건에서 누락할 경우 풀 스캔이 될 수 있다고해서 직접 쿼리를 실행해봤습니다. 환경: MySQL 8.2.0 쿼리 explain select * from users where joined_at > '2022-07-24 00:00:00'; 결과 8.0.21버전부터는 인덱스 스킵 스캔을 통해 선행 컬럼이 조건에 포함되지 않아도 후속 컬럼을 이용해 인덱스 일부 활용이 가능하다고 하는데 이 때문에 위와 같은 실행 계획나 나온걸까요?
sql을 시작할 때 체계적으로 공부하지 못해서 기초적인 질문일 수도 있는데 해답을 못 찾았습니다 ㅜㅜ join 문 사용 시 on 뒤의 컬럼 순서에 따라서도 sql문 결과값이 다른지 궁금합니다. 예를 들어, select * from tablea a join tableb b on a.product_id = b.product_id 2. select * from tablea a join tableb b on b.product_id = a.product_id 두 sql문을 실행했을 때 차이가 있을까요? 현업에서 2번 형태를 많이 본 것 같아서 혹시 차이가 있다면 어떤 차이인지 설명해주시면 감사하겠습니다.
- 학습 관련 질문을 남겨주세요. 상세히 작성하면 더 좋아요! - 먼저 유사한 질문이 있었는지 검색해보세요. - 서로 예의를 지키며 존중하는 문화를 만들어가요. - 잠깐! 인프런 서비스 운영 관련 문의는 1:1 문의하기를 이용해주세요. 수업의 14:23 을 참고하면 메시지 창에 스캔수, 논리적 읽기, 실제 읽기, ... 등 값 들이 보이는데 제 화면의 메시지창에는 (8개 행이 영향을 받음) 이것밖에 안뜹니다 ㅠㅠ 보이도록 하는 방법이 궁금합니다
안녕하세요, 강의 잘 듣고 있습니다. 강의와 책을 동시에 보면서, 학습을 하고 있습니다. 근데 강의와 도서에서 설명하는 내용에 다른점이 있는 것 같아서 질문드립니다. REAL MySQL 8.0 (2권) 중 11.4.6 COUNT() 절에서는 아래와 같이 설명되어 있습니다. MyISAM 스토리지 엔진을 사용하는 테이블은 항상 테이블의 메타 정보에 전체 레코드 건수를 관리한 다. 그래서 "SELECT COUNT(*) FROM tb_table"과 같이 WHERE 조건이 없는 COUNT(*) 쿼리는 MySQL 서버가 실제 레코드 건수를 세어 보지 않아도 바로 결과를 반환할 수 있기 때문에 빠르게 처리된다. 하지만, 강의 Ep.03 COUNT(*) vs COUNT(DISTINCT) 튜닝 에서는 WHERE 절 없는 COUNT(*) 는 제거 대상이라고 설명을 해주셨습니다. 책의 내용처럼 메타 정보에서 가져온다고 한다면 굳이 제거 대상이 될 것 같지는 않은데, 혹시 제가 놓친 배경이 있었을까요? 아니면 이게 뭔가 이분법적인 차원에서 접근하기에는 어려운 내용일까요?