PHPのOracle PDOはDELETEでハングしますか?
質問
これはPhp(5.2.6-Win32 + Oracle10g)でハングしますか、それはバグですか、それとも根本的に間違っていますか?
try {
$conn = new PDO($DB,$USER,$PASSWORD);
$conn->setAttribute( PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION );
//connected
try {
$conn->exec("DELETE FROM MY_TABLE");
echo "done";
...
注:これがバグであるかどうかはわかりませんが、そうであると推測しています。ただし、クイック検索を行った後、このバグレポートを見つけることができませんでした。私は何か間違ったことをしているかもしれないので、私はここで最初に尋ね、他の誰かが同様の問題を抱えている場合のために後世のために尋ねると思いました。
解決
データベース内で同時に行われている他のアクティビティはありますか?はいの場合、デッドロックが疑われます。コミットされていないDMLトランザクションによっては、 MY_TABLE
の一部の行がロックされている可能性があります。
ロールバック機能が必要ない場合は、 DELETE
の代わりに TRUNCATE
を使用することを検討してください。
他のヒント
WHEREなしのDELETEは、(ほとんどの場合)テーブルのフルスキャンを行います。 つまり、「最高水位標」の下にあるすべてのブロック、つまり、テーブルで使用されたことのあるすべてのブロックを読み取ります。したがって、テーブルが一度に非常に大きい場合、ほんの一握りのレコードを削除するのに非常に長い時間がかかる可能性があります。 [すべてのスペースを読み取るまで、レコードが4つしかないことを「認識」しないため。]
切り捨てはこれを行いません。使用されていたブロックがすぐに使用されなくなるように、テーブルの最高水位標を移動するだけです。
PDOがかなり使用されているように見えるので、ハングする可能性はほとんどありませんが、Oracleでどの程度かはわかりません。
my_tableからの delete
は、レコードの数によっては時間がかかる場合があります。ハングするかどうかを判断するまでにどれくらい待っていましたか?テーブルにはいくつのレコードがありましたか?
同じテーブルで実行されているトランザクションがある場合、DELETEがブロックされる可能性があります。