0

これは 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";
...

注:これがバグかどうかはわかりませんが、バグだと思います。ただし、クイック検索の後でこれに関するバグレポートが見つからなかったためです。私は何か間違ったことをしているかもしれないので、最初にここで質問し、他の誰かが同様の問題を抱えている場合に備えて後世のために質問すると思いました.

4

4 に答える 4

2

WHERE のない DELETE は、(ほとんどの場合) テーブルのフル スキャンを行います。つまり、「最高水準点」の下にあるすべてのブロックを読み取ります。つまり、これまでにテーブルで使用されたすべてのブロックです。そのため、一度にテーブルが非常に大きかった場合、ほんの一握りのレコードを削除するのに非常に長い時間がかかることがあります。[すべてのスペースを読み取るまで、レコードが 4 つしかないことを「認識」しないためです。]

切り捨てはこれを行いません。使用中のブロックがすぐに使用されなくなるように、テーブルの最高水準点を移動するだけです。

于 2009-03-03T08:38:10.703 に答える
2

データベースで同時に進行中の他のアクティビティはありますか? はいの場合、デッドロックが疑われます。一部のコミットされていない DML トランザクションが の一部の行をロックしている可能性がありますMY_TABLE

ロールバック機能が必要ない場合は、TRUNCATE代わりに を使用することを検討してDELETEください。

于 2009-03-03T07:18:39.287 に答える
1

PDO がかなり使用されているように見えるため、ハングしている可能性はほとんどありませんが、Oracle がどの程度かはわかりません。

レコードのdelete from my_table数によっては、時間がかかる場合があります。ハングしていると判断するまでにどれくらいの時間待ちましたか? テーブルにはいくつのレコードがありましたか?

于 2009-03-03T06:31:21.677 に答える
0

同じテーブルで実行中のトランザクションがある場合、DELETE がブロックされる可能性があります。

于 2009-03-03T18:33:45.390 に答える