igelko @igelko@blog.igelko.space

Быдлокодеришко на убогоньких недоязычках. Воннаби стример и любитель музыки.
Twitter Twitch Instagram
Анонсы стримов в telegram
Telegram про музыку

  • Notes
  • Followers 75
  • Following 70
  • Remote follow
Мя ��'s avatar
Мя ��
@mo@mastodon.ml

Раст меня настолько расслабил, что я даже забыла, что в других языках зачем-то бывает жёсткое разделение на expressions и statements

Почему это бесит? Потому что это та же проблема что и с цветными функциями. Ты можешь использовать expression в statement, но ни в коем случае не наоборот, иначе... жопа отвалится, вот. Нельзя, и точка

(мне очень понадобилось в триггере sqlite выполнить insert по условию, но insert это statement, и case его не жрёт)

  • permalink
  • 4 months ago
Igor U's avatar
Igor U
@igor@social.jtalk.ru

in reply to this object

@mo что-то я не понял проблему про инсерт в кейс. Разверни!

  • permalink
  • 4 months ago
Мя ��'s avatar
Мя ��
@mo@mastodon.ml

in reply to this object

@igor мне в триггере надо выполнить insert, только если предоставленное значение столбца не NULL. Ну или как-то заигнорить not null constraint violation, тоже сгодится

у меня есть табличка где жирные поля вынесены в отдельные таблицы, и слинкованы. А чтобы красиво и удобно читать и писать это, у меня есть вьюха с триггером INSTEAD OF INSERT

NULL для жирных полей пишется не отдельной строкой в отдельную таблицу, а вместо ключа-ссылки

  • permalink
  • 4 months ago
Мя ��'s avatar
Мя ��
@mo@mastodon.ml

in reply to this object

@igor (зачем выносить: чтобы навесить UNIQUE и получить доморощенную дедупликацию, т.к. значения там реально много повторяются)

  • permalink
  • 4 months ago
Мя ��'s avatar
Мя ��
@mo@mastodon.ml

in reply to this object

@igor о, кажется, это можно сделать с CTE. Изобразить new.column в виде таблицы с одной строчкой as (values (...)), и затем сделать insert into ... select ... where column not null

  • permalink
  • 4 months ago
Igor U's avatar
Igor U
@igor@social.jtalk.ru

in reply to this object

@mo sqlite не умеет делать столбец UNIQUE?

  • permalink
  • 4 months ago
Мя ��'s avatar
Мя ��
@mo@mastodon.ml

in reply to this object

@igor умеет конечно. Но мне ж как-то надо хранить повторяющиеся значения! Поэтому выкидываю их в отдельную таблицу (где навешиваю UNIQUE) и в основную пишу только id записи

  • permalink
  • 4 months ago
igelko's avatar
igelko
@igelko@blog.igelko.space

in reply to this object

@mo@mastodon.ml @igor@social.jtalk.ru @mo@mastodon.ml @igor@social.jtalk.ru а зачем размывать логику? почему не просто в коде два инсерта в разные таблицы и потом коммит транзакции?

  • permalink
  • 4 months ago
  • 2 replies
Мя ��'s avatar
Мя ��
@mo@mastodon.ml

in reply to this object

@igelko потому что так недостаточно красиво. А ещё этот код придется писать на Go

@igor

  • permalink
  • 4 months ago
Мя ��'s avatar
Мя ��
@mo@mastodon.ml

in reply to this object

@igelko ну и (имхо) разложить данные куда надо — это как раз задача базы. В конце концов, я компилировала sqlite со всеми фичами, и я буду использовать все фичи! :blobcatfireeyes:

@igor

  • permalink
  • 4 months ago
igelko's avatar
igelko
@igelko@blog.igelko.space

in reply to this object

@mo@mastodon.ml @igor@social.jtalk.ru по мне так вполне красиво - больше прозрачности в структурах данных, меньше неочевидного поведения при апдейте/делите. Но необходимость писать этот код на Go многое объясняет)

  • permalink
  • 4 months ago
  • 1 reply
Мя ��'s avatar
Мя ��
@mo@mastodon.ml

in reply to this object

@igelko а апдейтов и делитов там быть не должно, база append-only by design

@igor

  • permalink
  • 4 months ago
Igor U's avatar
Igor U
@igor@social.jtalk.ru

in reply to this object

@igelko @mo я вот тоже думаю, что, возможно, архитектура неправильная. Непонятно, конечно, что там да как. Но получается, что в основной таблице некоторые записи, к каждой привязано несколько уникальных записей из отдельной таблицы, но при этом есть повторы в основной таблице. UNIQUE по двум столбцам может тогда?

  • permalink
  • 4 months ago
