Size: a a a

pgsql – PostgreSQL

2021 February 13

D

Dmitriy in pgsql – PostgreSQL
Mikhail Smolnikov
Спасибо огромное))
@dbalashov @dimuska139
Не за что. Про внешние ключи не забудь.
источник

MS

Mikhail Smolnikov in pgsql – PostgreSQL
Dmitriy
Не за что. Про внешние ключи не забудь.
Пошел читать уже)
источник

VY

Victor Yegorov in pgsql – PostgreSQL
Mikhail Smolnikov
Пошел читать уже)
хочу предупредить, что суррогатные ключи допускают наличие дубликатов в бизнес-данных.
источник

MS

Mikhail Smolnikov in pgsql – PostgreSQL
Victor Yegorov
хочу предупредить, что суррогатные ключи допускают наличие дубликатов в бизнес-данных.
Наличие дубликатов в бизнес-данных..
Грубо говоря есть вероятность того, что у одного юзера могут быть две повторяющихся строки с данными?
Просто навесить дополнительную проверку в бизнес логике?
источник

KK

Konstantin Knizhnik in pgsql – PostgreSQL
Viktor Grigorev
https://www.db-fiddle.com/f/cctTtuS3sSizzyTxTGn6iF/1 - как можно интерпретировать результаты эксплейна

Buffers: shared hit=22 в запросе, который достает только 10 строк и
Buffers: shared hit=3 в запросе, который достает 100 строк ?

Buffers hit - это абстрактная метрика вроде cost-ов, которые нельзя напрямую сравнивать?
buffer hits - это не абстрактная метрика. Это совершенно конкретная величина - сколько страниц мы достали из shared buffers Т.е. если написано
Buffers: shared hit=22 read=2
значит 22 страницы мы нашли в шаред памяти. а 2 прочитали.
С тем сколько мы достали строк это  напрямую не связано: нам могло понадобиться прочитать много страниц индекса, чтобы добраться до одной записи
источник

VY

Victor Yegorov in pgsql – PostgreSQL
Mikhail Smolnikov
Наличие дубликатов в бизнес-данных..
Грубо говоря есть вероятность того, что у одного юзера могут быть две повторяющихся строки с данными?
Просто навесить дополнительную проверку в бизнес логике?
10-Вася-Пупкин-активный
11-Вася-Пупкин-активный
источник

VG

Viktor Grigorev in pgsql – PostgreSQL
Yaroslav Schekin
В приведённых запросах:
. "WHERE id < 100" — это один проход от корня индекса до страницы (все эти записи на одной):  metapage; root → leaf.
. "WHERE id IN (1, 2, 3, 4, 5, 6, 7, 8, 9 ,10)" — десять таких проходов (да, от корня), каждое "касание" страницы, кроме metapage (потому что она действительно просматривается один раз), считается.

(поправил)
спасибо
источник

VG

Viktor Grigorev in pgsql – PostgreSQL
Konstantin Knizhnik
buffer hits - это не абстрактная метрика. Это совершенно конкретная величина - сколько страниц мы достали из shared buffers Т.е. если написано
Buffers: shared hit=22 read=2
значит 22 страницы мы нашли в шаред памяти. а 2 прочитали.
С тем сколько мы достали строк это  напрямую не связано: нам могло понадобиться прочитать много страниц индекса, чтобы добраться до одной записи
меня смутило, что это скорее всего те же самые страница/ы, но по несколько раз. Звучит, будто достать 10 записей по id (пусть и на одной странице) может быть дольше, чем 100 подряд
источник

MS

Mikhail Smolnikov in pgsql – PostgreSQL
Victor Yegorov
10-Вася-Пупкин-активный
11-Вася-Пупкин-активный
Как этого избежать?
Проверить что данные уже имеются? Или можно повесить if not exists с созданием таблиц?
источник

Н

Неъматжон in pgsql – PostgreSQL
Mikhail Smolnikov
Как этого избежать?
Проверить что данные уже имеются? Или можно повесить if not exists с созданием таблиц?
Тут сложнее... Допустим, есть два -Вася Пупкина....
источник

