Size: a a a

pgsql – PostgreSQL

2020 August 20

s

suchimauz in pgsql – PostgreSQL
suchimauz
create index if not exists csco_ifndq_coifn_id__btree ON csco_ifndq using btree (coifn_id)
Кроме него
источник

s

suchimauz in pgsql – PostgreSQL
Просто я смотрю какой он красивый join делает)
источник

s

suchimauz in pgsql – PostgreSQL
На темп табличку тоже накинь
источник

K

Kosta in pgsql – PostgreSQL
Хорошо.
источник

s

suchimauz in pgsql – PostgreSQL
На фильтр через IN он у тебя 16 сек тратит, он ломается на сортировке и джойне, в теории btree на оба значения в обоих таблицах должно разогнать запрос в разы
источник

K

Kosta in pgsql – PostgreSQL
suchimauz
Просто я смотрю какой он красивый join делает)
В чем его «красота»?) мне эта задача пришла как есть вчера. Я честно не силён, но больше некому увы.
источник

s

suchimauz in pgsql – PostgreSQL
Kosta
В чем его «красота»?) мне эта задача пришла как есть вчера. Я честно не силён, но больше некому увы.
На время его исполнения если посмотреть) становится грустно:(
источник

K

Kosta in pgsql – PostgreSQL
suchimauz
На фильтр через IN он у тебя 16 сек тратит, он ломается на сортировке и джойне, в теории btree на оба значения в обоих таблицах должно разогнать запрос в разы
Спасибо, займусь минут через 30.
источник

YS

Yaroslav Schekin in pgsql – PostgreSQL
LA
Всем привет. Заливаю в UNLOGGED TABLE 150 млн строк через COPY кусками по 10к строк, с небольшой предобработкой на это уходит 12-15 часов 😵

Как бы мне ускорить этот процесс?

Мой postgres.conf вот тут (брал за основу конфиг Data Warehouse с https://pgtune.leopard.in.ua/):
https://pastebin.com/68gi1mL8
Недостаточно информации, совсем. :(
И зря у Вас там "fsync = off". Для unlogged table это ничего не даёт (даже при CHECKPOINT, насколько я помню), а вот кластер Вы потеряете, если что.
Вы бы показали, как / куда заливаете (может, проблема именно в самом этом процессе).
источник

K

Kosta in pgsql – PostgreSQL
suchimauz
На время его исполнения если посмотреть) становится грустно:(
Это да. Это ещё скоромно, до этого сатанисты пытались извлекать по 4 млн строк
источник

L

LA in pgsql – PostgreSQL
Yaroslav Schekin
Недостаточно информации, совсем. :(
И зря у Вас там "fsync = off". Для unlogged table это ничего не даёт (даже при CHECKPOINT, насколько я помню), а вот кластер Вы потеряете, если что.
Вы бы показали, как / куда заливаете (может, проблема именно в самом этом процессе).
заливаю из питона через psycopg2, демон вычитывает txt файл построчно (150 млн строк читаются за ~10 минут если вхолостую),
по поводу потери данных в курсе, но там абсолютно пустая база в этот момент, поэтому не страшно такое включать 🙂 да и данные не так важны, можно и перезапустить если что, просто хочется быстрее их вставлять в базу.

Вставляю в таблицу без индексов вот такую:
CREATE UNLOGGED TABLE domain (
   id SERIAL NOT NULL,
   tld_id INTEGER NOT NULL,
   letter VARCHAR(1) NOT NULL,
   name_servers INTEGER[] NOT NULL,
   created_at DATE DEFAULT NOW() NOT NULL,
   updated_at DATE,
   deleted_at DATE,
   domain VARCHAR(70) NOT NULL,
   PRIMARY KEY (id, letter)
) PARTITION BY LIST (letter);

CREATE UNLOGGED TABLE domain_letter_0 PARTITION OF domain FOR VALUES IN ('0');
...
CREATE UNLOGGED TABLE domain_letter_9 PARTITION OF domain FOR VALUES IN ('9');
CREATE UNLOGGED TABLE domain_letter_a PARTITION OF domain FOR VALUES IN ('a');
CREATE UNLOGGED TABLE domain_letter_b PARTITION OF domain FOR VALUES IN ('b');
...
CREATE UNLOGGED TABLE domain_letter_z PARTITION OF domain FOR VALUES IN ('z');


Всё это происходит на VPS от хетцнера, 4ГБ рам, 3 ядра, SSD, но по ресурсам я бы не сказал что упирается в потолок 🙁
источник

L

LA in pgsql – PostgreSQL
заливаю пачку на 10к строк если что вот так:

conn = self.db.raw_connection()
with conn.cursor() as cur:
   # https://www.psycopg.org/docs/cursor.html#cursor.copy_from
   cur.copy_from(
       self._bulk_domains,
       'domain',
       sep='\t',
       columns=('tld_id', 'letter', 'name_servers', 'domain'),
   )
conn.commit()
источник

s

suchimauz in pgsql – PostgreSQL
LA
заливаю пачку на 10к строк если что вот так:

conn = self.db.raw_connection()
with conn.cursor() as cur:
   # https://www.psycopg.org/docs/cursor.html#cursor.copy_from
   cur.copy_from(
       self._bulk_domains,
       'domain',
       sep='\t',
       columns=('tld_id', 'letter', 'name_servers', 'domain'),
   )
conn.commit()
Выглядит все более чем, странно
источник

L

LA in pgsql – PostgreSQL
а что именно странно? я совсем не DBA )
источник

s

suchimauz in pgsql – PostgreSQL
LA
а что именно странно? я совсем не DBA )
Я тоже)
источник

DS

Daniella Starchenko in pgsql – PostgreSQL
Привет. Не могу найти ответ на вопрос. Пусть есть бд. Есть несколько бекендов, которые хотят получить из одной таблицы данные. В таблице дофига много данных. Один запрос выполняется долго. Чтобы обеспечить множественное обращение нужно копировать записи и обращаться к копиям? ТО есть нельзя никак единовременно обратиться к одной таблице ?
источник

YS

Yaroslav Schekin in pgsql – PostgreSQL
LA
заливаю из питона через psycopg2, демон вычитывает txt файл построчно (150 млн строк читаются за ~10 минут если вхолостую),
по поводу потери данных в курсе, но там абсолютно пустая база в этот момент, поэтому не страшно такое включать 🙂 да и данные не так важны, можно и перезапустить если что, просто хочется быстрее их вставлять в базу.

Вставляю в таблицу без индексов вот такую:
CREATE UNLOGGED TABLE domain (
   id SERIAL NOT NULL,
   tld_id INTEGER NOT NULL,
   letter VARCHAR(1) NOT NULL,
   name_servers INTEGER[] NOT NULL,
   created_at DATE DEFAULT NOW() NOT NULL,
   updated_at DATE,
   deleted_at DATE,
   domain VARCHAR(70) NOT NULL,
   PRIMARY KEY (id, letter)
) PARTITION BY LIST (letter);

CREATE UNLOGGED TABLE domain_letter_0 PARTITION OF domain FOR VALUES IN ('0');
...
CREATE UNLOGGED TABLE domain_letter_9 PARTITION OF domain FOR VALUES IN ('9');
CREATE UNLOGGED TABLE domain_letter_a PARTITION OF domain FOR VALUES IN ('a');
CREATE UNLOGGED TABLE domain_letter_b PARTITION OF domain FOR VALUES IN ('b');
...
CREATE UNLOGGED TABLE domain_letter_z PARTITION OF domain FOR VALUES IN ('z');


Всё это происходит на VPS от хетцнера, 4ГБ рам, 3 ядра, SSD, но по ресурсам я бы не сказал что упирается в потолок 🙁
> да и данные не так важны, можно и перезапустить если что

Вам не перезапустить придётся, а реинциализировать кластер баз данных (initdb). Если там есть другие БД, их Вы тоже потеряете. И на все эти минусы Вы "подписались", не получая никаких плюсов, насколько я вижу. ;)

