我有一个Cloud Spanner查询,它是潜在的许多子查询的UNION ALL
,除了一些随每个子查询而变化的参数外,它们都是相同的:
(SELECT t.FirstName, t.BirthDate FROM Singers AS t WHERE SingerId=2 AND t.LastName="Trentor")
UNION ALL
(SELECT t.FirstName, t.BirthDate FROM Singers AS t WHERE SingerId=3 AND t.LastName="Smith")
UNION ALL
...
执行此查询有时需要几秒钟。我有什么办法可以让它更快吗?
答案 0 :(得分:0)
可能有助于您参数化查询。这也将使您的查询更简洁。 Spanner有一个查询缓存,用于存储最近查询的形状,以便在看到具有相似形状的另一个查询时,它可以使用相同的执行计划。 UNION 20个子查询的形状与UNION ALL的21个子查询的形状不同,因此这可能会阻碍缓存。传递一组结构(即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的相关条目的表。