【发布时间】:2021-01-06 08:21:48
【问题描述】:
对于 spanner 中的简单查询(按主键更新或选择),我得到大约 50-100 毫秒的延迟。从同一项目/区域连接到扳手。这是预期的行为吗?我预计这些延迟会低得多。
【问题讨论】:
-
能否请您发布一个示例查询?另外,谷歌控制台的查询时间是多少。
对于 spanner 中的简单查询(按主键更新或选择),我得到大约 50-100 毫秒的延迟。从同一项目/区域连接到扳手。这是预期的行为吗?我预计这些延迟会低得多。
【问题讨论】:
不,使用主键进行简单选择的延迟应该比这低很多。
我根据您在上面提供的信息使用以下简单程序进行了快速基准测试:
package main
import (
"context"
"fmt"
"math/rand"
"time"
"cloud.google.com/go/spanner"
"github.com/montanaflynn/stats"
"google.golang.org/api/iterator"
)
func main() {
fmt.Printf("Simple Spanner benchmarking...\n")
source := rand.NewSource(time.Now().UnixNano())
rnd := rand.New(source)
client, err := spanner.NewClient(context.Background(), "projects/my-project/instances/my-instance/databases/my-database")
if err != nil {
fmt.Printf("Client creation failed: %v", err)
return
}
var times stats.Float64Data
for i := 0; i < 25; i++ {
id := rnd.Int63n(1000) + 100000
statement := spanner.NewStatement("SELECT * FROM Singers WHERE SingerId=@id")
statement.Params["id"] = id
start := time.Now()
iter := client.Single().Query(context.Background(), statement)
for {
row, err := iter.Next()
if err == iterator.Done {
break
}
if err != nil {
fmt.Printf("Query failure: %v", err)
break
}
var fullName string
row.ColumnByName("FullName", &fullName)
fmt.Printf("Singer name: %s\n", fullName)
elapsed := time.Since(start)
fmt.Printf("Time: %v\n", elapsed)
times = append(times, float64(elapsed.Milliseconds()))
}
iter.Stop()
}
median, _ := stats.Median(times)
avg, _ := stats.Mean(times)
p90, _ := stats.Percentile(times, 90)
fmt.Printf("Median: %v\n", median)
fmt.Printf("P90: %v\n", p90)
fmt.Printf("Avg: %v\n", avg)
}
应用程序在与 Spanner 实例位于同一区域的尽可能小的 Google Cloud Compute Engine 虚拟机上执行。结果是:
Simple Spanner benchmarking...
Singer name: FirstName LastName 100960
Time: 374.627846ms
Singer name: FirstName LastName 100865
Time: 4.102019ms
Singer name: FirstName LastName 100488
Time: 3.479059ms
...
Singer name: FirstName LastName 100542
Time: 3.986866ms
Singer name: FirstName LastName 100822
Time: 3.978838ms
Singer name: FirstName LastName 100235
Time: 4.511711ms
Singer name: FirstName LastName 100020
Time: 3.476673ms
Singer name: FirstName LastName 100234
Time: 3.191529ms
Singer name: FirstName LastName 100219
Time: 4.451639ms
Median: 3
P90: 4
Avg: 18.44
因此,您大约 50-100 毫秒的执行时间听起来很长。在这个(简单)测试用例中,单行选择的正常执行时间约为 3-4 毫秒(第一个请求除外,因为这也初始化了后备会话池)。
能否请您提供一些关于您是如何执行查询的详细信息(最好提供代码示例)?
【讨论】: