Гость
Целевая тема:
Создать новую тему:
Автор:
Форумы / PostgreSQL [игнор отключен] [закрыт для гостей] / Помогите с блокировками! / 7 сообщений из 7, страница 1 из 1
12.03.2008, 07:31
    #35184029
ChameLe0n
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Помогите с блокировками!
Запрос:
Код: plaintext
select *,relname from pg_locks join pg_class on relation = pg_class.oid;
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
 locktype     database     relation     page     tuple     virtualxid     transactionid     classid     objid     objsubid     virtualtransaction     pid     mode              granted     relname                     relnamespace     reltype     relowner     relam     relfilenode     reltablespace     relpages     reltuples     reltoastrelid     reltoastidxid     relhasindex     relisshared     relkind     relnatts     relchecks     reltriggers     relukeys     relfkeys     relrefs     relhasoids     relhaspkey     relhasrules     relhassubclass     relfrozenxid     relacl         reloptions       relname                    
 -----------  -----------  -----------  -------  --------  -------------  ----------------  ----------  --------  -----------  ---------------------  ------  ----------------  ----------  --------------------------  ---------------  ----------  -----------  --------  --------------  ----------------  -----------  ------------  ----------------  ----------------  --------------  --------------  ----------  -----------  ------------  --------------  -----------  -----------  ----------  -------------  -------------  --------------  -----------------  ---------------  -------------  ---------------  -------------------------- 
 relation      90721558       1259          (null)   (null)    (null)         (null)            (null)      (null)    (null)        12 / 16510                 19128    AccessShareLock   true        pg_class                     11                 83            10             0           1259              0                   39             257             0                   0                  true            false           r            27             0               0                 0              0              0            true           false          false           false               378               {=r/postgres}  (null)           pg_class                   
 relation      90721558       90817770      (null)   (null)    (null)         (null)            (null)      (null)    (null)        20 / 872                   17154    AccessShareLock   true        queue                        90721559           90817772      10             0           90817770          0                   25607          220633          0                   0                  true            false           r            24             0               0                 0              0              0            false          false          false           false               61946             (null)         {fillfactor= 10 }  queue                      
 relation      90721558       90817770      (null)   (null)    (null)         (null)            (null)      (null)    (null)        20 / 872                   17154    RowExclusiveLock  true        queue                        90721559           90817772      10             0           90817770          0                   25607          220633          0                   0                  true            false           r            24             0               0                 0              0              0            false          false          false           false               61946             (null)         {fillfactor= 10 }  queue                      
 relation      90721558       90817779      (null)   (null)    (null)         (null)            (null)      (null)    (null)        20 / 872                   17154    AccessShareLock   true        queue_in_states              90721559           0             10             403         90817779          0                   1142           220633          0                   0                  false           false           i            3              0               0                 0              0              0            false          false          false           false               0                 (null)         (null)           queue_in_states            
 relation      90721558       90817779      (null)   (null)    (null)         (null)            (null)      (null)    (null)        20 / 872                   17154    RowExclusiveLock  true        queue_in_states              90721559           0             10             403         90817779          0                   1142           220633          0                   0                  false           false           i            3              0               0                 0              0              0            false          false          false           false               0                 (null)         (null)           queue_in_states            
 relation      90721558       2662          (null)   (null)    (null)         (null)            (null)      (null)    (null)        12 / 16510                 19128    AccessShareLock   true        pg_class_oid_index           11                 0             10             403         2662              0                   21             257             0                   0                  false           false           i            1              0               0                 0              0              0            false          false          false           false               0                 (null)         (null)           pg_class_oid_index         
 relation      90721558       2663          (null)   (null)    (null)         (null)            (null)      (null)    (null)        12 / 16510                 19128    AccessShareLock   true        pg_class_relname_nsp_index   11                 0             10             403         2663              0                   8              257             0                   0                  false           false           i            2              0               0                 0              0              0            false          false          false           false               0                 (null)         (null)           pg_class_relname_nsp_index 
 relation      90721558       10969         (null)   (null)    (null)         (null)            (null)      (null)    (null)        12 / 16510                 19128    AccessShareLock   true        pg_locks                     11                 10970         10             0           10969             0                   0              0               0                   0                  false           false           v            14             0               0                 0              0              0            false          false          true            false               0                 {=r/postgres}  (null)           pg_locks                   


Код: plaintext
select *,now()-query_start from pg_stat_activity
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
datid     datname     procpid     usesysid     usename     current_query                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                            waiting     xact_start          query_start         backend_start       client_addr     client_port     ?column?                                             
 --------  ----------  ----------  -----------  ----------  -----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------  ----------  ------------------  ------------------  ------------------  --------------  --------------  ---------------------------------------------------- 
  90721558   test1        17154         10            postgres    UPDATE                                             
   operations.queue                                
SET                                                
   substate= 2 ,                
   time_process=now()                              
WHERE                                              
   state= 20                         
   and substate= 1             
   and id_operation in(                            
       SELECT                                      
           id_operation                            
       FROM                                        
           operations.queue                        
       WHERE                                       
           state= 20                 
           and substate= 1     
       LIMIT  500                                    
   )  false        12 . 03 . 2008   6 : 57 : 57    12 . 03 . 2008   6 : 57 : 57    12 . 03 . 2008   6 : 57 : 37    127 . 0 . 0 . 1    18027             0  years  0  mons  0  days  0  hours  23  mins  24 . 521162  secs 
  90721558   test1        19128         10            postgres    <IDLE>                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                   false       (null)               12 . 03 . 2008   7 : 14 : 47    12 . 03 . 2008   7 : 12 : 06    127 . 0 . 0 . 1    5604              0  years  0  mons  0  days  0  hours  6  mins  35 . 088535  secs  
  90721558   test1        19040         10            postgres    select *,now()-query_start from pg_stat_activity                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                         false        12 . 03 . 2008   7 : 21 : 22    12 . 03 . 2008   7 : 21 : 22    12 . 03 . 2008   7 : 11 : 36    127 . 0 . 0 . 1   5600              0  years  0  mons  0  days  0  hours  0  mins -. 002739  secs   
  90721558   test1        19033         10            postgres    <IDLE>                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                   false       (null)               12 . 03 . 2008   7 : 11 : 35    12 . 03 . 2008   7 : 11 : 35    127 . 0 . 0 . 1    5599              0  years  0  mons  0  days  0  hours  9  mins  47 . 046645  secs  
  90721558   test1        20505         10            postgres    <IDLE>                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                   false       (null)               12 . 03 . 2008   7 : 21 : 22    12 . 03 . 2008   7 : 21 : 13    127 . 0 . 0 . 1    5424              0  years  0  mons  0  days  0  hours  0  mins . 119858  secs    
  90721558   test1        20473         10            postgres    <IDLE>                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                   false       (null)               12 . 03 . 2008   7 : 21 : 20    12 . 03 . 2008   7 : 20 : 58    127 . 0 . 0 . 1    5423              0  years  0  mons  0  days  0  hours  0  mins  1 . 726008  secs   
  90721558   test1        20272         10            postgres    <IDLE>                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                   false       (null)               12 . 03 . 2008   7 : 21 : 22    12 . 03 . 2008   7 : 19 : 05    127 . 0 . 0 . 1    5049              0  years  0  mons  0  days  0  hours  0  mins . 122466  secs    
  90721558   test1        20472         10            postgres    <IDLE>                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                   false       (null)               12 . 03 . 2008   7 : 21 : 09    12 . 03 . 2008   7 : 20 : 58    127 . 0 . 0 . 1    5422              0  years  0  mons  0  days  0  hours  0  mins  12 . 671543  secs  
  90721558   test1        20349         10            postgres    <IDLE>                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                   false       (null)               12 . 03 . 2008   7 : 21 : 05    12 . 03 . 2008   7 : 19 : 58    127 . 0 . 0 . 1   5057              0  years  0  mons  0  days  0  hours  0  mins  16 . 98928  secs   
  90721558   test1        20412         10            postgres    <IDLE>                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                   false       (null)               12 . 03 . 2008   7 : 21 : 05    12 . 03 . 2008   7 : 20 : 28    127 . 0 . 0 . 1    5059              0  years  0  mons  0  days  0  hours  0  mins  16 . 933724  secs  
  90721558   test1        20411         10            postgres    <IDLE>                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                   false       (null)               12 . 03 . 2008   7 : 21 : 22    12 . 03 . 2008   7 : 20 : 28    127 . 0 . 0 . 1    5060              0  years  0  mons  0  days  0  hours  0  mins . 055174  secs    
  90721558   test1        20444         10            postgres    <IDLE>                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                   false       (null)               12 . 03 . 2008   7 : 21 : 22    12 . 03 . 2008   7 : 20 : 43    127 . 0 . 0 . 1    5061              0  years  0  mons  0  days  0  hours  0  mins . 002669  secs    
  90721558   test1        20348         10            postgres    <IDLE>                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                   false       (null)               12 . 03 . 2008   7 : 21 : 05    12 . 03 . 2008   7 : 19 : 58    127 . 0 . 0 . 1    5056              0  years  0  mons  0  days  0  hours  0  mins  16 . 983917  secs  
 

