Size: a a a

pgsql – PostgreSQL

2020 August 21

K

Kosta in pgsql – PostgreSQL
Yaroslav Schekin
Так сделайте "ANALYZE csco_idesind_2008_2020;" — что-то изменится?
Если нет — можно попробовать поднять stats. target для этого поля.
да, есть прогресс небольшой

https://gist.github.com/k0nsta/7b1ee8ed5a5d73e4c0b08fe85f8a9a46
источник

YS

Yaroslav Schekin in pgsql – PostgreSQL
Kosta
ram 8
cpu 2
disk HDD
num disk 1
size DB 1TB (actually 400gb)
workload: purely analytical and large aggregation
reading tr: 80%
connections: 40
replica 0
Понятно, спасибо.
Несколько отвлекаясь от темы — Вам не кажется, что (если это всё "горячие" данные) RAM у Вас маловато для базы такого размера?
источник

K

Kosta in pgsql – PostgreSQL
нет, это не горячие данные.
источник

K

Kosta in pgsql – PostgreSQL
пока это можно назвать тестовым стендом.
источник

K

Kosta in pgsql – PostgreSQL
этf бд из 2-х таблиц занимает 65 gb
источник

K

Kosta in pgsql – PostgreSQL
но "влить" в нее в последствии планируется ~ 400gb
источник

YS

Yaroslav Schekin in pgsql – PostgreSQL
Kosta
этf бд из 2-х таблиц занимает 65 gb
И даже так — это "замечательный" cache hit где-то в 3%. :(
А cache miss "уходят" в HDD, что (особенно, с random reads) очень "больно", какой производительности тут можно хотеть в подобных запросах?
источник

YS

Yaroslav Schekin in pgsql – PostgreSQL
Kosta
пока это можно назвать тестовым стендом.
Ну ладно, а если создать покрывающие индексы прямо под этот запрос (хотя бы лучшее, чего тут можно добиться, увидим)?
источник

K

Kosta in pgsql – PostgreSQL
Yaroslav Schekin
И даже так — это "замечательный" cache hit где-то в 3%. :(
А cache miss "уходят" в HDD, что (особенно, с random reads) очень "больно", какой производительности тут можно хотеть в подобных запросах?
Хорошо, значит ли это дальнейшие попытки оптимизации подобных запросов будут лишены смысла пока «железо» не подкинуть?!
источник

K

Kosta in pgsql – PostgreSQL
Yaroslav Schekin
Ну ладно, а если создать покрывающие индексы прямо под этот запрос (хотя бы лучшее, чего тут можно добиться, увидим)?
Сейчас почитаю про покрывающие индексы и попробую сделать.
источник

YS

Yaroslav Schekin in pgsql – PostgreSQL
Kosta
Хорошо, значит ли это дальнейшие попытки оптимизации подобных запросов будут лишены смысла пока «железо» не подкинуть?!
По крайне мере, вот даже в этом запросе с диска читается примерно 22 GB, и занимает это 149 секунд:
->  Seq Scan on csco_ifndq i  (cost=0.00..6301036.60 rows=336696160 width=30) (actual time=0.510..149002.725 rows=336723160 loops=1)
     Buffers: shared hit=64 read=2934011
Для HDD — это нормальная скорость, вполне возможно. Куда Вы это время денете, если индексов не создавать (а они тоже имеют свою "цену" в плане использования диска и снижения производительности обновлений)?
Т.е. с таким железом остаётся как-то сделать так, чтобы приходилось меньше читать — для этого покрывающие индексы.
Т.е. такие, которые подходят как для выборки (под условия), так и содержат все данные, которые будет выдавать SELECT.
источник

K

Kosta in pgsql – PostgreSQL
Yaroslav Schekin
По крайне мере, вот даже в этом запросе с диска читается примерно 22 GB, и занимает это 149 секунд:
->  Seq Scan on csco_ifndq i  (cost=0.00..6301036.60 rows=336696160 width=30) (actual time=0.510..149002.725 rows=336723160 loops=1)
     Buffers: shared hit=64 read=2934011
Для HDD — это нормальная скорость, вполне возможно. Куда Вы это время денете, если индексов не создавать (а они тоже имеют свою "цену" в плане использования диска и снижения производительности обновлений)?
Т.е. с таким железом остаётся как-то сделать так, чтобы приходилось меньше читать — для этого покрывающие индексы.
Т.е. такие, которые подходят как для выборки (под условия), так и содержат все данные, которые будет выдавать SELECT.
Спасибо за разъяснение. Да и чтение explain становится более осмысленным!
источник

YS

Yaroslav Schekin in pgsql – PostgreSQL
Kosta
Сейчас почитаю про покрывающие индексы и попробую сделать.
Т.е. запрос был такой?

SELECT k.gvkey, k.datadate, i.valuei, i.item, i.effdate, i.thrudate, k.datafmt
 FROM csco_ifndq AS i
 JOIN csco_idesind_2008_2020 AS k
   ON k.coifnd_id = i.coifnd_id
WHERE k.gvkey IN (...500)
  AND k.datadate BETWEEN '2013-10-01 00:00:00' AND '2015-09-01 00:00:00'


Тогда покрывающие индексы под него какие-то такие, на первый взгляд:
CREATE INDEX ON csco_idesind_2008_2020(datadate, gvkey) INCLUDE (datafmt);
CREATE INDEX ON csco_ifndq(coifnd_id) INCLUDE (valuei, item, effdate, thrudate);

Но это, скорее, для эксперимента (и места они займут тоже прилично, по идее).
источник

K

Kosta in pgsql – PostgreSQL
Yaroslav Schekin
Т.е. запрос был такой?

SELECT k.gvkey, k.datadate, i.valuei, i.item, i.effdate, i.thrudate, k.datafmt
 FROM csco_ifndq AS i
 JOIN csco_idesind_2008_2020 AS k
   ON k.coifnd_id = i.coifnd_id
WHERE k.gvkey IN (...500)
  AND k.datadate BETWEEN '2013-10-01 00:00:00' AND '2015-09-01 00:00:00'


Тогда покрывающие индексы под него какие-то такие, на первый взгляд:
CREATE INDEX ON csco_idesind_2008_2020(datadate, gvkey) INCLUDE (datafmt);
CREATE INDEX ON csco_ifndq(coifnd_id) INCLUDE (valuei, item, effdate, thrudate);

Но это, скорее, для эксперимента (и места они займут тоже прилично, по идее).
Да, такой. Да, ща проверю )
источник

YS

Yaroslav Schekin in pgsql – PostgreSQL
Kosta
Да, такой. Да, ща проверю )
А, стоп, забыл coifnd_id в индексе для csco_idesind_2008_2020. ;)
CREATE INDEX ON csco_idesind_2008_2020(datadate, gvkey) INCLUDE (datafmt, coifnd_id);
источник

