PHP PDO Oracle висит на DELETE? - PullRequest
0 голосов
/ 03 марта 2009

Это зависает в 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 ]

2 голосов
/ 03 марта 2009

УДАЛЕНИЕ без ГДЕ (скорее всего) будет полное сканирование таблицы. Это означает, что он читает каждый блок под «верхней отметкой» - то есть каждый блок, который когда-либо использовался таблицей. Таким образом, если таблица была когда-то очень большой, то удаление нескольких записей может занять очень много времени. [Потому что он не «знает», что есть только четыре записи, пока он не прочитает все это пространство.]

Усечение не делает этого. Он просто перемещает верхнюю отметку стола, чтобы любые используемые блоки быстро становились неиспользованными.

1 голос
/ 03 марта 2009

Есть ли в базе данных одновременно другие действия? Если да, я бы заподозрил тупики. Некоторые незафиксированные транзакции DML могут блокировать некоторые строки MY_TABLE.

Если вам не нужна возможность отката, рассмотрите возможность использования TRUNCATE вместо DELETE.

1 голос
/ 03 марта 2009

Маловероятно, что он зависает, поскольку PDO, кажется, используется довольно редко, хотя, насколько хорошо с Oracle, я не знаю.

A delete from my_table может занять некоторое время в зависимости от количества записей. Как долго вы ждали, прежде чем решить, что оно зависло, и сколько записей было в таблице?

0 голосов
/ 03 марта 2009

Если в той же таблице выполняется транзакция, она может заблокировать УДАЛЕНИЕ.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...