2017-02-15 59 views
0

我有云扳手查詢是潛在的許多子查詢,這是除了與每個子查詢變化幾個參數全部相同的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所有20個子查詢的形狀都不同於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的相關條目的表。

+1

你剛剛回答你自己的問題嗎? – RSon1234