VY

Victor Yegorov in pgsql – PostgreSQL
Viktor Grigorev
меня смутило, что это скорее всего те же самые страница/ы, но по несколько раз. Звучит, будто достать 10 записей по id (пусть и на одной странице) может быть дольше, чем 100 подряд
а так и есть, больше операций, к большеу кол-ву блоков обращаемся. они, скорее всего, будут в кэше и разница будет малозначительной
источник

MS

Mikhail Smolnikov in pgsql – PostgreSQL
Неъматжон
Тут сложнее... Допустим, есть два -Вася Пупкина....
Нет, тут у меня у каждого юзера 100% различные id
Речь о телеграм пользователях, где primary key я беру chat_id, создаваемый самим телеграмом
источник

VY

Victor Yegorov in pgsql – PostgreSQL
Mikhail Smolnikov
Как этого избежать?
Проверить что данные уже имеются? Или можно повесить if not exists с созданием таблиц?
обычно вешают дополнительный Unique Key на бизнес данные, типа уникальное имя, или там номер паспорта…
источник

MS

Mikhail Smolnikov in pgsql – PostgreSQL
Даже если сделать два одинаковых имени, id будут разными
источник

MS

Mikhail Smolnikov in pgsql – PostgreSQL
Victor Yegorov
обычно вешают дополнительный Unique Key на бизнес данные, типа уникальное имя, или там номер паспорта…
user_data_id в связывающей таблице?
источник

Н

Неъматжон in pgsql – PostgreSQL
Mikhail Smolnikov
Нет, тут у меня у каждого юзера 100% различные id
Речь о телеграм пользователях, где primary key я беру chat_id, создаваемый самим телеграмом
Разговор был про бизнес данных. А id это не бизнес данный :))
источник

KK

Konstantin Knizhnik in pgsql – PostgreSQL
Viktor Grigorev
меня смутило, что это скорее всего те же самые страница/ы, но по несколько раз. Звучит, будто достать 10 записей по id (пусть и на одной странице) может быть дольше, чем 100 подряд
Вообще говоря это справедливо. Ну может там не такое соотношение (10 к 100). Но обращение к странице в шаред буферах ес-но не бесплатно.  Это хорошо видно по index only scan. В ноде IOS пинится 1 страница visibility map-а, по которой проверяется видимость записи. 1 страница мапа покрывает пол гига. Если табличка больше, то скорость IOS резко проседает. Если увеличить число запинненых страниц, то эту границу можно отодвинуть.
источник

MS

Mikhail Smolnikov in pgsql – PostgreSQL
Неъматжон
Разговор был про бизнес данных. А id это не бизнес данный :))
Так
Видимо я чего-то не понимаю))

У меня есть некоторые функции, которые работают с ORM либой (ЯП не имеет значения), чтобы связываться с бд на постгресе
Если мне нужно получить данные определенного пользователя, я вызываю функцию, передавая ей ид этого человека.
При создании нового пользователя я проверяю на наличие такого же user_id в таблице

На каком из этапов может появиться дубликат?
источник

Н

Неъматжон in pgsql – PostgreSQL
Mikhail Smolnikov
Так
Видимо я чего-то не понимаю))

У меня есть некоторые функции, которые работают с ORM либой (ЯП не имеет значения), чтобы связываться с бд на постгресе
Если мне нужно получить данные определенного пользователя, я вызываю функцию, передавая ей ид этого человека.
При создании нового пользователя я проверяю на наличие такого же user_id в таблице

На каком из этапов может появиться дубликат?
Дубликаты id не появляются.. Появляются разные user ы одинаковыми ФИО. Так что, можно не обращать внимания.
источник

MS

Mikhail Smolnikov in pgsql – PostgreSQL
Неъматжон
Дубликаты id не появляются.. Появляются разные user ы одинаковыми ФИО. Так что, можно не обращать внимания.
Хорошо, надеюсь с этим проблем не будет))
источник