K

Kosta in pgsql – PostgreSQL
👌
источник

B

BAHR in pgsql – PostgreSQL
Привет! У меня тут дурацкий вопрос. Можно ли средствами бд ограничить размер таблицы??? То есть у нас есть таблица, которую мы по тихоньку заполняем данными, но при этом когда данных становится больше 1000 строк, что-бы при внесении следующей строки автоматом удалилась самая первая??? Ткните пожалуйста в какую сторону капать:)
источник

D

Denis in pgsql – PostgreSQL
BAHR
Привет! У меня тут дурацкий вопрос. Можно ли средствами бд ограничить размер таблицы??? То есть у нас есть таблица, которую мы по тихоньку заполняем данными, но при этом когда данных становится больше 1000 строк, что-бы при внесении следующей строки автоматом удалилась самая первая??? Ткните пожалуйста в какую сторону капать:)
триггер написать
источник

СГ

Сергей Голод... in pgsql – PostgreSQL
BAHR
Привет! У меня тут дурацкий вопрос. Можно ли средствами бд ограничить размер таблицы??? То есть у нас есть таблица, которую мы по тихоньку заполняем данными, но при этом когда данных становится больше 1000 строк, что-бы при внесении следующей строки автоматом удалилась самая первая??? Ткните пожалуйста в какую сторону капать:)
в сторону определения "самая первая"
источник

K

Kosta in pgsql – PostgreSQL
Yaroslav Schekin
Т.е. запрос был такой?

SELECT k.gvkey, k.datadate, i.valuei, i.item, i.effdate, i.thrudate, k.datafmt
 FROM csco_ifndq AS i
 JOIN csco_idesind_2008_2020 AS k
   ON k.coifnd_id = i.coifnd_id
WHERE k.gvkey IN (...500)
  AND k.datadate BETWEEN '2013-10-01 00:00:00' AND '2015-09-01 00:00:00'


Тогда покрывающие индексы под него какие-то такие, на первый взгляд:
CREATE INDEX ON csco_idesind_2008_2020(datadate, gvkey) INCLUDE (datafmt);
CREATE INDEX ON csco_ifndq(coifnd_id) INCLUDE (valuei, item, effdate, thrudate);

Но это, скорее, для эксперимента (и места они займут тоже прилично, по идее).
если железа выделят побольше, партиционность таблиц поможет? тк сейчас в качестве эксперимента csco_idesind_2008_2020 это кусок csco_idesind, а там данные с 1993 года, если с ней начать работы...
источник