-
Notifications
You must be signed in to change notification settings - Fork 7
Query Performance Improvement Template Deletion
정회성 edited this page Oct 29, 2024
·
1 revision
- Members: 10 entries
- Categories: 100 entries (10 entries per member)
- Tags: 2000 entries (200 entries per member)
- Templates: 100,000 entries (10,000 entries per member)
- Source Code: 100,000 to 500,000 entries (1 to 5 random generated per template)
- Operating System: Windows 11
- Processor: AMD Ryzen 9 4900HS with Radeon Graphics, 3.00 GHz
- Installed RAM: 16.0 GB
- System Type: 64-bit operating system, x64-based processor
- Executed with 10 threads for 100 iterations each
- Total of 1000 requests executed
- Maximum test wait time is 60 seconds
- Total request count: 1000
- Total elapsed time: 89103 ms
- Average elapsed time: 89 ms
- Total queries executed:
[8 + (number of tags * 2) + (number of source codes)]
-
Repository:
MemberJpaRepository
-
Method:
fetchByName
SELECT
m1_0.id,
m1_0.created_at,
m1_0.modified_at,
m1_0.name,
m1_0.password,
m1_0.salt
FROM
member m1_0
WHERE
m1_0.name=?
- Number of Calls: 1 time
-
Method: Called from
ThumbnailJpaRepository.deleteByTemplateId
SELECT
m1_0.id,
m1_0.created_at,
m1_0.modified_at,
m1_0.name,
m1_0.password,
m1_0.salt
FROM
member m1_0
WHERE
m1_0.name=?
- Number of Calls: 1 time
-
Method: Called from
ThumbnailJpaRepository.deleteByTemplateId
SELECT
sc1_0.id,
sc1_0.content,
sc1_0.created_at,
sc1_0.filename,
sc1_0.modified_at,
sc1_0.ordinal,
sc1_0.template_id
FROM
source_code sc1_0
WHERE
sc1_0.id=?
- Number of Calls: 1 time
-
Method: Called from
ThumbnailJpaRepository.deleteByTemplateId
SELECT
t1_0.id,
t1_0.category_id,
t1_0.created_at,
t1_0.description,
(SELECT
COUNT(*)
FROM
likes
WHERE
likes.template_id = t1_0.id),
t1_0.member_id,
t1_0.modified_at,
t1_0.title
FROM
template t1_0
WHERE
t1_0.id=?
- Number of Calls: 1 time
-
Repository:
SourceCodeJpaRepository
-
Method:
deleteByTemplateId
SELECT
sc1_0.id,
sc1_0.content,
sc1_0.created_at,
sc1_0.filename,
sc1_0.modified_at,
sc1_0.ordinal,
sc1_0.template_id
FROM
source_code sc1_0
WHERE
sc1_0.template_id=?
- Number of Calls: 1 time
-
Repository:
TemplateTagJpaRepository
-
Method:
deleteAllByTemplateId
SELECT
tt1_0.tag_id,
tt1_0.template_id,
tt1_0.created_at,
tt1_0.modified_at
FROM
template_tag tt1_0
WHERE
tt1_0.template_id=?
- Number of Calls: 1 time
-
Repository:
TemplateTagJpaRepository
-
Method:
deleteAllByTemplateId
SELECT
t1_0.id,
t1_0.created_at,
t1_0.modified_at,
t1_0.name
FROM
tag t1_0
WHERE
t1_0.id=?
- Number of Calls: 5 times (for each tag)
-
Repository:
ThumbnailJpaRepository
-
Method:
deleteByTemplateId
DELETE
FROM
thumbnail
WHERE
id=?
- Number of Calls: 1 time
-
Repository:
SourceCodeJpaRepository
-
Method:
deleteById
DELETE
FROM
source_code
WHERE
id=?
- Number of Calls: 1 time (for each source code)
-
Repository:
TemplateTagJpaRepository
-
Method:
deleteAllByTemplateId
DELETE
FROM
template_tag
WHERE
tag_id=?
AND template_id=?
- Number of Calls: 5 times (for each tag)
-
Repository:
TemplateJpaRepository
-
Method:
deleteById
DELETE
FROM
template
WHERE
id=?
- Number of Calls: 1 time
Currently, the elements of templates are being deleted by executing deleteByTemplateId
multiple times. This should be changed to a single query that deletes all at once.
The @Modifying
annotation can inform Spring Data JPA that the method will modify data in the database.
- There could be issues with persistence context and data inconsistency.
- Additional settings may be needed to clear the persistence context.
- Using the attribute
**@Modifying(clearAutomatically=true)**
will automatically initialize the persistence context after changes.
- Used for bulk operations.
- Bulk operations process large amounts of data at once during UPDATE or DELETE in the database.
Reference: What is @Modifying?
@Modifying(clearAutomatically = true)
@Query("DELETE FROM Thumbnail t WHERE t.template.id IN :templateIds")
void deleteByTemplateIds(List<Long> templateIds);
-
Repository:
ThumbnailJpaRepository
-
Method:
deleteByTemplateIds
DELETE t1_0
FROM
thumbnail t1_0
WHERE
t1_0.template_id IN (?)
@Modifying(clearAutomatically = true)
@Query("DELETE FROM SourceCode s WHERE s.template.id IN :templateIds")
void deleteByTemplateIds(List<Long> templateIds);
-
Repository:
SourceCodeJpaRepository
-
Method:
deleteByTemplateIds
DELETE sc1_0
FROM
source_code sc1_0
WHERE
sc1_0.template_id IN (?)
@Modifying(clearAutomatically = true)
@Query("DELETE FROM TemplateTag t WHERE t.template.id IN :templateIds")
void deleteAllByTemplateIds(List<Long> templateIds);
-
Repository:
TemplateTagJpaRepository
-
Method:
deleteByTemplateIds
DELETE tt1_0
FROM
template_tag tt1_0
WHERE
tt1_0.template_id IN (?)
- Total queries executed: 7
- Total request count: 1000
- Total elapsed time: 51689 ms
- Average elapsed time: 51 ms
- Retrieve Member Information (by Name)
-
Repository:
MemberJpaRepository
-
Method:
fetchByName
SELECT
m1_0.id,
m1_0.created_at,
m1_0.modified_at,
m1_0.name,
m1_0.password,
m1_0.salt
FROM
member m1_0
WHERE
m1_0.name=?
- Number of Calls: 1 time
-
Repository:
ThumbnailJpaRepository
-
Method:
deleteByTemplateIds
DELETE
FROM
thumbnail
WHERE
template_id IN (?)
- Number of Calls: 1 time
-
Repository:
SourceCodeJpaRepository
-
Method:
deleteByTemplateIds
DELETE
FROM
source_code
WHERE
template_id IN (?)
- Number of Calls: 1 time
-
Repository:
TemplateTagJpaRepository
-
Method:
deleteByTemplateIds
DELETE
FROM
template_tag
WHERE
template_id IN (?)
- Number of Calls: 1 time
-
Repository:
TemplateJpaRepository
-
Method:
deleteById
DELETE
FROM
template
WHERE
id=?
- Number of Calls: 1 time
- Elapsed time improved: 37,414 ms (from 89,103 ms to 51,689 ms)
- Queries reduced: 4 queries (from 11 to 7)
- Average elapsed time improvement: 38 ms
Through optimization, we significantly reduced the total time taken to execute the delete requests, as well as decreased the number of queries executed against the database. This leads to more efficient data handling and improved performance overall.
- 백엔드 코드 컨벤션
- 백엔드 기술 스택 및 선정 이유
- 각종 인스턴스 설정 파일 및 구성 위치 가이드
- 1.1.2 버전 ERD (24.09.27)
- 백엔드 CI CD 동작 프로세스
- 로컬 DB 환경 설정
- 백엔드 로깅 전략
- 백엔드 로그 모니터링 구성도
- 스프링 메트릭 모니터링 구성도
- Flyway 로 스키마 관리
- 코드잽 서버 구성도
- Git Submodule 사용 메뉴얼
- 프론트엔드 코드 컨벤션
- 프론트엔드 기술 스택 및 선정 이유
- 프론트엔드 서비스 타겟 환경 및 브라우저 지원 범위 선정
- 프론트엔드 모니터링 및 디버깅 환경 구축
- 프론트엔드 테스트 목록
- 프론트엔드 라이브러리 기술 검토
- 프론트엔드 개발서버, 운영서버 빌드 및 배포 환경 구분
- 목표했던 타겟 환경과 디바이스에서 서비스 핵심 기능 동작 확인
- 프론트엔드 접근성 개선 보고서
- EC2 로그 확인 방법
- VSCode를 통한 EC2 인스턴스 SSH 연결 방법
- 터미널을 통한 EC2 인스턴스 SSH 연결 방법
- NGINX 설정 파일 접근 및 적용 방법
- DB 접속 및 백업 방법
- [QA] 배포 전 체크리스트
- CI 파이프라인 구축
- CD 파이프라인 구축
- 백엔드 CI CD 트러블슈팅
- Lombok Annotation Processor 의존성을 추가한 이유
- 2차 스프린트 기준 ERD
- DTO 검증하기
- ProblemDetail
- Fork된 레포지토리 PR에서 CI Secrets 접근 문제 해결
- AWS CloudWatch 모니터링
- 스프링 메트릭 모니터링 구축 방법
- 로깅과 Logback에 대해 알아보아요.
- 백엔드 CD 파이프라인 Ver.2
- 요청, 응답 로그에 correlationId 를 추가하자!
- 3차 스프린트 기준 ERD
- 더미데이터 생성하고 실행하기
- 쿼리 성능 개선 결과
- 테이블별 인덱스 설정 목록
- 사용자 증가 시 발생할 수 있는 문제 상황과 개선 방안
- k6를 사용한 서버 부하 테스트
- 6차 스프린트 기준 ERD
- Query Performance Improvement Results
- 테스트 전략 및 CI 설정
- CI CD 구조
- 배포 전, 로컬에서 로그인 기능 포함 테스트해보는 법
- stylelint 적용기
- 내 작업 브랜치 중간에 Merge된 동료의 작업물을 넣고 싶다면 pull vs rebase
- [TS] Webpack config
- [TS] Webpack 환경에서 MSW v2 이슈
- [TS] webpack에서 react‐router‐dom 적용 안됨
- 2024.07.28 새 기획 회의
- 2024.07.26 2차 데모데이 후 회의
- 2024.07.11 백엔드 논의 좀 할게요
- 2024.07.11 백엔드 ERD 회의
- 2024.07.09 깃 브랜치 전략, PR 템플릿 회의
- 2024.07.03 주제 선정 회의
- 2023.07.03 팀빌딩데이 킥오프 회의
- 2023.08.07 3차 스프린트 중간회고