Мя ��'s avatar
Мя ��
@mo@mastodon.ml

in reply to this object

@igor аэээ, нет, наоборот. В отдельной таблице уникальные записи, на каждую из которых ссылается несколько записей из основной таблицы. И это исключительно для экономии места, потому что иначе размер базы и индексов взрывается, и всё начинает ТОРМОЗИТЬ

@igelko

  • permalink
  • 4 months ago
Igor U's avatar
Igor U
@igor@social.jtalk.ru

in reply to this object

@mo @igelko ааа...

  • permalink
  • 4 months ago
Igor U's avatar
Igor U
@igor@social.jtalk.ru

in reply to this object

@mo @igelko тормозит именно sqlite? А если такое сделать на постгресс или мариадб? Не пробовали посмотреть? Интересно бы было посмотреть разницу.

  • permalink
  • 4 months ago
Мя ��'s avatar
Мя ��
@mo@mastodon.ml

in reply to this object

@igor одной из моих первых задач было переделать то, что предыдущий чел написал под постгрес на sqlite, для упрощения деплоя... :ageblobcat:

@igelko

  • permalink
  • 4 months ago
Igor U's avatar
Igor U
@igor@social.jtalk.ru

in reply to this object

@mo @igelko Я давно не работал с sqlite и у меня, возможно стереотипное, ощущение, что sqlite годится только для каких-то локальных баз внутри приложения, где не надо быстро писать/читать большие объёмы данных.

  • permalink
  • 4 months ago
igelko's avatar
igelko
@igelko@blog.igelko.space

in reply to this object

@igor@social.jtalk.ru @mo@mastodon.ml у sqlite нет проблем с объёмами и можно работать и с большой базой. У него проблемы с многопоточностью - извольте, что называется, в вашем коде это всё разрулить.

  • permalink
  • 4 months ago
  • 1 reply
Мя ��'s avatar
Мя ��
@mo@mastodon.ml

in reply to this object

@igelko если много мелких транзакций, то WAL это тоже разрулит. А вот эта оптимизация с дедупликацией это как раз попытка сделать транзакции поменбше, чтобы писать не строки, а айдишники. И она сработала %)

@igor

  • permalink
  • 4 months ago
igelko's avatar
igelko
@igelko@blog.igelko.space

in reply to this object

@mo@mastodon.ml @igor@social.jtalk.ru то есть всё уткнулось не в sqlite, а в рандомную запись на HDD (которая чудовищно медленная по современным меркам).

  • permalink
  • 4 months ago
  • 1 reply
Мя ��'s avatar
Мя ��
@mo@mastodon.ml

in reply to this object

@igelko ну, да, HDD это просто причина почему sqlite не успевал вывозить поток записи. Но сервер пересобирать ради этого никто не будет, для его основной задачи (дебиан репа) хардов за глаза, а мой сервис там дополнение

@igor

  • permalink
  • 4 months ago
Мя ��'s avatar
Мя ��
@mo@mastodon.ml

in reply to this object

@igor с момента, когда туда добавили WAL, он превратился во вполне себе производительную штуку, читатели и писатели перестали блокировать друг друга. Всё как у взрослых СУБД в общем %)

@igelko

  • permalink
  • 4 months ago
Мя ��'s avatar
Мя ��
@mo@mastodon.ml

in reply to this object

@igor а вообще да, тормозил именно sqlite. И я его понимаю, база на несколько десятков гигов[1] на HDD это.... Не то, с чем можно быстро работать

[1] во время тестовых прогонов я наблюдала до 50, но дальше sqlite начинал сыпать ERR_BUSY, и код без ретраев скипал обработку этого блока данных

@igelko

  • permalink
  • 4 months ago
Igor U's avatar
Igor U
@igor@social.jtalk.ru

in reply to this object

@mo @igelko Ну вот и проблема, получается. Писать не успевает.

  • permalink
  • 4 months ago
Мя ��'s avatar
Мя ��
@mo@mastodon.ml

in reply to this object

@igor тем не менее, если добавить примитивную ручную оптимизацию, всё он нормально успевает

@igelko

  • permalink
  • 4 months ago
Igor U's avatar
Igor U
@igor@social.jtalk.ru

in reply to this object

@mo @igelko а есть у sqlite какие-то буферы в память? Типа оперативки докинуть и не будет ERR_BUSY?

  • permalink
  • 4 months ago
Мя ��'s avatar
Мя ��
@mo@mastodon.ml

in reply to this object

