ストア プロシージャから動的クエリをキャッシュするにはどうすればよいですか? 今、次のようなストア プロシージャを作成しました。
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;
上記の場合、クエリで 2 回使用されるため、同じ変数 (@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;
しかし、上記のクエリはキャッシュされません。そのため、実行時間が非常に長くなります。また、セッション グローバル変数として宣言されたこのタイプの変数は、別のストア プロシージャの変数と競合する可能性があります。このストア プロシージャ内にストア プロシージャを呼び出しており、変数名は別のストア プロシージャでも同じにする必要があるためです。
それで、同じことに対する最善の解決策を教えてください。
ありがとう。