[Закрываются] скрытые функции PostgreSQL

Используйте list понимание с map. (Кстати, то, что внутри вашего list называется dict):

[d for d in a if d.get('name') not in list(map(lambda x:x.get('name'), b))]
# [{'age': 33, 'name': 'joseph'}]

Объяснение:

  • list(map(lambda x:x.get('name'), b)): получает все имя из b
  • d.get('name') not in: проверяет, существует ли имя из a в b. (т.е. появляются только в первом списке)
79
задан Community 23 May 2017 в 11:46
поделиться

11 ответов

Так как postgres намного более вменяемый, чем MySQL, не так много "хитростей", о которых можно сообщить ;-)

В руководстве есть несколько полезных советов по производительности .

Несколько других вещей, связанных с производительностью, которые следует иметь в виду:

  • Убедитесь, что автоочистка включена
  • . уверен, что вы прошли через ваш postgres.conf (эффективный размер кэша, общие буферы, рабочая память ... множество параметров для настройки).
  • Используйте pgpool или pgbouncer , чтобы сохранить «реальный» минимальное количество подключений к базе данных
  • Узнайте, как работает EXPLAIN и EXPLAIN ANALYZE. Научитесь читать вывод.
  • CLUSTER сортирует данные на диске по индексу. Может значительно улучшить производительность больших (в основном) таблиц только для чтения. Кластеризация - это разовая операция: когда таблица впоследствии обновляется, изменения не кластеризуются.

Вот несколько полезных вещей, которые сами по себе не связаны с конфигурацией или производительностью.

Чтобы увидеть, что происходит в данный момент:

select * from pg_stat_activity;

Функции поиска разного:

select * from pg_proc WHERE proname ~* '^pg_.*'

Найти размер базы данных:

select pg_database_size('postgres');
select pg_size_pretty(pg_database_size('postgres'));

Найти размер всех баз данных:

select datname, pg_size_pretty(pg_database_size(datname)) as size
  from pg_database;

Найти размер таблиц и индексов:

select pg_size_pretty(pg_relation_size('public.customer'));

Или, чтобы вывести список всех таблиц и индексов (вероятно, это проще сделать из этого):

select schemaname, relname,
    pg_size_pretty(pg_relation_size(schemaname || '.' || relname)) as size
  from (select schemaname, relname, 'table' as type
          from pg_stat_user_tables
        union all
        select schemaname, relname, 'index' as type
          from pg_stat_user_indexes) x;

Да, и вы можете вкладывать транзакции, откат частичные транзакции ++

test=# begin;
BEGIN
test=# select count(*) from customer where name='test';
 count 
-------
     0
(1 row)
test=# insert into customer (name) values ('test');
INSERT 0 1
test=# savepoint foo;
SAVEPOINT
test=# update customer set name='john';
UPDATE 3
test=# rollback to savepoint foo;
ROLLBACK
test=# commit;
COMMIT
test=# select count(*) from customer where name='test';
 count 
-------
     1
(1 row)
75
ответ дан 24 November 2019 в 10:09
поделиться
  • My by far favorite is generate_series: at last a clean way to generate dummy rowsets.
  • Ability to use a correlated value in a LIMIT clause of a subquery:

    SELECT (
     SELECT exp_word
     FROM mytable
     OFFSET id
     LIMIT 1
     )
    FROM othertable
    
  • Возможность использовать несколько параметров в пользовательских агрегатах (не рассматривается в документации): см. статью в моем блоге для примера.
12
ответ дан 24 November 2019 в 10:09
поделиться

COPY

I'll start. Whenever I switch to Postgres from SQLite, I usually have some really big datasets. The key is to load your tables with COPY FROM rather than doing INSERTS. See documentation:

http://www.postgresql.org/docs/8.1/static/sql-copy.html

The following example copies a table to the client using the vertical bar (|) as the field delimiter:

COPY country TO STDOUT WITH DELIMITER '|';

To copy data from a file into the country table:

COPY country FROM '/usr1/proj/bray/sql/country_data';

See also here: Faster bulk inserts in sqlite3?

15
ответ дан 24 November 2019 в 10:09
поделиться

The easiest trick to let postgresql perform a lot better (apart from setting and using proper indexes of course) is just to give it more RAM to work with (if you have not done so already). On most default installations the value for shared_buffers is way too low (in my opinion). You can set

shared_buffers

in postgresql.conf. Divide this number by 128 to get an approximation of the amount of memory (in MB) postgres can claim. If you up it enough this will make postgresql fly. Don't forget to restart postgresql.

