それ自体として非常に高速に実行されるクエリがありますが、そのクエリを関数の本体として使用すると、大幅な速度低下が発生します。これが私のテストケースです:
/******************* my function definition *********************/
DELIMITER $$
CREATE DEFINER=`root`@`%` FUNCTION `GetNextScheduleForProgram`(
prog_id varchar(10)
) RETURNS varchar(10) CHARSET latin5
DETERMINISTIC
BEGIN
DECLARE scheduleid varchar(10);
SET scheduleid =
(
SELECT sc.ScheduleID
FROM Schedule sc
WHERE sc.ProgramID=prog_id
AND sc.StartDate BETWEEN now() and date_add(now(), interval 3 day)
ORDER BY sc.StartDate ASC
LIMIT 1
);
RETURN scheduleid;
END
そして、ここにクエリステートメントがあります。
- まず、クエリはそれ自体として実行されます
- 次に、関数は同じパラメーターで使用されます。
SET @ id1 =(SELECT sc.ScheduleID FROMスケジュールsc WHERE sc.ProgramID = '23860' AND sc.StartDate BETWEEN now()and date_add(now()、interval 3 day) sc.StartDateASCで注文 制限1); SET @ id2 = GetNextScheduleForProgram( '23860');
このテストでは、 @ id1はおよそ0.03秒で設定され、@ id2は3.5秒(せいぜい2秒)で到着します。この驚くべきパフォーマンスヒットの原因は何だろうか。
この関数を別のストアドプロシージャで使用する必要があるため、ストアドプロシージャの各行を2〜3秒待つと、パフォーマンス全体が低下します。
この時点から誰かが私を改善するのを手伝ってもらえますか?