如何让UNION ALL更快?

时间:2017-02-15 23:53:51

标签: google-cloud-spanner

我有一个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
...

执行此查询有时需要几秒钟。我有什么办法可以让它更快吗?

1 个答案:

答案 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的相关条目的表。

相关问题