On Linux systems, when postgresql won't start again you will probably have hit the kernel.shmmax limit. Set it higher with

sysctl -w kernel.shmmax=xxxx

To make this persist between boots, add a kernel.shmmax entry to /etc/sysctl.conf.

A whole bunch of Postgresql tricks can be found here:

23
ответ дан 24 November 2019 в 10:09
поделиться

pgcrypto : больше криптографических функций, чем предоставляют криптомодули многих языков программирования, все они доступны непосредственно из базы данных. Это делает криптографический материал невероятно простым для Just Get Right.

3
ответ дан 24 November 2019 в 10:09
поделиться
select pg_size_pretty(200 * 1024)
4
ответ дан 24 November 2019 в 10:09
поделиться

Одна из вещей, которые мне действительно нравятся в Postgres, - это некоторые типы данных, поддерживаемые в столбцах. Например, существуют типы столбцов, предназначенные для хранения сетевых адресов и массивов . Соответствующие функции ( Сетевые адреса / Массивы ) для этих типов столбцов позволяют выполнять множество сложных операций внутри запросов, которые вам придется выполнять, обрабатывая результаты с помощью кода в MySQL или другие базы данных.

9
ответ дан 24 November 2019 в 10:09
поделиться

Postgres обладает очень мощным средством обработки даты и времени благодаря поддержке INTERVAL.

Например:

select NOW(), NOW() + '1 hour';
              now              |           ?column?            
-------------------------------+-------------------------------
 2009-04-18 01:37:49.116614+00 | 2009-04-18 02:37:49.116614+00
(1 row)



select current_date ,(current_date +  interval '1 year')::date;
    date             |  date            
---------------------+----------------
 2014-10-17          | 2015-10-17
(1 row)

You может привести много строк к типу INTERVAL.

17
ответ дан 24 November 2019 в 10:09
поделиться

Материализованные представления довольно легко настроить:

CREATE VIEW my_view AS SELECT id, AVG(my_col) FROM my_table GROUP BY id;
CREATE TABLE my_matview AS SELECT * FROM my_view;

Это создает новую таблицу my_matview со столбцами и значениями my_view. Затем можно настроить триггеры или сценарий cron, чтобы поддерживать данные в актуальном состоянии, или, если вы ленивы:

TRUNCATE my_matview;
INSERT INTO my_matview SELECT * FROM my_view;
6
ответ дан 24 November 2019 в 10:09
поделиться

Perl DBI с использованием DBD:: AnyData

-121--2652693-

Массивы действительно классные, как только вы познакомитесь с ними. Допустим, вы хотите сохранить несколько гиперссылок между страницами. Вы можете начать с мысли о создании таблицы вроде того:

CREATE TABLE hyper.links (
     tail INT4,
     head INT4
);

Если бы вам нужно было индексировать столбец хвоста , и у вас были, скажем, 200 000 000 ссылки-строки (как википедия дала бы вам), вы бы оказались с огромной таблицей и огромным индексом.

Однако, с PostgreSQL, вы могли бы использовать этот формат таблицы вместо:

CREATE TABLE hyper.links (
     tail INT4,
     head INT4[],
     PRIMARY KEY(tail)
);

Чтобы получить все головки для ссылки вы могли бы отправить команду, как это (unnest () является стандартным с 8,4):

SELECT unnest(head) FROM hyper.links WHERE tail = $1;

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

Примечание. Если функция unnest () создает строки из массива, функция array_agg () агрегирует строки в массив.

8
ответ дан 24 November 2019 в 10:09
поделиться
  • Inheritance..infact Множественное наследование (как в "наследовании" родитель-потомок, а не наследовании отношения 1: 1, которое многие веб-фреймворки реализуют при работе с postgres).

  • PostGIS (пространственное расширение), замечательное дополнение, которое предлагает полный набор геометрических функций и хранение координат прямо из коробки. Широко используется во многих географических библиотеках с открытым исходным кодом (например, OpenLayers, MapServer, Mapnik и т. Д.) И определенно лучше, чем пространственные расширения MySQL.

  • Процедуры написания на разных языках, например, C, Python, Perl и т. Д. (Упрощает программирование, если вы разработчик, а не администратор базы данных).

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

  • Огромный и исчерпывающий каталог всех объектов, реализованных в вашей базе данных (т.е. таблиц, ограничений, индексов и т. Д.).

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

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

    http://www.alberton.info/postgresql_meta_info.html

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

6
ответ дан 24 November 2019 в 10:09
поделиться
Другие вопросы по тегам:

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