为什么我看到 google 云扳手的响应时间很慢?

Why am I seeing slow response times from google cloud spanner?

我正在为 GAE 上的 Django 应用程序迁移到 google Cloud Spanner,发现响应时间非常长,索引查询大约需要 2-3 秒在扳手查询编辑器中 运行ning 时需要 10 毫秒。

也只有第一个查询耗时这么长,后续任何查询都需要 100 毫秒左右。

我在 运行 使用 python 客户端进行最低限度的查询时遇到了同样的问题,我附上了下面的代码:

from google.cloud import spanner_v1
client = spanner_v1.Client()

i = client.instance("my-instance")
db = i.database("my-database")

start = time.time()
with db.snapshot() as snapshot:
    QUERY = (
        """
            SELECT
              *
            FROM
              dates
            WHERE 
              date_id = 4507
        """)
    result = snapshot.execute_sql(QUERY)

    for row in result:
        print(row)

end = time.time()
print((end-start)*1000)

在这种情况下需要 1154 毫秒。 运行 再次查询(不重新初始化数据库对象)需要 110 毫秒。

我将在对应于 db.snapshot():

的函数中包含来自行分析器 运行 的一些输出
Timer unit: 0.001 s

Total time: 1.05145 s
File: /Users/opt/anaconda3/envs/dev/lib/python3.8/site-packages/google/cloud/spanner_v1/database.py
Function: __enter__ at line 859

Line #      Hits         Time  Per Hit   % Time  Line Contents
==============================================================
   859                                               def __enter__(self):
   860                                                   """Begin ``with`` block."""
   861         1       1051.4   1051.4    100.0          session = self._session = self._database._pool.get()
   862         1          0.0      0.0      0.0          return Snapshot(session, **self._kw)

运行 这个 python==3.8.0 和 google-cloud-spanner==3.11.1 在 Mac.. 任何帮助或想法非常感谢排除故障

我认为您所看到的是以下原因:

  1. 第一个查询会比其他查询慢,因为第一个查询必须等待 Python 客户端使用的会话池被创建,并且至少有一个会话有由 Cloud Spanner 创建并返回。所有后续查询都将重用池中的会话,这就是为什么您在第二个查询中看到的值要低得多。
  2. 第二个查询的总执行时间将取决于您的客户端与 Cloud Spanner 实例之间的物理距离以及网络质量。我假设查询是根据主键选择一行(即 date_id 是 table 的主键中的唯一列)。客户端最好 运行 在 Google App Engine 实例上,该实例与您的 Cloud Spanner 实例位于同一物理区域(例如,两者都可以在区域 us-central1 中,而不是一个在us-east1us-central1 中的一个)。

如果我没理解错的话,你提供的数字是基于你自己的开发机器在本地执行的。我认为您看到的第二个和更多查询的大部分执行时间差异(与 GCP 控制台相比)是由于本地计算机和 Cloud Spanner 之间的网络延迟造成的。

如果您从 GAE 实例或与 Cloud Spanner 数据库位于同一物理区域的简单 Google 计算虚拟机执行测试查询,看看您是否获得更好的数字会很有趣。