1

ゲーム内の都市に関する情報を保持するテーブルがあります。毎ターン1つの建物を建てることができ、これは「usedBuilding」という値で記録されます。

毎ターン、usedBuildingを0に変更するスクリプトを実行します。問題は、次の2つの方法のどちらが高速で、どちらの方法を使用するかが実際に重要かどうかです。

UPDATE cities SET usedBuilding = 0;
UPDATE cities SET usedBuilding = 0 WHERE usedBuilding = 1;
4

8 に答える 8

4

一般に、2番目のケース(WHEREを使用)は、未使用の行でトリガー評価、トランザクションログ、インデックス更新などを引き起こさないため、より高速になります。

潜在的に-0/1値の分布によっては、比較を行うよりも実際にはすべての行を更新する方が速い場合があります-しかし、それはかなり退化したケースです。

クエリコストの約95%がI / Oであるため、WHERE句を使用しても、違いはありません(列にインデックスが付けられておらず、テーブルスキャンを実行しているため)、または大きな違いがあります(列にインデックスが付けられている場合、またはパーティション化されたテーブルなど)。いずれにせよ、それは傷つきません。

あなたが話しているデータの量については、実行計画や速度の違いに気付かないのではないかと思います。これにより、せいぜいアカデミックになり、最悪の場合は時期尚早の最適化になります。ですから、あなたのアプリにとって論理的に意味のあるものなら何でも使うことをお勧めします。

于 2008-09-23T23:28:49.223 に答える
3

usedBuildingにインデックスが付けられている場合、usedBuildingがtrueの行にのみアクセス/更新されるため、where句を使用する方が速くなります。インデックスが作成されていない場合は、とにかく全表スキャンを実行することになります。したがって、大きな違いはありません。

于 2008-09-23T22:30:23.903 に答える
3

ループで両方の方法を数千回試して、時間を計ってください!おそらく、このテーブルに実際にあるレコードの数と、それらがすべてメモリに収まるか、ディスクにページングする必要があるかによって異なります。更新を実行する前に値1になっている建物の数(これは1かもしれないと思います)。

どちらの方法を使用するかは問題ではありませんが、最も短いものがおそらく最も少なく、うまくいかない可能性があります。あなたが書かないコードはバグを持つことができません。

于 2008-09-23T22:34:06.000 に答える
2

これらのターンはどのくらいの頻度で発生しますか? このテーブルには何行あると予想されますか? 答えが「1 秒に 1 回未満」または「10000 回未満」の場合は、心配する必要はありません。

もちろん、これになんらかの学術的関心がある場合を除きます。

于 2008-09-23T22:54:03.973 に答える
1

「UPDATEcitysSETusedBuilding = 0;」を作成すると、トランザクションの数が少なくなるようです。より具体的なクエリよりも実行します。これに対して私が考えることができる主な理由は、列に複数の状態がある場合です。それが単なるブール値である場合は問題ありませんが、それが常に当てはまるかどうかを考えるのに少し時間をかけたいと思うかもしれません。

インデックスを作成すると、WHERE句を使用して実行プランをより効率的にすることもできます。

于 2008-09-23T22:31:33.370 に答える
1

決定的な答えを得る最良の方法は、さまざまなシナリオで多くのサンプルデータを使用してプロファイルを作成することです。

于 2008-09-23T22:34:02.990 に答える
1

正確には何行になりますか?小規模なオンライン ゲームの場合は、気にする必要はないと思います。

"cities" テーブルに対して複数の更新を行う場合は、可能であればすべてを 1 つの UPDATE ステートメントで行うことをお勧めします。

行に変更を加えると、行全体を書き込むのと同じくらい多くの I/O が必要になる可能性があります (もちろん、インデックス付きの列を更新するにはインデックスの書き込みも必要です)。

しかし、たとえば 1000 行未満であれば、気にする必要はありません :)

于 2008-09-24T05:31:27.043 に答える
1

usedBuilding = 1 の値の 2% 程度のものがない限り、インデックス作成はまったく役に立ちません。

ただし、これら 2 つのステートメントは論理的に異なり、まったく異なることを意味する場合があります。しかし、あなたの場合、それらが同じである場合は、where句のないものを使用してください。

于 2008-09-23T22:42:03.703 に答える