1
我正在嘗試改進執行時間,這需要3秒才能完成。 Mesure_capteur表具有〜2百萬行和Capteur 400.我爲Capteur.nom_capteur和Mesure_Capteur.id_capteur添加了索引。這樣做需要10秒鐘,但我知道該怎麼做。改善postgre sql選擇請求的執行時間
SELECT C.nom_capteur, mC.horodateur, mC.valeur_mesure_capteur
FROM Mesure_Capteur mC INNER JOIN Capteur C
ON mC.id_capteur = C.id_capteur
WHERE C.nom_capteur = 'ENEEANABatterie005'
AND mC.horodateur between '2017-10-15 00:00:00' and '2017-10-15 01:00:00'
ORDER BY mC.horodateur DESC
這裏是我的兩個表:
create table Capteur(
id_capteur int primary key,
nom_capteur varchar(180),
description_capteur varchar(100),
id_sous_systeme int,
description_unite varchar(50),
unite varchar(10),
seuil_min real,
seuil_max real,
FOREIGN KEY (id_sous_systeme) REFERENCES Sous_systeme(id_sous_systeme)
);
-
create table Mesure_capteur(
id_mesure_capteur serial PRIMARY KEY,
valeur_mesure_capteur NUMERIC(20,2),
id_capteur int,
FOREIGN KEY (id_capteur) REFERENCES Capteur(id_capteur),
horodateur abstime
);
這裏的解釋分析:
'Sort (cost=352931.30..352931.30 rows=1 width=25) (actual time=3147.592..3147.625 rows=494 loops=1)'
' Sort Key: mc.horodateur DESC'
' Sort Method: quicksort Memory: 51kB'
' -> Nested Loop (cost=3361.03..352931.29 rows=1 width=25) (actual time=1485.653..3147.419 rows=494 loops=1)'
' -> Index Scan using capteur_nom_capteur_index on capteur c (cost=0.27..8.29 rows=1 width=22) (actual time=0.045..0.047 rows=1 loops=1)'
' Index Cond: ((nom_capteur)::text = 'ENEEANABatterie005'::text)'
' -> Bitmap Heap Scan on mesure_capteur mc (cost=3360.76..352922.99 rows=1 width=11) (actual time=1485.598..3147.304 rows=494 loops=1)'
' Recheck Cond: (id_capteur = c.id_capteur)'
' Rows Removed by Index Recheck: 17942069'
' Filter: ((horodateur >= '2017-10-15 00:00:00+02'::abstime) AND (horodateur <= '2017-10-15 01:00:00+02'::abstime))'
' Rows Removed by Filter: 181360'
' Heap Blocks: exact=45030 lossy=99772'
' -> Bitmap Index Scan on mesure_capteur_id_capteur_index (cost=0.00..3360.76 rows=181359 width=0) (actual time=63.333..63.333 rows=181854 loops=1)'
' Index Cond: (id_capteur = c.id_capteur)'
'Planning time: 0.367 ms'
'Execution time: 3148.039 ms'
感謝您的幫助。
非常感謝,執行時間現在約爲15毫秒。 你有什麼好的鏈接,我可以學習如何提高執行時間與索引(爲了讀它時,我會有時間)。 它會影響插入請求的執行時間嗎?我在Mesure_capteur表中插入〜400row/s。 –
@JoelMP。 。 。我真的很喜歡關於這個主題的MySQL文檔(https://dev.mysql.com/doc/refman/5.7/en/multiple-column-indexes.html)。儘管數據庫中的索引各不相同,但基本相似。 –