> Вставляю в таблицу без индексов вот такую:

Индекс у Вас тут есть, кстати — вот же: "PRIMARY KEY (id, letter)". Если это однократная / массовая загрузка, создать его потом может быть намного лучше.

> created_at DATE DEFAULT NOW() NOT NULL

Кстати, правильнее current_date, наверное. Ну и вообще, см. https://wiki.postgresql.org/wiki/Don%27t_Do_This про varchar(n) и работу с датой/временем.

> PARTITION BY LIST (letter);

А зачем она партиционирована, вообще (150 млн. кажется как-то мало для того, чтобы об этом даже думать)?

> Всё это происходит на VPS от хетцнера, 4ГБ рам, 3 ядра, SSD,

А какая это версия PostgreSQL? И сколько это данных получается в гигабайтах (лень считать, да и Вам виднее ;) )?
источник

s

suchimauz in pgsql – PostgreSQL
LA
заливаю из питона через psycopg2, демон вычитывает txt файл построчно (150 млн строк читаются за ~10 минут если вхолостую),
по поводу потери данных в курсе, но там абсолютно пустая база в этот момент, поэтому не страшно такое включать 🙂 да и данные не так важны, можно и перезапустить если что, просто хочется быстрее их вставлять в базу.

Вставляю в таблицу без индексов вот такую:
CREATE UNLOGGED TABLE domain (
   id SERIAL NOT NULL,
   tld_id INTEGER NOT NULL,
   letter VARCHAR(1) NOT NULL,
   name_servers INTEGER[] NOT NULL,
   created_at DATE DEFAULT NOW() NOT NULL,
   updated_at DATE,
   deleted_at DATE,
   domain VARCHAR(70) NOT NULL,
   PRIMARY KEY (id, letter)
) PARTITION BY LIST (letter);

