2011-09-16 9 views
2

The Application(TM)への新しいバッチの追加を予定していたときに、不思議な疑問が浮き彫りになりました。呼び出されるプロシージャが必要な行ごとに結果セットがあるので、CURSORをループしてプロシージャを呼び出すプロシージャを作成するか、単にPHPでそのセットをフェッチし、それは "手動で"行うのですか?プロシージャは、短い期間(1回につき1秒〜プロシージャあたり2〜3回のコール、1日に数回)実行されます。PHPループ上のカーソルの使用

私がこれを求めている理由は、誰かが、MySQLとPHPの間でデータを複数回送信するオーバーヘッドよりもCURSORSが効率が悪いという経験があるかどうか疑問だということです。他の問題は、コアテーブルの1つを使用していることです。そのため、ヒット数を最小限に抑えたいと考えています。

+0

この手順は、mysqlストアドプロシージャですか? – TJHeuvel

+0

はい、これまでのストアドプロシージャで、平均実行時間は約1秒です。 – Naltharial

答えて

1

PHPイテレータインターフェイス(http://php.net/manual/en/class.iterator.php)を実装するスタブクラスを作成できます。 Iteretorインターフェイスで実装するクラスをインスタンス化すると、接続を保持してCURSORの場所を追跡できます。このオブジェクトの新しいインスタンスを作成すると、初期クエリを実行して、初期化カーソルを取得できます。次に、オブジェクトに対してforeachを使用すると、CURSORを先に移動してループの必要に応じて現在の値を返すようにコーディングするnext()メソッドのオブジェクトのカスタム実装を呼び出します。

+0

私が探していたパフォーマンスの答えは正確ではありませんが、あなたの答えは私の問題について新しい情報を提供してくれました。ありがとうございます。 – Naltharial