172 похожих чатов

У меня опять теоретический вопрос, на этот раз о кишках

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

в случае с БД, как я понял, можно делать INSERT ... ON CONFLICT UPDATE.

вопрос в следующем - движок БД поймет, что неуникальные записи не изменились и не будет ничего апдейтить, или втупую каждый раз будет аплейтить безусловно?

тупой пример:
CREATE TABLE T1 (uid primary key not null, property1 int, property2 int, property 3 int)
insert into t1 (1, 2,3,4);
insert into t1(1, 1,1,4);

при вставке второй записи естественно возникнет исключение неуникальности uid. будет ли движок БД обновлять property3, учитывая, что оно не изменилось с предидущего раза?

4 ответов

6 просмотров
Дмитрий-Бессонов Автор вопроса

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

MVCC требует хранить прошлое состояние

Новая строка будет записана с новым содержимым, даже если оно равно старому. При этом если есть индексы по обновленным полям то становится сильно хуже - в общем случае придется обновлять индексы.

Новая версия будет создаваться всегда. Но при определённых условиях, если Посгрес поймёт что старая никому не нужна и старая и новая версия окажутся на одной странице, то старая версия реюзнётся достаточно быстро. В противном случае на странице останется "дырка". Если записи на этой странице больше апдейтится не будет, то она там так и останется - никакой vacuum её не схлопнет. Т.е. у нас будет фрагментация. Поможет только vacuum full - полное переписываение таблицы. Кроме того, в Посгресе реализован hot update: если апдейт не затрагивает проиндексированные поля и новая версия попадает на одну страницу со старой, то в индексы она включаться не будет, а будет провязана в hot update цепочку. Что значительно ускоряет апдейты. Но это только если не поменялось ни одно из проиндексированных полей. Самое очевидной решение - это использовать upsert (insert ... on conflict update). Но в некоторых случаях append only табличка может действительно оказаться более эффективной.

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

Обсуждают сегодня

Какой-то там пердун в 90-х решил, что есть какая-то разная типизация. Кого вообще это волнует?
КТ315
49
void terminal_scroll() { memmove(terminal_buffer, terminal_buffer + VGA_WIDTH, buffer_size - VGA_WIDTH); memset(terminal_buffer + buffer_size - VGA_WIDTH, 0, VGA_WIDTH); ...
Егор
47
Всем привет! Подскажите, пожалуйста, в чем ошибка? Настраиваю подключение к MySQL. Либы лежат рядом с exe. Все как по "учебнику"
Евгений
16
А можете как-то проверить меня по знаниям по ассемблеру?
A A
132
Здравствуйте! У меня появилась возможность купить книгу "Изучай Haskell во имя добра!". Но я где-то слышал, что эта книга устарела. Насколько это правда??
E
22
Здравствуйте! Я вот на stepic решаю задачи на хаскеле https://stepik.org/lesson/8443/step/8?unit=1578 мой код import Data.List (isInfixOf) removing :: String -> [String] ->...
E
10
Камрады, кто тесно работал с vtv, хотел уточнить. Ширина column задаётся жёстко на этапе создания дерева или можно в рантайме ее менять программно (не мышкой)?
Ed Doc
10
да ладно ... что там неочевидного ? глянуть в исх-ки датасета и/или кверика чтобы понять в каком месте и как выполняется обращения к св-вам blablaSQL - минутное дело, даже е...
Сергей
7
Здесь для arm кто-нибудь кодит ?
Nothing
52
Всем привет, у меня есть сервер принимающий входящие HTTP подключения, как проверить, что подключение было через прокси или нет, есть какие то поля в заголовках по которым мо...
Кибер Бомж
8
Карта сайта