2017-10-14 40 views
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' 

感谢您的帮助。

回答

0

对于此查询:

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; 

我会建议在Mesure_Capteur(horodateur, id_capteur)Capteur(id_capteur, nom_capteur)指标。如果id_capteur已被声明为主键,则后者不需要。

+0

非常感谢,执行时间现在约为15毫秒。 你有什么好的链接,我可以学习如何提高执行时间与索引(为了读它时,我会有时间)。 它会影响插入请求的执行时间吗?我在Mesure_capteur表中插入〜400row/s。 –

+0

@JoelMP。 。 。我真的很喜欢关于这个主题的MySQL文档(https://dev.mysql.com/doc/refman/5.7/en/multiple-column-indexes.html)。尽管数据库中的索引各不相同,但基本相似。 –