CREATE UNLOGGED TABLE domain_letter_0 PARTITION OF domain FOR VALUES IN ('0');
...
CREATE UNLOGGED TABLE domain_letter_9 PARTITION OF domain FOR VALUES IN ('9');
CREATE UNLOGGED TABLE domain_letter_a PARTITION OF domain FOR VALUES IN ('a');
CREATE UNLOGGED TABLE domain_letter_b PARTITION OF domain FOR VALUES IN ('b');
...
CREATE UNLOGGED TABLE domain_letter_z PARTITION OF domain FOR VALUES IN ('z');


Всё это происходит на VPS от хетцнера, 4ГБ рам, 3 ядра, SSD, но по ресурсам я бы не сказал что упирается в потолок 🙁
Попробуй убрать primary key и not null везде без partition
источник

s

suchimauz in pgsql – PostgreSQL
Yaroslav Schekin
> да и данные не так важны, можно и перезапустить если что

Вам не перезапустить придётся, а реинциализировать кластер баз данных (initdb). Если там есть другие БД, их Вы тоже потеряете. И на все эти минусы Вы "подписались", не получая никаких плюсов, насколько я вижу. ;)

> Вставляю в таблицу без индексов вот такую:

Индекс у Вас тут есть, кстати — вот же: "PRIMARY KEY (id, letter)". Если это однократная / массовая загрузка, создать его потом может быть намного лучше.

> created_at DATE DEFAULT NOW() NOT NULL

Кстати, правильнее current_date, наверное. Ну и вообще, см. https://wiki.postgresql.org/wiki/Don%27t_Do_This про varchar(n) и работу с датой/временем.

> PARTITION BY LIST (letter);

А зачем она партиционирована, вообще (150 млн. кажется как-то мало для того, чтобы об этом даже думать)?

> Всё это происходит на VPS от хетцнера, 4ГБ рам, 3 ядра, SSD,

А какая это версия PostgreSQL? И сколько это данных получается в гигабайтах (лень считать, да и Вам виднее ;) )?
А, понял
источник

s

suchimauz in pgsql – PostgreSQL
Daniella Starchenko
Привет. Не могу найти ответ на вопрос. Пусть есть бд. Есть несколько бекендов, которые хотят получить из одной таблицы данные. В таблице дофига много данных. Один запрос выполняется долго. Чтобы обеспечить множественное обращение нужно копировать записи и обращаться к копиям? ТО есть нельзя никак единовременно обратиться к одной таблице ?
Привет, можно
источник