mySQL创建多个临时表

时间:2016-11-25 12:08:43

标签: mysql multithreading temp-tables

我在mySQL中有一个存储过程,它从表中获取一部分数据,并对临时表中的该子集执行一些分析。这是我的代码:

CREATE PROCEDURE GetPortfolioStats
(
    InIdx_i     INT,
    InStart_i   INT,
    InEnd_i     INT
)
BEGIN

DECLARE myLimit     INT;
DECLARE myOffset    INT;

SET myLimit = InEnd_i - InStart_i + 1;
SET myOffset = InStart_i - 1;

CREATE TEMPORARY TABLE IF NOT EXISTS myTmpTable AS (SELECT * FROM Leases WHERE Portfolio_i = InIdx_i ORDER BY Index_i LIMIT myLimit OFFSET myOffset);

SET @Additive_i := (SELECT COUNT(Index_i) FROM myTmpTable WHERE ReviewType_vc = 'Additive');
DROP TABLE myTmpTable;

SELECT @Additive_i;

END; GO

这很好用。但是,我遇到的问题是这是一个多线程应用程序,当多个线程调用此存储过程时,它们开始共享相同的临时表,这会混淆我正在尝试编译的统计信息。

有没有办法在存储过程的每次调用中应用唯一的表名,或者将临时表的范围限制为只存储过程的那个实例?

1 个答案:

答案 0 :(得分:0)

回答具体问题:最简单的解决方案是每个线程使用不同的数据库连接,因为临时表是session (connection) specific

  

创建表时可以使用TEMPORARY关键字。 TEMPORARY表仅对当前会话可见,并在会话关闭时自动删除。这意味着两个不同的会话可以使用相同的临时表名,而不会相互冲突或与现有的同名非TEMPORARY表冲突。

但是,在检查实际代码后,我建议不要使用临时表,使用带有子查询的单个查询:

SELECT COUNT(Index_i)
FROM
    (SELECT Index_i, ReviewType_vc
     FROM Leases
     WHERE Portfolio_i = InIdx_i
     ORDER BY Index_i
     LIMIT myLimit OFFSET myOffset) t
WHERE ReviewType_vc = 'Additive'