2017-02-15 2 views
0

У меня есть запрос Облако Spanner, который является UNION ALL потенциально многих подзапросов, которые идентичны для нескольких параметров, которые изменяются с каждым подзапроса исключением:Как я могу сделать 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

Это может помочь вам параметризовать ваш запрос. Это также сделает ваш запрос более кратким. В Spanner есть кеш запросов, в котором хранятся формы последних запросов, чтобы он мог использовать один и тот же план выполнения, если он видит другой запрос подобной формы. UNION ALL из 20 подзапросов имеет другую форму, чем UNION ALL из 21 подзапросов, поэтому это может помешать кешу. Это немного сложно передать в массив структур (т.е. п-кортежей) в качестве параметров запроса, но вот подход, который работает:

# 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.

+1

Вы только что ответили на свой вопрос? – RSon1234

Смежные вопросы