те запрос висит ~20 минут. Других запросов нет. Кого он ждет? В таблице ~150 тыс записей
...
Рейтинг: 0 / 0
12.03.2008, 07:33
    #35184031
ChameLe0n
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Помогите с блокировками!
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
 QUERY PLAN                                                                                                                       
 -------------------------------------------------------------------------------------------------------------------------------- 
 Hash Join  (cost= 76 . 28 .. 37557 . 93  rows= 200  width= 93 ) (actual time= 3 . 057 .. 932 . 055  rows= 500  loops= 1 )                                
   Hash Cond: (operations.queue.id_operation = operations.queue.id_operation)                                                     
   ->  Seq Scan on queue  (cost= 0 . 00 .. 36436 . 12  rows= 278008  width= 93 ) (actual time= 0 . 043 .. 753 . 456  rows= 160500  loops= 1 )             
         Filter: ((state =  20 ) AND (substate =  1 ))                                                                                
   ->  Hash  (cost= 73 . 78 .. 73 . 78  rows= 200  width= 4 ) (actual time= 2 . 952 .. 2 . 952  rows= 500  loops= 1 )                                     
         ->  HashAggregate  (cost= 71 . 78 .. 73 . 78  rows= 200  width= 4 ) (actual time= 2 . 224 .. 2 . 523  rows= 500  loops= 1 )                      
               ->  Limit  (cost= 0 . 00 .. 65 . 53  rows= 500  width= 4 ) (actual time= 0 . 005 .. 1 . 690  rows= 500  loops= 1 )                         
                     ->  Seq Scan on queue  (cost= 0 . 00 .. 36436 . 12  rows= 278008  width= 4 ) (actual time= 0 . 004 .. 1 . 283  rows= 500  loops= 1 ) 
                           Filter: ((state =  20 ) AND (substate =  1 ))
Выполнил параллельно такой же запрос из консоли:

Код: plaintext
1.
2.
3.
  500  record(s) affected 

 [Executed:  12 . 03 . 08   10 : 31 : 16  MSK ] [Execution:  819 /ms] 

На текущий момент запрос висит уже 35 минут.
...
Рейтинг: 0 / 0
12.03.2008, 11:09
    #35184409
ChameLe0n
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Помогите с блокировками!
Заменил
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
UPDATE                                             
   operations.queue                                
SET                                                
   substate= 2 ,                
   time_process=now()                              
WHERE                                              
   state= 20                         
   and substate= 1             
   and id_operation in(                            
       SELECT                                      
           id_operation                            
       FROM                                        
           operations.queue                        
       WHERE                                       
           state= 20                 
           and substate= 1     
       LIMIT  500                                    
   ) 
на
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
SELECT                                      
     id_operation                            
