我需要在一个程序中创建一个临时表
现在我的步骤是:
1. DROP TEMPORARY TABLE如果EXISTS
2.创建临时表
3.对表做些什么
4. DROP TEMPORARY TABLE if EXISTS
每次调用程序时,我都不想创建临时表 我只想截断临时表,但是如何在现有临时表中选择一些数据?
如何让打击程序更快地运行?
DROP PROCEDURE IF EXISTS `test`;
DELIMITER ;;
CREATE PROCEDURE `test`(IN type INT)
begin
DECLARE done INT DEFAULT 0;
DECLARE total INT DEFAULT 0;
DECLARE min_1 INT DEFAULT 0;
DECLARE min_10 INT DEFAULT 0;
DECLARE min_30 INT DEFAULT 0;
DECLARE tmp INT DEFAULT 0;
DECLARE cursor1 CURSOR FOR SELECT TIMESTAMPDIFF(MINUTE,time1,time2) as dif FROM t_test ;
DECLARE CONTINUE HANDLER FOR NOT FOUND SET done = 1;
DROP TEMPORARY TABLE if EXISTS t_test;
CREATE TEMPORARY TABLE t_test AS (
SELECT optime as time1,dtime as time2
FROM tbmytest
WHERE thetpye = type);
OPEN cursor1;
REPEAT
FETCH cursor1 INTO tmp;
IF done = 1 THEN
close cursor1;
ELSE
SET total = total + 1;
IF tmp > 30 THEN
SET min_30 = min_30 + 1;
ELSEIF tmp > 10 THEN
SET min_10 = min_10 + 1;
ELSEIF tmp > -1 THEN
SET min_1 = min_1 + 1;
END IF;
END IF;
UNTIL done END REPEAT;
DROP TEMPORARY TABLE if EXISTS t_test;
SELECT min_1,min_10,min_30,total;
end;;
DELIMITER ;
答案 0 :(得分:0)
游标非常非常慢。临时表可能没有必要。
您可以实现与单个查询中的过程相同的操作。为此使用变量。以下查询应该完成这项工作。
MEMORY
我不知道您的问题是否已简化,这意味着您还需要将临时表用于其他目的。如果是这样,您可以使用带有CREATE TABLE my_special_temp_table
(min30 int, min10 int, min1 int)
ENGINE=MEMORY;
UPDATE my_special_temp_table
JOIN (
SELECT @min30 AS min30, @min10 AS min10, @min1 AS min1 FROM (
SELECT @diff := TIMESTAMPDIFF(MINUTE,time1,time2),
CASE WHEN @diff > 30 THEN @min30 := @min30 + 1
WHEN @diff > 10 THEN @min10 := @min10 + 1
WHEN @diff > -1 THEN @min1 := @min1 + 1
END
FROM t_test
CROSS JOIN (SELECT @diff := NULL, @min1 := 0, @min10 := 0, @min30 := 0) var_init_subquery
) another_subquery_alias
) t
SET my_special_temp_table.min30 = t.min30,
my_special_temp_table.min10 = t.min10,
my_special_temp_table.min1 = t.min1;
引擎的表格,而不是删除并创建表格,并在需要时偶尔更新一次。
forwardRef