簡體   English   中英

PostgreSQL:性能調優查詢

[英]PostgreSQL: Performance Tuning a Query

我有一個如下表:

表名: Table_A

援助 一個名字
21 XYZ
22 IJK

表名: Table_S1

S_ID S_Name 援助
123 ABC123 21
124 PQR321 22

表名: Table_S2

S_ID S2_Date_1 S2_Date_2
123 2015 年 1 月 1 日 2016 年 2 月 4 日
124 01/01/2021 02/04/2018
123 NULL 2019-02-04
124 01/01/2017 NULL

Table_A 和 Table_S1 有主鍵,而 Table_S2 沒有主鍵。

Table_S1.A_ID --> 被引用 --> Table_A's Primary Key A_ID

Table_S2.S_ID --> 被引用 --> Table_S1 的主鍵 S_ID

Table_S1 表中大約有 400,000 條記錄,Table_S1 中的每條記錄都從 Table_S2 中引用了 120 條記錄。 這意味着 Table_S2 是一個擁有大約 4800 萬條記錄的巨大表。

我需要使用 2 個不同的查詢分別從 Table_S2 的 S2_Date_1 和 S2_Date_2 列中獲取年份,如下所示。

SELECT DISTINCT EXTRACT(YEAR FROM s2.S2_Date_1)
  FROM Table_S2 s2, Table_S1 s1, Table_A a
 WHERE s2.S_ID = s1.S_ID
   AND s1.A_ID = a.A_ID
   AND s1.B_ID = b.B_ID
   AND a.A_Name = 'IJK';

如果我按 A_ID 分組,記錄將如下所示:

援助 Count_of_Table_S1 Count_of_Table_S2
21 100,000 12,000,000
22 150,000 18,000,000
23 90,000 10,800,000

Table_S2 上沒有分區。 從這數百萬條記錄中獲取所有年份大約需要 1 分鍾,我的要求是在一秒鍾內獲取它們。 這可能嗎? 誰能建議一個最好的方法來做到這一點?

提前致謝。

您有很多行要匯總。 將其可靠地降低到一秒可能是不可能的。

您可以嘗試將存儲的生成列放在Table_S2上,然后對其進行索引。

ALTER TABLE Table_S2
 ADD COLUMN S2_Date1_Year 
            GENERATED ALWAYS AS EXTRACT(YEAR FROM s2.S2_Date_1)
            STORED;

這給了你專欄。 然后

ALTER TABLE TABLE_S2 ADD INDEX year_by_sid (S_ID, S2_Date1_Year);

添加索引。 然后將您的查詢更改為

SELECT DISTINCT s2.S2_Date1_Year ...

有可能(但不確定)您的查詢會更快:它不必重新計算每一行的年份。

您可能需要一個物化視圖。

CREATE MATERIALIZED VIEW View_S2_Year AS
SELECT DISTINCT S_ID, EXTRACT(YEAR FROM s2.S2_Date_1) AS S2_Date1_Year
  FROM Table_S2;

CREATE INDEX year_by_sid ON View_S2_Year (S_ID, S2_Date1_Year);

然后加入 View_S2_Year 而不是 Table_S2。

注意:您需要不時刷新視圖以使其恢復與其基表同步。 在對基表進行更改后,其內容將過時,直到您刷新它。

REFRESH MATERIALIZED VIEW View_S2_Year;

暫無
暫無

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

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