인프런 커뮤니티 질문&답변

gin님의 프로필 이미지
gin

작성한 질문수

Real MySQL 시즌 1 - Part 1

Ep.11 Prepared Statement

PreparedStatment 사용 시 메모리 사용 증가

해결된 질문

작성

·

217

·

수정됨

0

안녕하세요. 좋은 강의 감사 드립니다.PrepareStatement 사용 시 메모리 사용률이 증가하는 단점에 대해 다루어주셨는데, 혹시 이 부분을 실제로 확인할 수 있는 메트릭이있다면 공유 부탁 드립니다. 실제로 이 이슈를 재현해보고 싶습니다.

답변 1

0

이성욱님의 프로필 이미지
이성욱
지식공유자

안녕하세요.

 

먼저 말씀드리고 싶은 내용은, 아래 질문 내용에서 "이슈"라는 표현이, PreparedStatement의 메모리 사용이 버그처럼 느껴지는 듯 한 느낌이 있는데요.

실제로 이 이슈를 재현해보고 싶습니다.

Prepared Statement가 메모리를 추가로 사용하는 것은 버그는 아니고, 정상적인 작동 방식입니다. 단지 PreparedStatement를 사용하면 메모리가 더 필요해진다는 것이 이번 강의의 주요 내용입니다.

 

질문하신 메모리 사용량을 확인하시는 방법은,

아마도 MySQL 서버의 performance_schema가 활성화되어 있다면, 아래 쿼리로 PreparedStatement가 사용하는 메모리 공간의 크기를 확인하실 수 있을 듯 합니다.

 

SELECT event_name,
  SUM(CURRENT_NUMBER_OF_BYTES_USED) AS memory_used_for_pstmt_as_bytes
FROM performance_schema.memory_summary_global_by_event_name
WHERE event_name LIKE '%prepare%'
GROUP BY event_name
ORDER BY memory_used_for_pstmt_as_bytes DESC;

+---------------------------------------------------------+-----------+
| event_name                                              | total_mem |
+---------------------------------------------------------+-----------+
| memory/performance_schema/prepared_statements_instances |   2031616 |
| memory/sql/Prepared_statement::main_mem_root            |     61728 |
| memory/sql/Prepared_statement::infrastructure           |      3072 |
+---------------------------------------------------------+-----------+

 

여기에서 memory/sql/Prepared_statement::* 이 PreparedStatement 객체가 사용하는 메모리의 크기로 볼 수 있으며, memory/performance_schema/prepared_statements_instances 는 Performance_schema에서 PreparedStatements를 추적할 수 있는 기능이 있는데, 그 테이블이 사용하는 메모리 공간이라 보시면 됩니다.

 

또한 일반적인 상황에서 PreparedStatement가 사용하는 메모리양이 MySQL 서버를 사용하지 못할 정도의 공간 낭비를 초래하는 것은 아니며, SQL 문장 패턴이 많고 Connection이 많은 서버에서는 매우 많은 PreparedStatement가 필요해지고, 이런 경우 메모리 사용량이 높아지는 경우가 발생할 수 있으며, PreparedStatement가 사용하는 메모리 량을 고려해서 다른 메모리 설정을 적용해야 한다 정도로 이해해주시면 좋을 것 같습니다.

 

감사합니다.

gin님의 프로필 이미지
gin
질문자

답변 감사드립니다!

 

혹시 추가로 말씀해주신

PreparedStatement가 사용하는 메모리 량을 고려해서 다른 메모리 설정을 적용해야 한다

 

이건 어떤 설정을 지칭하시는 것인지도 알 수 있을까요?

감사합니다

 

이성욱님의 프로필 이미지
이성욱
지식공유자

이건 어떤 설정을 지칭하시는 것인지도 알 수 있을까요?

어떤 특정 설정을 말씀드린 것이 아니라, MySQL 서버에서 메모리 크기를 지정하는 옵션들 모두를 의미한 것입니다.

이성욱님의 프로필 이미지
이성욱
지식공유자

MySQL 서버의 메모리 사용량 제어에 대한 자세한 설명은 Real MySQL 8.0 1권 84페이지의 “4.1.3 메모리 할당 및 사용구조”를 참고하시면 될듯 해요.

 

감사합니다.

gin님의 프로필 이미지
gin

작성한 질문수

질문하기