Перечислите и убейте все тупиковые запросы в PostgresQL

Путь D.get() включает в себя поиск атрибута и вызов метода:

>>> import dis
>>> D = {"a": 1, "b": 2, "c": 3}
>>> def gt(): return D.get('a', 1)
... 
>>> dis.dis(gt)
  1           0 LOAD_GLOBAL              0 (D)
              3 LOAD_ATTR                1 (get)
              6 LOAD_CONST               1 ('a')
              9 LOAD_CONST               2 (1)
             12 CALL_FUNCTION            2
             15 RETURN_VALUE        

Поиск атрибута (LOAD_ATTR) особенно замедляет работу.

Если вы удалите поиск атрибута (и дайте in проверить, с какой локалью работать), поле выровнено:

>>> def gt_fast(D_get=D.get): return D_get('a', 1)
... 
>>> def ef_fast(D=D): return D['a'] if 'a' in D else 1
... 
>>> timeit.timeit(gt_fast)
0.2174091339111328
>>> timeit.timeit(ef_fast)
0.2139298915863037
1
задан GMB 3 March 2019 в 23:32
поделиться

1 ответ

Как прокомментировано a_horse_with_no_name , то, что вы видите в pgadmin, это обычные блокировки, а не взаимоблокировки .

Из документации Postgres :

PostgreSQL предоставляет различные режимы блокировки для управления одновременным доступом к данным в таблицах. Эти режимы могут использоваться для управляемой приложением блокировки в ситуациях, когда MVCC не дает желаемого поведения. Кроме того, большинство команд PostgreSQL автоматически получают блокировки соответствующих режимов, чтобы гарантировать, что ссылочные таблицы не будут удалены или изменены несовместимыми способами во время выполнения команды.

Экран в pgadmin, вероятно, основан на представлении системы pg_lock .

Блокировки происходят в обычном процессе любой базы данных. Вы не хотите регулярно прерывать сеансы, которые генерируют блокировки, потому что это может по-разному повлиять на ваше приложение и базу данных. Вместо этого вы, вероятно, хотите идентифицировать (возможно, используя представление pg_lock), проанализировать и оптимизировать запросы, вызывающие проблемы.


Когда дело доходит до концепции тупика : это особая ненормальная ситуация, которая может возникнуть при использовании блокировки, когда два сеанса взаимно ожидают другого. Они обычно указывают на проблемы в логике приложения.

Большинство СУБД автоматически идентифицируют и разрешают такую ​​ситуацию блокировки, и Postgres не является исключением :

PostgreSQL автоматически обнаруживает тупиковые ситуации и разрешает их, прерывая одну из транзакции, позволяющие другим (их) завершить. (Точно, какая транзакция будет прервана, трудно предсказать, и на нее не следует полагаться.)

0
ответ дан GMB 3 March 2019 в 23:32
поделиться
Другие вопросы по тегам:

Похожие вопросы: