簡體   English   中英

"提高 PostgreSQL 查詢性能"

[英]Improve PostgreSQL query performance

在我的服務器上運行此查詢時,速度很慢,我不明白為什么。 誰能幫我弄清楚?
詢問:

SELECT
    "t_dat"."t_year" AS "c0",
    "t_dat"."t_month" AS "c1",
    "t_dat"."t_week" AS "c2",
    "t_dat"."t_day" AS "c3",
    "t_purs"."p_id" AS "c4",
    sum("t_purs"."days") AS "m0",
    sum("t_purs"."timecreated") AS "m1"
FROM "t_dat", "t_purs"
WHERE "t_purs"."created" = "t_dat"."t_key"
  AND "t_dat"."t_year" = 2013
  AND "t_dat"."t_month" = 3
  AND "t_dat"."t_week" = 9
  AND "t_dat"."t_day" IN (1,2)
  AND "t_purs"."p_id" IN (
      '4','15','18','19','20','29',
      '31','35','46','56','72','78')
GROUP BY
    "t_dat"."t_year",
    "t_dat"."t_month",
    "t_dat"."t_week",
    "t_dat"."t_day",
    "t_purs"."p_id"

很難說你到底錯過了什么,但如果我是你,我會確保跟蹤索引存在:

CREATE INDEX t_dat_id_date_idx
    ON t_dat (t_key, t_year, t_month, t_week, t_day);

對於t_purs ,創建此索引:

CREATE INDEX t_purs_created_p_id_idx
    ON t_purs (created, p_id);

考慮在表中使用單個列

t_date date

而不是(t_year, t_month, t_week, t_day) 數據類型date占用4個字節。 這會縮小你的表,使索引更小更快,分組更容易。

可以使用extract()從日期中輕松快速地提取 您的查詢可能看起來像這樣,會更快:

SELECT extract (year  FROM t_date) AS c0
      ,extract (month FROM t_date) AS c1
      ,extract (week  FROM t_date) AS c2
      ,extract (day   FROM t_date) AS c3
      ,p.p_id                      AS c4
      ,sum(p.days)                 AS m0
      ,sum(p.timecreated)          AS m1
FROM   t_dat  d
JOIN   t_purs p ON p.created = d.t_key
WHERE  d.t_date IN ('2013-03-01'::date, '2013-03-02'::date)
AND    p.p_id IN (4,15,18,19,20,29,31,35,46,56,72,78)
GROUP  BY d.t_date, p.p_id;

對性能更重要的是索引,它只是:

CREATE INDEX t_dat_date_idx ON t_dat (t_key, t_date);

或者,根據數據分布:

CREATE INDEX t_dat_date_idx ON t_dat (t_date, t_key);

列的順序很重要。 你甚至可以創造兩者。

在此處輸入圖像描述<\/a>

您的查詢正在進行順序掃描 t_purs 和 t_dat。 創建適當的索引將幫助您加快查詢速度並避免順序掃描。

運行上述兩個查詢后運行解釋分析。 您會看到計划時間和執行時間減少。

暫無
暫無

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

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