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 중국어 웹사이트의 기타 관련 기사를 참조하세요!