> 백엔드 개발 > Golang > Go의 데이터베이스/sql이 Postgres에 직접 쿼리하는 것보다 느린 이유는 무엇입니까?

Go의 데이터베이스/sql이 Postgres에 직접 쿼리하는 것보다 느린 이유는 무엇입니까?

Linda Hamilton
풀어 주다: 2024-11-21 11:09:12
원래의
661명이 탐색했습니다.

Why is database/sql in Go Slower than Directly Querying Postgres?

Postgres에 직접 쿼리하는 것보다 데이터베이스/sql을 사용하여 쿼리하는 것이 느림

Go 애플리케이션을 사용하여 로컬 Postgres 인스턴스를 쿼리하는 경우 다음이 발생할 수 있습니다. 데이터베이스/sql을 사용하는 것과 데이터베이스를 직접 쿼리하는 것 사이에는 눈에 띄는 성능 차이가 있습니다. 이 질문은 이러한 불일치의 잠재적 원인을 탐구합니다.

배경 정보

database/sql 패키지는 SQL 데이터베이스와 상호 작용하기 위한 인터페이스를 제공합니다. 데이터베이스에 대한 연결 풀을 관리하며 각 연결을 사용하여 여러 쿼리를 실행할 수 있습니다. 그러나 데이터베이스/sql을 사용할 때는 연결 처리를 이해하는 것이 중요합니다.

  • 연결 풀: sql.DB는 단일 연결이 아닌 연결 풀을 나타냅니다. 풀은 최대 연결 수, 최대 연결 수명 등의 옵션으로 구성할 수 있습니다.
  • Lazy Connection Open: sql.Open을 사용하여 연결을 열면 실제 연결이 설립이 즉시 이루어지지 않을 수도 있습니다. 풀은 필요에 따라 느리게 연결을 엽니다.

성능 차이 설명

성능 차이의 주요 원인은 다음과 같습니다.

1. 새 연결 설정:

  • 첫 번째 db.Query는 데이터베이스에 대한 새 연결을 설정하기 때문에 상대적으로 느립니다.
  • 두 번째 db.Query는 다음과 같은 이유로 약간 느립니다. 풀은 처음 연결을 재사용하는 대신 새 연결을 엽니다. 쿼리.

해결책:

새 연결 설정으로 인한 성능 저하를 제거하려면 다음을 수행하는 것이 좋습니다.

  • 풀로 다시 연결 해제: 각 쿼리를 완료한 후 반환된 행 개체를 닫습니다. DB.쿼리. 이렇게 하면 연결된 연결이 다시 풀로 해제됩니다.
  • 풀 사전 초기화: 풀을 연 후 db.Ping을 호출하여 쿼리를 실행하기 전에 적어도 하나의 연결을 강제로 설정합니다. . 이렇게 하면 첫 번째 쿼리에 사용 가능한 연결이 보장됩니다.

이러한 최적화를 통해 데이터베이스/SQL 쿼리의 성능을 크게 향상할 수 있습니다.

참고 사항 준비된 문:

쿼리에 인수가 포함된 경우 데이터베이스/sql이 실제로 준비된 문을 생성하고 실행한다는 점에 유의하는 것이 중요합니다. 후드 아래. 준비된 문은 효율성 이점을 제공하지만 특히 인수가 없는 간단한 쿼리의 경우 약간의 오버헤드가 발생합니다.

데이터베이스/SQL의 연결 관리 및 준비된 문 동작을 이해하면 쿼리 성능을 최적화하고 상당한 속도 저하가 발생했습니다.

위 내용은 Go의 데이터베이스/sql이 Postgres에 직접 쿼리하는 것보다 느린 이유는 무엇입니까?의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

원천:php.cn
본 웹사이트의 성명
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.
저자별 최신 기사
인기 튜토리얼
더>
최신 다운로드
더>
웹 효과
웹사이트 소스 코드
웹사이트 자료
프론트엔드 템플릿