>  기사  >  백엔드 개발  >  내 Go 데이터베이스/sql 쿼리가 Direct Postgres psql 쿼리보다 현저히 느린 이유는 무엇입니까?

내 Go 데이터베이스/sql 쿼리가 Direct Postgres psql 쿼리보다 현저히 느린 이유는 무엇입니까?

Linda Hamilton
Linda Hamilton원래의
2024-11-22 09:44:11822검색

Why is my Go database/sql Query Significantly Slower Than a Direct Postgres psql Query?

database/sql을 사용하여 쿼리하는 것이 데이터베이스를 직접 쿼리하는 것보다 훨씬 느립니다.

동일한 쿼리를 사용하더라도 실행 간에 눈에 띄는 성능 차이가 있습니다. Postgres의 psql 유틸리티를 사용하고 Go 애플리케이션에서 데이터베이스/sql 패키지를 사용하여 직접 쿼리합니다. psql에서는 밀리초가 걸리는 쿼리가 Go에서는 수십 밀리초가 걸리는 이러한 불일치는 구현의 특정 요인에 기인할 수 있습니다.

데이터베이스/sql 연결 이해

Database/sql은 단일 연결을 생성하는 대신 데이터베이스에 대한 연결을 설정하기 위해 연결 풀을 초기화합니다. 데이터베이스/sql에서 쿼리 실행의 초기 지연은 풀이 열려 있는 연결이 없는 상태에서 시작되기 때문입니다. 첫 번째 쿼리는 SQL 문을 실행하기 전에 서버에 대한 연결을 설정해야 합니다.

첫 번째 쿼리의 연결이 풀로 다시 해제되지 않았기 때문에 후속 쿼리도 지연이 발생합니다. 즉, 각 후속 쿼리는 쿼리를 실행하기 전에 새 연결을 생성해야 합니다.

풀로 다시 연결 해제

성능 불일치를 해결하려면 연결이 각 쿼리 후에 풀로 다시 해제됩니다. 연결을 해제하려면 db.Query의 기본 반환 값을 유지한 후 해당 값에 대해 Close 메서드를 호출해야 합니다.

열린 연결로 풀 초기화

초기 지연, 초기화 직후 연결 풀에서 Ping을 호출합니다. 이렇게 하면 풀에 하나 이상의 연결이 사용 가능하게 됩니다.

준비된 명령문

인수 없는 단순 쿼리는 예상대로 실행되지만 데이터베이스/sql에서는 인수가 있는 쿼리가 실행됩니다. 실제로 내부적으로 준비된 명령문을 만들고 실행합니다. 준비된 문은 서로 다른 인수를 사용하여 동일한 쿼리를 여러 번 실행할 때 성능상의 이점을 제공합니다.

추가 지연 문제 해결

연결 관리 및 준비된 문 외에도 추가 지연 요인이 있을 수 있습니다. 고려해야 할 사항:

  • 네트워크 지연 시간: 데이터 전송으로 인한 지연 애플리케이션과 데이터베이스 간의 네트워크를 통해.
  • 서버 부하: 데이터베이스 서버의 작업 부하가 쿼리 실행 시간에 영향을 줄 수 있습니다.

이러한 요소를 해결하고 구현함으로써 제공된 권장 사항에 따라 데이터베이스/SQL을 사용한 쿼리 성능이 크게 향상되어 데이터베이스를 직접 쿼리하는 것과 비슷할 수 있습니다.

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

성명:
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.