INTO TEMP 
    tmp_table
FROM                                        
    operations.queue                        
WHERE                                       
     state= 20                 
     and substate= 1     
LIMIT  500               


Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
UPDATE                                             
   operations.queue                                
SET                                                
   substate= 2 ,                
   time_process=now()                              
WHERE                                              
   state= 20                         
   and substate= 1             
   and id_operation in(                            
       SELECT                                      
           id_operation                            
       FROM                                        
           tmp_table
   ) 

Все заработало гораздо веселее! В чем может быть проблема?
...
Рейтинг: 0 / 0
21.03.2008, 09:55
    #35205154
LeXa NalBat
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Помогите с блокировками!
с блокировками все ок, для всех granted==true

кто такой queue_in_states?

> Выполнил параллельно такой же запрос из консоли:
> 500 record(s) affected
> [Executed: 12.03.08 10:31:16 MSK ] [Execution: 819/ms]
> На текущий момент запрос висит уже 35 минут.

возможно, в программе и из консоли постгрес выбрал разные планы выполнения

> На текущий момент запрос висит уже 35 минут.

postmaster активно работает или спит?
...
Рейтинг: 0 / 0
21.03.2008, 12:29
    #35205633
ChameLe0n
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Помогите с блокировками!
Спасибо что откликнулись :)

авторкто такой queue_in_states
это составной индекс по state,substate.

авторвозможно, в программе и из консоли постгрес выбрал разные планы выполнения
Ситуация легко воспроизводится. Однако что изменилось при работе через временную таблицу?
Imho при любом плане можно 1000 раз просканировать эту талицу за 40 минут.


авторpostmaster активно работает или спит?
Не вспомню сейчас.. Но система не стояла колом - это точно. Настроен автовакум. За это время, я думаю, он несколько раз чистил таблицу.

PS:
1) немного полегчало когда сделал fillfactor=10%
2) Очень сильно полегчало когда начал сначала читать во временную таблицу. Фактически сейчас таких провалов нет.

PPS: весь этот гемор чтобы избежать транзакций, обновляющих десятки и сотни тысяч строк. По идее нужен UPDATE...LIMIT
...
Рейтинг: 0 / 0
21.03.2008, 13:17
    #35205833
LeXa NalBat
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Помогите с блокировками!
ChameLe0n авторвозможно, в программе и из консоли постгрес выбрал разные планы выполненияСитуация легко воспроизводится.не понятно. что воспроизводится? можно ли например в программе заменить UPDATE на EXPLAIN ANALYZE UPDATE, чтобы увидеть план выбираемый в программе?

ChameLe0nImho при любом плане можно 1000 раз просканировать эту талицу за 40 минут.а можно ли план запроса с IN вывернуть с ног на голову так, что IN будет вычисляться для каждой строки, и например из LIMIT 500 не будет подходить? тогда потребуется 200 тысяч (столько строк в вашей таблице) последовательных сканов, каждый из которых вернет не более 500 строк, но прочитает кроме искомых еще и строки не подходящие под условия, и удаленные строки.

ChameLe0nвесь этот гемор чтобы избежать транзакций, обновляющих десятки и сотни тысяч строк. По идее нужен UPDATE...LIMITможно заменить "id_operation IN ..." на "id_operation < (SELECT id_operation FROM operations.queue WHERE state=20 AND substate=1 ORDER BY id_operation OFFSET 500 LIMIT 1)" при наличии индекса по (state,substate,id_operation)
...
Рейтинг: 0 / 0
21.03.2008, 15:08
    #35206211
ChameLe0n
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Помогите с блокировками!
Код: plaintext
не понятно. что воспроизводится? 
Воспроизводится заклинивание.. Я запускал нагрузочное тестирование и в 50-70% случаев клинило данный UPDATE до тех пор пока я не стал использовать временную таблицу
...
Рейтинг: 0 / 0
Форумы / PostgreSQL [игнор отключен] [закрыт для гостей] / Помогите с блокировками! / 7 сообщений из 7, страница 1 из 1
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]