2014-08-27 6 views
1

PostgreSQL версии: Postgres Plus Advanced Server 9.2
Операционная система: Windows 7/8PostgreSQL блокировалась после 6-го исполнения того же запроса

У меня есть хранимая процедура, которая действует, как это следующим образом:
1. Очищает Table1
2. Выбор из представления (же вид всегда) на основе нескольких параметров, передаваемых в WHERE условие (всегда одни и те же параметры для ради примера)
3. Вкладывает в table1 Результаты выбора выше.

Тело процедуры выглядит следующим образом:

BEGIN 

    PERFORM clear_table1(p_session_id); 

    INSERT INTO table1 (session_id, id1, adress, x, y) 
    SELECT p_session_id, id1, adress, x, y 
     FROM myview 
     WHERE (CONDITION) 
      AND (CONDITION) 
      AND (CONDITION) 
      AND (lower(adress) LIKE lower(p_adress) OR p_adress IS NULL) 
      LIMIT 6000; 
END; 

Первые 5 раз (всегда в 5 раз) я бегу точно такой же запрос с точно такими же параметрами, он работает, как ожидалось. В следующий раз (6-й раз) он работает в течение огромного количества времени, что-то вроде .. десятков минут.

select * from myfunction('session_id',NULL,NULL,'%adress%') 

В Статус сервера вид PostgreSQL Manager, я заметил ряд замков, добавленных для таблиц, в которых я вставить вместе с таблицами, из которых заселенных вид

Может кто-нибудь с Опыт PostgreSQL говорит мне, есть ли какие-то настройки, чтобы исправить это поведение. ИЛИ произошло это или что-то подобное с кем-то другим, использующим PG?

Спасибо !!!

Позже редактировать: - проблема всегда возникает только, когда 6 вызовов сделаны из же сессий - мы явно не совершаем в конце хранимой процедуры

+1

1) Вы совершаете между вызовами? 2) являются ли 6 выписок из разных сессий? – wildplasser

+0

См. Более позднюю версию. – tartak

+0

Почему вы используете функцию только для очистки таблицы? Почему бы не просто «удалить из таблицы»; 'или' обрезать таблицу'; '? – wildplasser

ответ

0

Wild догадки: Вы используете JDBC с порогом подготовки по умолчанию.

Посмотрите, может ли отказ от подготовки на стороне сервера отменить проблему. См. the PgJDBC docs.

Несоблюдение этого требования, если медленный вызов находится в пределах функции: попробуйте включить auto_explain с обработкой функциональных органов. Затем посмотрите, изменится ли план по какой-либо причине на 6-й вызов.

+0

Пришлось искать ... «с обработкой функции» SET auto_explain.log_nested_statements = 1; – Kuberchaun

-1

Я знаю, что это действительно старый вопрос, но вчера у меня была точно такая же проблема.

Это сложно понять, потому что это всегда после шестого времени, когда оно происходит.

Я не могу объяснить причину, однако я смог ее исправить.

В моем случае я должен был изменить ту часть, где он был

SELECT (sum(coalesce(debito.vl_conta,0))) ... 

в

execute 'SELECT (sum(coalesce(debito.vl_conta,0))) ... 

и это все. Но отвечая здесь, на случай, если кто-то еще страдает от этого или объяснит, почему это происходит.

Thanks,