0

如何缓存来自存储过程的动态查询?现在我已经创建了这样的存储过程:

CREATE PROCEDURE usp_MyProcedure (
  IN UserID INT,
  .... 
)
BEGIN

   SET @sqlQuery = CONCAT("SELECT Name From Users WHERE UserID > ", UserID, " AND UserID  IN ( SELECT UserID FROM OtherTable WHERE UserID = ", UserID, " ) Order by Name") 

   PREPARE stmt FROM @sqlQuery;
   EXECUTE stmt;
   DEALLOCATE PREPARE stmt;

END;

但是这种查询不会被缓存。因此,每次有更多时间执行/处理查询。

现在我尝试了其他一些方法,例如:

CREATE PROCEDURE usp_MyProcedure (
  IN UserID INT,
  .... 
)
BEGIN
   SET @UserID = UserID;

   SET @sqlQuery = "SELECT Name From Users WHERE UserID > ? AND UserID  IN ( SELECT UserID FROM OtherTable WHERE UserID = ? ) Order by Name";

   PREPARE stmt FROM @sqlQuery;
   EXECUTE stmt @UserID, @UserID; -- here i passed same variable twice.
   DEALLOCATE PREPARE stmt;
END;

在上述情况下,我必须传递相同的变量 (@UserID) 两次,因为它在我的查询中使用了 2 次。但是这项工作在长时间或复杂的查询中非常忙碌。那么,我该如何避免呢?

我尝试的另一种方法如下:

CREATE PROCEDURE usp_MyProcedure (
  IN UserID INT,
  .... 
)
BEGIN
   SET @UserID = UserID;

   SET @sqlQuery = "SELECT Name From Users WHERE UserID > @UserID AND UserID  IN ( SELECT UserID FROM OtherTable WHERE UserID = @UserID ) Order by Name";

   PREPARE stmt FROM @sqlQuery;
   EXECUTE stmt;
   DEALLOCATE PREPARE stmt;
END;

但是上面的查询再次没有缓存。所以,执行时间很长。并且声明为会话全局变量的这种类型的变量可能与另一个存储过程的变量发生冲突。因为我在此存储过程中调用了存储过程,并且变量名称在另一个存储过程中应该相同。

所以,让我知道什么是最好的解决方案。

谢谢。

4

2 回答 2

0

不好意思刚刚发错了

DELIMITER //
CREATE PROCEDURE yourprocedurenamehere(IN state CHAR(2))
BEGIN
SET @mystate = state;
SET @sql = CONCAT('SELECT * FROM BLABLABLA WHERE BLA = ?');
PREPARE stmt FROM @sql;
EXECUTE stmt USING @mystate;
END;
//

对不起朋友,刚刚编辑了我的代码哈哈哈我错了

于 2013-05-03T08:54:19.287 回答
0

一个简短的回答是没有办法做到这一点。理论上,您可以使用 sha1(prepared statement query text)来识别prepared statement name,并将其用作语句句柄。但是无法动态执行名称存储在变量或表中的语句:动态 SQL 查询文本中不允许 EXECUTE 本身。一个不同的问题是您的示例中是否需要动态 SQL,似乎使用输入参数参数化的标准 SQL 存储过程可以做得很好。

于 2013-05-03T12:00:23.133 回答