它可能有助于您参数化您的查询。这也将使您的查询更加简洁。Spanner 有一个查询缓存,用于存储最近查询的形状,以便在看到另一个类似形状的查询时可以使用相同的执行计划。包含 20 个子查询的 UNION ALL 与包含 21 个子查询的 UNION ALL 具有不同的形状,因此这可能会阻碍缓存。传入一个结构数组(即 n 元组)作为查询参数有点棘手,但这里有一个可行的方法:
# bind seq1 to [2,3] in your query parameters
# bind seq2 to ["Trentor","Smith"] in your query parameters
SELECT Singers.FirstName,Singers.BirthDate FROM
(SELECT *
FROM
(SELECT id, x_1 FROM UNNEST(@seq1) AS id WITH OFFSET AS x_1)
JOIN
(SELECT name, x_2 FROM UNNEST(@seq2) AS name WITH OFFSET AS x_2)
ON x_1 = x_2) AS params
JOIN Singers
ON params.id=Singers.SingerId AND params.name=Singers.LastName
产生的内部查询是将params
seq1 和 seq2 压缩在一起,生成一个包含来自 seq1 和 seq2 的相关条目的表。