테이블에서 약 10,000행을 쿼리하려고 합니다. 시도해 본 후 limit
offset
的各种其他选项并且没有找到所需的成功之后,我尝试在每个 goroutine 中查询单行。思路是每行只需要 ~5ms
来查询和获取,但是一批 10k 会接管 20s
.
아래는 코드의 단순화된 버전입니다.
으아악결과는 다음과 같이 추적됩니다:
으아악예상대로 잘 시작되지만 쿼리 시간이 계속 늘어납니다.
MaxSessions
和 MinSessions
对于 spannerClient
是 100
따라서 100 이후에는 약간의 둔화를 볼 수 있다고 상상할 수 있지만 그렇지 않습니다.
여기를 읽어주세요:
으아악비반복 쿼리(ReadRow
etc)는 동일한 결과를 제공합니다.
for 루프 외부에서 tx := spannerClient.Single()
를 사용하면 비슷한 결과를 얻을 수 있습니다.
질문:
spannerClient.Single()
실행에도 불구하고 고루틴이 여전히 동일한 세션/트랜잭션을 사용하려고 한다는 것을 의미합니까? TLDR: 기본 최대 세션 풀 크기는 400입니다. 즉, 400개가 넘는 쿼리를 병렬로 실행할 수 없다는 뜻입니다. 이 동시성을 달성하려면 세션 풀 크기를 늘려야 합니다.
우선, 각 쿼리가 한 행을 읽도록 10,000개의 쿼리를 병렬로 보내는 것이 문제에 대한 가장 효율적인 해결책이 아니라고 생각합니다. 직원 ID 외에 필터링하는 데 사용할 수 있는 다른 기준이 없고 해당 ID가 여기저기 흩어져 있는 경우 양식에서 쿼리를 만드는 것이 더 효율적입니다
으아악전체 예를 보려면 다음 댓글을 참조하세요. https:///github.com/googleapis/google-cloud-go/issues/858#issuecomment-550982307
특정 질문으로 돌아가기:
it := tx.Query(gCtx, stmt2)
줄은 쿼리를 실행하지 it := tx.Query(gCtx, stmt2)
行确实不执行查询,它只是准备执行查询。第一次调用 row, err := it.Next()
않지만 row, err := it.Next()
가 처음 호출될 때 실행됩니다. 기록된 실행 시간에서도 이를 확인할 수 있습니다. 첫 번째 문은 30마이크로초 내에 실행되는 것으로 보이지만 이는 불가능합니다. 위 내용은 golang goroutine에서 ReadOnlyTransaction을 사용하는 Spanner 쿼리가 점차 느려지는 이유는 무엇인가요?의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!