2015-01-08 4 views
1

Я запускаю скрипт php, который выбирает/вставляет в postgresql базу данных.php script повторяется во время работы postgresql

Проблема заключается в том, что, когда я запустить сценарий, чтобы выбрать более (400000) строк,

сценарий повторяет вставку для одних и тех же строк!

Я нашел эту ошибку в журнале PostGreSQL:

2014-12-21 13:14:53 AST LOG: checkpoints are occurring too frequently (7 seconds apart) 
2014-12-21 13:14:53 AST HINT: Consider increasing the configuration parameter "checkpoint_segments". 

я изменил конфигурацию быть:

- Checkpoints - 
checkpoint_segments = 100  # in logfile segments, min 1, 16MB each 
checkpoint_timeout = 1h  # range 30s-1h 
checkpoint_completion_target = 0.9 # checkpoint target duration, 0.0 - 1.0 
checkpoint_warning = 30s  # 0 disables 

, но проблема все еще имеют место. может ли кто-нибудь дать мне знать, как это исправить?

UPDATE

я начинаю свой скрипт с подготовки запроса:

<?php 
// * Connect to Specified Database 
set_time_limit(0); 
$dbconn = pg_connect("host=localhost port=5432 dbname=postgis user=postgres password=****"); 

    if (!$dbconn) { die("Error in connection: " . pg_last_error());} 

// connected to Database 
else{ 

      //We prepare the PostgreSQL next messages query. At this stage it is sent off to the Database server. 

       $nextMessageQuery = pg_prepare($dbconn, 'selectNextMessage', " 
         WITH 
          history AS (select id ,userid,assigning_date from userid_history 
          where id=$2 and assigning_date <$4), 
          accounttbl AS(select timestamp,userid,position from account 
          where timestamp >$1 and position is not null 
          and timestamp between $3 and $4) 

         select p.value1 ,value2.value3,p.value4, m.userid 
         from (
          SELECT min(next.timestamp)AS value3,next.userid,next.id from(
          select history.id,accounttbl.userid,accounttbl.timestamp,history.assigning_date,accounttbl.position 
          from history 
          inner join accounttbl 
          on(
          accounttbl.userid=history.userid and 
          accounttbl.timestamp > history.assigning_date and 
           (accounttbl.timestamp <(select min(assigning_date) from history h 
                where h.id=history.id and 
                h.assigning_date>history.assigning_date) 
               or 
                (select min(assigning_date) from history h 
                 where h.id=history.id and h.assigning_date>history.assigning_date) is null 
           ) 
          ) 
          where timestamp >$1 
          )next GROUP BY next.userid,next.id 
         ) value2 
         JOIN nmea m on m.timestamp=value2.value3 and m.userid=value2.userid ,places p 
         WHERE m.position is not null and ST_DWithin(m.position,p.position,0.0217130577252428)order by ST_Distance(p.position,m.position)"); 


        ?> 

это просто, чтобы показать вам, насколько сложно мои запросы.

затем выберите #rows и вставки или обновления в новую таблицу на основе многих сравнивающих заявлений

все в одном сложном сценарии. Должен ли я опубликовать все это?

+3

"сценарий повторяет вставку для одних и тех же строк!" Звучит как ошибка в вашем скрипте, PostgreSQL не дублирует записи сам по себе. Подсказка о конфигурации связана, но не основная причина. После изменения postgresql.conf вы также перезагрузили эту новую конфигурацию? Если нет, старые настройки все еще активны. –

+1

Звучит как ошибка в вашем php. Можете ли вы опубликовать свой сценарий? – mlinth

+0

@FrankHeikens Спасибо. Я обновил свой пост. – Reem

ответ

0

Спасибо всем,

, как Крейг упоминается там была ошибка в самих данных не в загрузке данных.

Фактически, в некоторых записях есть репликация, которую мы выбираем!

так я использовал:

SELECT DISTINCT на (время, идентификатор) время, идентификатор, .... FROM таблицы