2

これがMySQLのプリペアドステートメントです

SELECT 
    ag.`attendance_type`,
    ag.`description`,
    COUNT(a.`attendance`) attendance_count 
FROM
    `ems_attendance` a 
    RIGHT JOIN `ems_att_group` ag 
        ON ag.`id` = a.`attendance` 
        AND a.`added_date` BETWEEN '2011-06-01' 
        AND '2011-06-17' 
        AND a.`users_id` = '9' 
GROUP BY a.`attendance` 
ORDER BY ag.`id`;

および同等のストアドプロシージャ

DELIMITER $$

DROP PROCEDURE IF EXISTS `users_attendance_report` $$

CREATE PROCEDURE `users_attendance_report` (
    IN users_id INT,
    IN start_date DATE,
    IN end_date DATE
) 
BEGIN
    SELECT 
        ag.`attendance_type`,
        ag.`description`,
        COUNT(a.`attendance`) attendance_count 
    FROM
        `ems_attendance` a 
        RIGHT JOIN `ems_att_group` ag 
            ON ag.`id` = a.`attendance` 
            AND a.`added_date` BETWEEN start_date 
            AND end_date 
            AND a.`users_id` = users_id 
    GROUP BY a.`attendance` 
    ORDER BY ag.`id` ;
END $$

DELIMITER;

クエリを実行した後、両方とも同じ結果を出力します。

Array
(
    [0] => stdClass Object
        (
            [attendance_type] => present
            [description] => Present
            [attendance_count] => 10
        )

    [1] => stdClass Object
        (
            [attendance_type] => absent
            [description] => Absent
            [attendance_count] => 2
        )

    [2] => stdClass Object
        (
            [attendance_type] => other
            [description] => Other
            [attendance_count] => 0
        )

    [3] => stdClass Object
        (
            [attendance_type] => dayoff
            [description] => Day Off
            [attendance_count] => 2
        )

)

実行時間を詳しく調べますが、どちらも同じです。いつ、どこで、あるものが別のものよりも優れていて、速いですか?

4

2 に答える 2

4

「より速い」と「より良い」は必ずしも一致していません。この最近の同様のSOの質問を参照し、ソリューションの次の属性を検討してください。

  • 保守可能(読み取り可能、スキル要件-このコードで作業できる人)
  • テスト可能
  • リリース可能
  • フレキシブル
  • ポータブル

一般的に、ストアドプロシージャは高速ですが、他のすべてのメトリックでは失敗します。

于 2011-06-17T06:32:51.137 に答える
2

あなたの場合、クエリをスタンドアロンで実行するか、ストアドプロシージャの一部として実行するかは問題ではないと思います。手順は、実行するクエリバッチがある場合に便利です。したがって、クエリにはスタンドアロンで実行するのが最適です。

于 2011-06-17T07:53:07.893 に答える