谢谢论坛......请帮帮我.. 我有一个包含TagName的表,其他表包含taglog .im将标记名传递给名为GetAvg的过程,该过程将返回所有tags的avg。它运行良好,但显示100个标记值需要大约35秒。以减少时间。帮我新数据库。
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 :(得分: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