簡體   English   中英

PostgreSQL查詢時間

[英]PostgreSQL Query Time

SELECT * 
FROM vehicles t1 
WHERE (SELECT COUNT(*) FROM vehicles t2
       WHERE  t1.pump_number = t2.pump_number
          AND t1.updated_at < t2.updated_at
      ) < 4
      AND t1.updated_at >= ?

我為參數提供'1970-01-01 00:00:00.000000' ?

我的vehicles表中有大約1萬條記錄,沒有添加索引。 上面的查詢執行大約需要10-20秒。

如何優化它以減少執行時間?

Postgres提供了不錯的管理工具,該工具具有選項EXPLAIN來查看查詢執行計划。 它將提供深刻的見解。 這是pgadmin的詳細鏈接http://www.pgadmin.org/docs/1.4/query.html

還可以在查詢中使用聯接,而不是選擇聯接,這將提高查詢性能

試試這個(select和group by語句中的列需要用您自己的替換):

SELECT
    t1.id,
    t1.updated_at,
    t1.other_columns
FROM vehicles t1 
INNER JOIN vehicles t2
ON  t1.pump_number = t2.pump_number
    AND t1.updated_at < t2.updated_at
WHERE t1.updated_at >= '1970-01-01 00:00:00.000000'
GROUP BY 
    t1.id,
    t1.updated_at,
    t1.other_columns
having count(*)< 4

進行此更改后,您可以嘗試在Pump_number列上添加索引以查看是否有幫助。

這是您的查詢:

SELECT *
FROM vehicles t1
WHERE  (SELECT Count(*)
        FROM vehicles t2
        WHERE t1.pump_number = t2.pump_number AND
              t1.updated_at < t2.updated_at
       ) < 4  AND
       t1.updated_at >= ? " , "1970-01-01 00:00:00.000000")]

我將從使用窗口函數編寫此代碼開始:

select v.*
from (select v.*, row_number() over (partition by pump_number order by updated_at) as seqnum
      from vehicles v
     ) v
where v.seqnum < 4 and t1.updated_at >= ?;

對於此查詢,我建議在vehicles(pump_number, updted_at)vehicles(pump_number, updted_at) vehicles(updated_at)上建立索引。

要獲取等效查詢,請在此處使用窗口函數rank() ,而不是 row_number()

SELECT *
FROM  (
   SELECT *
        , rank() OVER (PARTITION BY pump_number ORDER BY updated_at DESC) AS rnk
   FROM   vehicles t1 
   ) sub
WHERE rnk < 4
AND   updated_at >= '1970-01-01 0:0';

並且必須為ORDER BY updated_at DESC ,以排除對於相同的pump_number具有三個以上較舊pump_number 換一種說法:
“獲取每三個最古老的行pump_number -或更多,如果有關於關系updated_at ”。

無論如何,在您讀取大部分或全部表時,索引都無濟於事。

進一步優化性能

如果(pump_number, updated_at)是唯一的或/並且vehicles pump_number不同值相對較少,則可能可以進一步優化。 您的問題中沒有足夠的信息。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM