[英]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.