2014-09-13 99 views
0

此查詢在< 10k條記錄上花費很多分鐘,這對我來說有點令人驚訝。有沒有一種更有效的方法來運行一個基於列的愚蠢行爲的查詢?有沒有辦法加快這個重複檢測查詢?

UPDATE exportable_businesses e1 SET phone_dupe = 
(CASE WHEN 
    (SELECT COUNT(sidewalk_business_id) FROM exportable_businesses e2 WHERE query_id = #{id} AND e1.phone_number=e2.phone_number) > 1 
     THEN 'x' ELSE NULL END) 

回答

1

先試計數的電話號碼,例如:

create temporary table phone_cnt as 
    select phone_number, count(*) as c from exportable_businesses 
    where query_id = #{id} 
    group by phone_number 

然後用預先計算的值來設置phone_dupe變量。 Postgres的應該是能與加盟做一個更新的,例如:

update exportable_businesses e1 
    set phone_dupe = (case when pc.c ...) 
    from phone_cnt pc 
    where pc.phone_number = e1.phone_number 

如果這仍然緩慢,您需要做更新查詢之前phone_cnt (phone_number)創建一個明確的指標。這樣,整個計算將花費線性時間,而不是二次方法,就像在計數子查詢的例子中那樣。

您可以在查詢後刪除臨時phone_cnt表。

+0

這是數量級更快的順序。沒有考慮臨時表方法。謝謝 – Tony 2014-09-13 02:31:06

+0

也許你可以使用物化視圖,而不是臨時表。 – Aret 2014-09-13 05:14:09