@igor у sqlite есть гарантии ACID, которые требуют чтобы если транзакция успешно завершилась, то данные были сохранены на диске. Можно конечно докинуть размер WAL-файлу, но WAL это далеко не оптимальное хранилище данных, и большой лог всё ещё сильнее затормозит. Оказалось, проще написать простенький exponential backoff ретрай на пишущие операции

@igelko

  • permalink
  • 4 months ago
igelko's avatar
igelko
@igelko@blog.igelko.space

in reply to this object

@mo@mastodon.ml @igor@social.jtalk.ru это вообще не поможет, если бутылочное горлышко - финальная запись. тут только снижать количество записываемых байт через нормализацию и делать back pressure механизм.

  • permalink
  • 4 months ago
  • 1 reply
Мя ��'s avatar
Мя ��
@mo@mastodon.ml

in reply to this object

@igelko это ровно то что я и сделала. Ретраи блокировали горутину, пока база не освободится и не прожует запрос

Ну, может разве что выкидывать строчки в отдельную таблицу это не совсем нормальная форма, но нагрузку оно снижает

@igor

  • permalink
  • 4 months ago
igelko's avatar
igelko
@igelko@blog.igelko.space

in reply to this object

@igor@social.jtalk.ru @mo@mastodon.ml я бы не сказал, что неправильная. Я, например, так делать не слишком люблю, после того, как пришлось мейнтейнить систему с тыщщей хранимок и кучей сложных триггеров. Возникают разные приколы с тем, что нельзя просто так взять и сказать - какую вычислительную сложность и сколько по времени займёт та или иная операция, придётся погружаться в индексы/статистику итд. EXPLAIN работает нормально только для единичных запросов без провалов в триггеры.

  • permalink
  • interact from your instance
  • 4 months ago
Мя ��'s avatar
Мя ��
@mo@mastodon.ml

in reply to this object

Пока писала придумала workaround. Буду инсертить (потенциально пустой) результат селекта :D

  • permalink
  • 4 months ago
Мя ��'s avatar
Мя ��
@mo@mastodon.ml

in reply to this object

что значит не делить на expressions и statements? Ну например....

fn cursed() {
loop {
return if break { return return return; } else { break return }
}
return return return
}

...должно скомпилироваться (хотя я не проверяла)

(тут на самом деле бо́льшая часть кода unreachable)

  • permalink
  • 4 months ago
Мя ��'s avatar
Мя ��
@mo@mastodon.ml

in reply to this object

Вот есть люди, которые любят баш, а я люблю SQL. Офигенная головоломка, скучно точно не будет

  • permalink
  • 4 months ago
cetb's avatar
cetb
@cetb@mastodon.ml

in reply to this object

@mo так себе... и то и другое .. такая любовб может вырасти в большой геморрой, особненно если сутками в этом сидишь...

Есть и NoSQL и графы и очень много всякого - на все пропитываться любовью - чувств не хватит ))

  • permalink
  • 4 months ago
Мя ��'s avatar
Мя ��
@mo@mastodon.ml

in reply to this object

@cetb skill issue на самом деле, так-то любить можно неограниченно много вещей. Вот внимание им всем постоянно уделять вряд-ли получится, это да

  • permalink
  • 4 months ago
Мя ��'s avatar
Мя ��
@mo@mastodon.ml

in reply to this object

Итаак на следующий день я подебила эту проблему

Получился триггер с запросами такого уровня проклятости, что я ещё пожалуй подумаю прежде чем его кому-то показывать

Но я чертовски горда собой

  • permalink
  • 4 months ago
Мира The :blobcatgoogly: Lady's avatar
Мира The :blobcatgoogly: Lady
@mira_the_catgirl@mastodon.ml

in reply to this object

@mo :blobfoxpatgoogly: :neocat_hug_fox_heart:

  • permalink
  • 4 months ago
WildPowerHammer :nixOwOs:'s avatar
WildPowerHammer :nixOwOs:
@WildPowerHammer@mastodon.ml

in reply to this object

@mo
Пожалуйста, скажи мне что это не опечатка)
Я не уверен было ли это в словотворчестве, но как человек который тоже подебил проблему и не одну, я не могу не умилиться

  • permalink
  • 4 months ago
Мя ��'s avatar
Мя ��
@mo@mastodon.ml

in reply to this object

@WildPowerHammer это такое старое и широко употребимое словотворчество, что я его уже и не тегаю, а просто использую :ageblobcat:

  • permalink
  • 4 months ago
WildPowerHammer :nixOwOs:'s avatar
WildPowerHammer :nixOwOs:
@WildPowerHammer@mastodon.ml

in reply to this object

@mo
Я почему то его ооочень редко вижу и по сему забываю

  • permalink
  • 4 months ago
Powered by microblog.pub 2.0.0+dev and the ActivityPub protocol. Admin.