2013-10-09 24 views
1

謝謝論壇...請幫助我.. 我有包含TagName的表和其他表包含taglog .im將標記名傳遞給名爲GetAvg的過程,它將返回avg所有tags.it運作良好,但它需要大約35秒顯示100個標記values.how減少時間。請幫助我在數據庫中新的。如何在mysql的過程中減少處理數據的時間

DELIMITER $$ 
CREATE DEFINER=`root`@`localhost` PROCEDURE `GetAvg`(IN FromTime datetime, IN ToTime datetime) 
BEGIN 
DECLARE no_more_alarms INT DEFAULT 0; 
DECLARE TempTagName VARCHAR(45); 
DECLARE val FLOAT; 
DECLARE cur_tag CURSOR FOR 
     select Tag_AVG from Report 
     where(Tag_AVG IS NOT NULL); 
     DECLARE CONTINUE HANDLER FOR NOT FOUND 
     SET no_more_alarms = 1; 


DROP TABLE IF EXISTS `tempAVG`; 

CREATE TABLE tempAVG (
val FLOAT 
); 


OPEN cur_tag; 

FETCH cur_tag INTO TempTagName; 
REPEAT 

SELECT AVG(value) INTO val 
FROM jas_taglog 
WHERE ((TagId = (select TagId from jas_tags where jas_tags.Name = TempTagName)) AND jas_taglog.LogTime between FromTime and ToTime) ; 

INSERT INTO tempAvg(Val) 
VALUES (val); 

FETCH cur_tag INTO TempTagName; 
UNTIL no_more_alarms = 1 
END REPEAT; 
CLOSE cur_tag; 
SELECT * FROM tempAVG; 

END 

回答

0

您手動實現,可以在一個單一的查詢被寫入循環:

... 
BEGIN 
    INSERT INTO tempAvg 
    SELECT AVG(jas_taglog.value) 
    FROM jas_taglog 
    JOIN jas_tags USING (TagId) 
    JOIN Report ON jas_tags.Name = Tag_AVG 
    WHERE jas_taglog.LogTime BETWEEN FromTime AND ToTime 
    GROUP BY Tag_AVG; 
END 
相關問題