본문 바로가기

DB의 재조직 저번 글에서 서술한 바와 같이 DB에서 삭제 명령을 실행할 때는 DELETE BIT만 바꿔 처리한다. 그렇다면 삭제가 매우 희소한 릴레이션에서는 DELETE BIT를 관리하는 것이 아닌 SHIFT하는 것이 좋을 수도 있지 않나? 라는 의문이 들기 마련이다. 어느정도 맞는 말이지만 실제로는 그렇게 하지 않는다. 왜냐하면 첫째로, 테이블에는 인덱스를 관리하는 별도의 트리가 존재하는데, SHIFT를 해버리면 레코드의 물리 메모리 주소가 변경되어 인덱스 자체를 재조정하거나 수정하는 오버헤드가 커지게 된다. 둘째로, 데이터베이스는 디스크에서 데이터를 읽을 때 블록 단위로 데이터를 처리하기 때문에 SHIFT를 위해서 삭제된 레코드 뒤에 있는 모든 블럭을 메모리에 로드해 밀어야한다. 따라서 해당 요청을 처리하기 위.. 더보기
조인을 포함한 뷰의 갱신 뷰에서는 갱신이 불가능한 뷰 종류들이 있다. 1. 한 릴레이션 위에서 정의되었지만 기본키를 포함하지 않는 뷰 2. 기본 릴레이션에서 뷰에 포함되지 않은 애트리뷰트가 NOT NULL인 뷰 3. 집단 함수를 사용한 뷰 4. 조인을 포함한 뷰 사실 조인을 포함한 뷰는 일부는 이론적으로 갱신 가능한 뷰다. 이해를 돕기위해 예시를 들어보겠다. 사원_기본(사원번호,이름,부서), 사원_디테일(사원번호,월급,전화번호)로 두 릴레이션을 나눴다고 생각해보자. 이 두 릴레이션은 1:1 대응 관계고 자연조인 할 수 있다. 그렇다면 뷰는 사원(사원번호,이름,부서,월급,전화번호)로 표현할 수 있다. 이런 뷰의 경우에는 조인을 했지만 갱신이 가능하다.그렇지만 1:N의 경우는 조금 다르다. 사원(사원번호,이름,부서)와 부서(부서.. 더보기
SSD와 데이터베이스 재조직 SSD를 데이터베이스에서 사용하더라도 DB단에서는 데이터를 재조직해줘야함. SSD는 HDD에서 처럼 Seek Time이 거의 존재하지 않아서 굳이 데이터 재조직을 할 필요 없는거 아니냐? SSD에서도 DB 재조직을 해야하는 이유 1. DB단에서 DELETE 연산을 처리할 때 실제 메모리에서도 DELETE하는 것이 아닌 Logical DELETE를 수행해 디스크를 실제로 비우지 않음. -> DELETE할 때 마다 디스크를 비우게 되면 DISK I/O에 너무 많은 오버헤드를 발생시켜 성능이 하락함. 따라서 Flag만 남기고 INSERT할 때 재사용함. -> 따라서 OS 입장에서는 파일의 절대적인 크기가 변하지 않기 때문에 변화를 인식하지 못함. -> OS에서 삭제 명령을 내리지 않기 때문에 SSD에서는 과거.. 더보기
discord.py 8편 - 버튼(심화) https://mookguksu.tistory.com/18 이 글을 보고 오지 않았다면 한번씩 보고오는걸 추천한다. n개 중에 1개를 선택해야하는 봇을 만들고 싶다. 그렇다면 @tree.command(name="버튼", description="버튼") async def button(interaction:Interaction,개수:int): view = ui.View() async def callback(interaction:Interaction): await interaction.response.edit_message(content="클릭!") for i in range(개수): button = ui.Button(label=i) view.add_item(button) button.callback=call.. 더보기
무지성 클론코딩 4 정전이 난 관계로 사진없이 유저 닉네임, 소개, 프로필사진 변경기능 추가와 리팩토링. 더보기
무지성 클론코딩-3 코드 전반적인 리팩토링 프로필쪽 개발 더보기
무지성 클론코딩 - 2 db연동 선택된 주소 메인화면에 띄우기 더보기
무지성 클론코딩 이런거 만드는중.. 더보기