2014-01-27 7 views
0

Почему простой запрос занимает много времени, чтобы выполнить более 1 секунды (вы можете увидеть файл журнала: http://tny.cz/1fa5d842), который передан в подготовленном операторе. В консоли он выполняется менее чем за 30 мс. Запрос слишком прост. Не могли бы вы помочь решить эту проблему? Большое спасибо за вашу помощь.
ОС: окна 7
Postgresql 9.3.2.Почему простой запрос занимает слишком много времени posgresql?

RhodiumToad поможет мне решить эту проблему. была функция (равная) writin in (pl/pgsql) whitch сделать равным между числом и символом. Я изменил эту функцию от pl/pgsql до простой встроенной функции. и индекс работает нормально.

ответ

0

Я считаю, проблема заключается в том, что тип данных столбца не совпадает с типом данных значения:

WHERE fda_agriculteur.FDA_Agriculteur_ID = $1 

и

$1 = '1054998' 

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

Попробуйте явное приведение того же типа, что и столбец:

WHERE fda_agriculteur.FDA_Agriculteur_ID = $1::int 

я видел Postgres быть особенно слабоумный с литьем. У меня была эта точная проблема много лет назад - похоже, что все не изменилось.

+0

благодарит человека за ваш ответ. RhodiumToad помогите мне решить эту проблему (как вы сказали) была функция (равная) writin in (pl/pgsql) whitch сделать равным между числом и символом. Я изменил функцию из pl/pgsql на простую встроенную функцию. и запрос работает нормально. – Espadax4

+0

, вы должны принять, что когда-либо ответ лучше. – Bohemian

+0

все сделано :) Извините, не могу проголосовать, нет репутации для этого lol – Espadax4

0

Невозможно различать запрос через приложение или запрос через консоль. Только причина для вашего консольного запроса может вернуться быстрее, если вы уже запускали запрос один раз перед тем, чтобы разогреть кеш. Иначе даже с консоли это займет 1 + секунды.

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

`Seq Scan on public.fda_agriculteur (cost=0.00..115524.50 rows=53792 width=24) (actual time=463.383..1122.579 rows=1 loops=1)` 

Это, безусловно, займет больше времени, чем сканирование индекса. Это будет постепенно ухудшаться по мере роста количества записей в таблице. Вы должны создать индекс на fda_agriculteur.FDA_Agriculteur_ID. Это значительно улучшит скорость запросов.

+0

столбец FDA_Agriculteur_ID является первичным ключом в таблице – Espadax4

0

Я никогда не использовал postgresql, но ваш файл журнала упоминает что-то, что звучит как подсказка.

Seq Scan on public.fda_agriculteur (cost=0.00..115524.50 rows=53792 width=24) 
    (actual time=463.383..1122.579 rows=1 loops=1) 

Это очень похоже на сканирование таблицы в SQL Server. У вас есть какой-либо индекс в вашем [предполагаемом] столбце первичного ключа?

CREATE UNIQUE INDEX PK_FDA_Agriculteur ON fda_agriculteur (FDA_Agriculteur_ID) 
+0

спасибо человеку, решите проблему. Я отправлю решение как можно скорее. благодаря RhodiumToad в поддержке postgresql. – Espadax4

Смежные вопросы