0

私は、PHPのメッセージツリーを処理するコードをより効率的にするために取り組んでいます。データはSQLデータベースに格納されており、現在、メッセージごとに2つのSQLクエリを実行する必要があります。1つはデータを検索し、もう1つはデータを更新します。単一のクエリでこれを実行する方法があると思いますが、他のSQLメソッドよりもはるかに遅いと聞いたカーソルを使用します。

カーソルを使用する1つのSQLクエリを実行する方が効率的かどうか、またはメッセージごとにselectクエリとupdateクエリを使用する現在のメソッドとPHPを使用してクエリを結合する方がよいかどうかを誰かが知っていますか?

4

1 に答える 1

3

@Catcallに同意します-コードを見ずに、この質問に意味のある答えを出すのは難しいです。

ただし、大まかに言えば、カーソルが他のSQLメソッドよりも遅いとよく言われるのは、一部の開発者がセットベースの操作が機能する場所でカーソルを使用するためです。

たとえば、計画が(疑似コードで、実際のDBエンジンまたはスキーマがない場合)の場合

create cursor RecordsToUpdate
as
select *
from UserTable
where name like 'Codd%'

foreachRecord in RecordsToUpdate
  set record.lastUpdatedDate = today
next

(うまくいけば)実行することで同じことを達成できることは明らかです

update UserTable
set lastUpdatedDate = today
where name like 'Codd%'

ただし、セットベースの操作が不可能な場合もあります。大まかに言えば、カーソルを作成し、ロジックを実行して、カーソルを閉じる方が効率的です。理想的には、ストアドプロシージャなどです。 。このアプローチは、PHPサーバーにデータを送り返すネットワークオーバーヘッドを制限します。

そうは言っても、ほとんどの場合、実際のシナリオの違いに気付くことはありません。また、データベースの負荷が高い場合、またはクエリの実行が遅い場合(たとえば、数百万のレコードを含むカーソルを反復処理する場合)、このアプローチによってDBサーバーのボトルネックが発生する可能性があることも指摘しておく価値があります。大まかに言えば、データベースに長時間実行されるジョブをできるだけ避けたいと考えています。それらを多数の小さなジョブに分割することをお勧めします。

于 2011-03-22T10:38:20.200 に答える