Вы видите копию треда, сохраненную 1 августа 2021 года.
Скачать тред: только с превью, с превью и прикрепленными файлами.
Второй вариант может долго скачиваться. Файлы будут только в живых или недавно утонувших тредах. Подробнее
Если вам полезен архив М.Двача, пожертвуйте на оплату сервера.
Туториалы на русском для тех, кто не умеет гуглить, не может в английский и вообще готов жрать что угодно:
SQL:
- MySQL, Postgres, SQL Server: https://metanit.com/sql/
- Синтаксис SQL кратко: https://learnxinyminutes.com/docs/ru-ru/sql-ru/
- Плейлисты по разным СУБД: https://www.youtube.com/c/SQLDeveloperBI/playlists
- Тоже плейлист, сортировка хуёвая: https://www.youtube.com/watch?v=EHvzvwAv7RU&list=PLY7PmJJFH5nT-lbFKxfbp3rw5BBuq5Azo[РАСКРЫТЬ][РАСКРЫТЬ]
- https://www.youtube.com/c/SQLDeveloperBI
NoSQL:
- MongoDB: https://metanit.com/nosql/mongodb/
- Cassandra: https://proselyte.net/tutorials/cassandra/
На инглише:
SQL:
- https://www.w3schools.com/sql/
Литература:
- Прибыл Фейерштейн. Oracle PL/SQL. Для профессионалов - если уметь исказть, можно найти бесплатно без СМС и на русском.
- Алан Бьюли. Изучаем SQL. - про MySQL, тоже легко находится. Довольно старая, но базовые вещи не сильно меняются.
- К. Дж. Дейт. Введение в системы баз данных - талмуд на овер 1000 страниц.
- Томас Кайт. Oracle для профессионалов - тоже талмуд.
Задачки для оттачивания sql-скилов:
- https://www.sql-ex.ru
- http://sql-tutorial.ru/
- https://www.codewars.com/?language=sql
ETL, OLAP, DWH и другие умные слова:
- https://www.youtube.com/watch?v=WPZuzDJXs-Q&list=PLhhjwMYxzolhP29LSPPwORVQxJX5OjYix[РАСКРЫТЬ][РАСКРЫТЬ]
- OLAP DAX Power BI: https://www.youtube.com/playlist?list=PLhhjwMYxzolhXuySjLR2_n-xb6VvWnjju
Прочее:
- https://dbdb.io/
- https://db.cs.cmu.edu/
- https://www.youtube.com/channel/UCHnBsf2rH-K7pn09rb3qvkA/playlists
- Сравнение диалектов SQL: http://troels.arvin.dk/db/rdbms/
- Как БД работают изнутри: https://habr.com/ru/company/mailru/blog/266811/
FAQ:
Q: Нужно ли знать английский?
A: Да.
Q: Что лучше, SQL или NoSQL?
A: Как обычно, зависит от задач. Нужна любой ценой скорость - бери NoSQL, нужна согласованность данных - SQL. У всего свои плюсы и минусы, и в обозримом будущем ни один подход не заменит другой полностью.
Q: Вопросы с лабами и задачками
A: Смело спрашивай, с вероятностью больше 50% ответят, но могут и обоссать.
Здесь мы:
- Негодуем, почему шапка - говно, и предлагаем коллективному ОПу идеи, как её улучшить.
- Разбираемся, почему PostgreSQL - не Oracle
- Пытаемся понять, зачем нужен Тырпрайс, если есть бесплатный опенсурс
- Обсуждаем, какие новые тенденции хранения данных появляются в современном цифровом обеществе
- Решаем всем тредом лабы для заплутавших студентов и задачки с sql-ex для тех, у кого завтра ПЕРВОЕ собеседование
- Анализируем, как работает поиск вконтакте
- И просто хорошо проводим время, обсирая чужой код, не раскрывая, как писать правильно
Типа
SELECT some(title) -- похуй какой, любой существующий сойдет
FROM projects
GROUP BY department_id
Понятно, что можно взять min/max. Но зачем лишняя сортировка, если похуй.
>>052417 (Del)
Не, в постгресе тогда нужно это поле включать в GROUP BY, иначе он не знает, какое значение брать.
https://stackoverflow.com/questions/3800551/select-first-row-in-each-group-by-group
Там, вроде, кроме min/max предлагают другие решения.
Обычно в бэкенде, есть у тебя некая серверная приложуха на каком-нибудь фреймворке, и надо где-то хранить данные. Иногда там не голый SQL, а всякие ORM или вообще говно-nosql.
Бывает и не бэкенд, какие-нибудь скрипты для ETL/OLAP/машинного обучения, либо десктопные/мобильные приложения с небольшой встроенной БД.
Ну там все какое-то извращение.
DISTINCT ON действительно берет первый попавшийся. Но если хочешь сортировку результатов, то придется ставить первым полем в сортировке то которое в дистинкт. А это нахуй делает его ненужным.
Точка входа слишком хитрая, потому что все под ДЕ понимают разные вещи. По крайней мере, огромная разница между странами. У нас это дрочево кафок спарков и хуйвов, довольно бессмысленное и адхоковое, вынужден заметить. В Европках и Штатах это продолжение BI, поэтому начинается с Dimensional Modelling, шкуэль, вот это все.
Я бы наверн советовал начинать с обмазывания Кимбалом-Росс, и только потом хардскиллы про конкретные фреймворки. Но мапредьюс наверное стоит в деталях разобрать (вплоть до верхнеуровневых реализаций отдельных частей) параллельно с первым пунктом, потому что по нему тебя будут собеседовать в рашке. Поэтому тут неплохо посмотреть какой-нибудь курс про распределенные вычисления и кишки БД.
Платят кстати ДЕ заебца, и херочки каждый день в линке пишут.
A join B это операция над множествами. С точки зрения пользователя и конечного результата.
При этом в кишочках реляционной базы эта операция происходит построчно, но в этом нет никакого противоречия.
курсор это костыль для веб макак
Понял, спасибо.
Middle data engineer
Ну мы же sql тхереде? DBA, аналитик, или ещё какое-нибудь говно где основная занятость ковыряться в sql.
>- Алан Бьюли. Изучаем SQL. - про MySQL, тоже легко находится. Довольно старая, но базовые вещи не сильно меняются.
Третье издание - 2020 год, ничего не старая. С ультимативной HD-лягухой на обложке.
Продублирую сюда, не все же ньюфаг-тред отслеживают.
Надо сделать в цикле а=а+1. Так не работает. Как надо? Язык - plpgsql
Ты не задаешь значение суммы в начале, а 1 + null внезапно равно null. Очень плохо, очень стыдно, не надо тебе в айти.
А где не так? Ты прибавляешь к единице "хуй знает что" и очевидно, что и конечный результат будет "хуй знает что". Потому что ты не можешь утверждать, что "хуй знает что" == 0.
Извините, я великий программист, а не макака, в моих языках все правильно и логично.
У нас в go переменные при инициализации получают значение по-умолчанию, то есть определенное для своего типа нулевое значение. И вот так делать не надо. Спасибо, заработало.
Я изучаю работу с переменными на первом примере, который пришел на ум.
Обращайся, извини за грубость.
но я не знаю,как на пхп сделать эту фичу на каждого пользователя
А кто тебя знает, куда ты его установил, поищи папку MySQL в обеих program files.
Речь идет о запросах вида
select from ((select from t1) any left join (select * from t2)) using id
Так и знал, что обезьяна съест звездочки.
select Ж from ((select Ж from t1) any left join (select Ж from t2)) using id
А все, нашел
В папке, которую ты нашёл, лежит mysql.exe? Именно эту папку ты добавил в PATH?
Это жжж неспроста.
select ⚹ from ((select ⚹ from t1) any left join (select ⚹ from t2)) using id
А ещё учитывая что нужен поиск по сообщениями.
Все, я просто в путь мускл.ехе добавил
Пиздец потом таки дауничи рассказывают как в линупсе все заебись а венда маздай. сосноль то хоть открыл заново после того как path изменил?
Почему нет? Заебись ложится на реляционность. Поиск есть искаропки или сторонние движки.
Тот же скупик в скулайте хранит, другие вполне возможно что тоже.
Каких нет? Что если исполняемый файл не в path система что ли из сральни его достанет?
Зато есть танкер своих вроде того что надо всю систему обновить целиком чтобы последнюю версию чего либо поставить и все равно все будет устаревшее потому что у дауничей все на все завязано через общие библиотеки - а винде таких проблем нет ставишь что хочешь и мозг себе не ебешь. Алсо у прыщедаунов даже . в path нет; и каждый пук надо через sudo делать - прыщебезопасность.
>а винде таких проблем нет ставишь что хочешь и мозг себе не ебешь
Ну я как видишь не могу запустить даже базу данных после прописки в патч, в терминале это делается и запускается одной командой
А, точно, спасибо зарабатало
Продолжение.
Почему первый вариант работает, а второй выдает null? Значение переменной не передается за область видимости цикла?
То же самое. Только сигнатуру надо переписать с такой
create or replace function sum_price() returns setof products.price%TYPE
на такую
create or replace function sum_price() returns products.price%TYPE
Работа не связана с БД как таковыми. Я что-то типа техлида в саппорте одной айти-компании, и мои навыки позволяют мне вытягивать отдел из дерьма выполнять всякую черновую работу других отделов в обход обсосных спринтов, которые распланированы на месяц вперед. Наговнокодить какой-нибудь сервис, автоматизировать какую-то поебень - сейчас потихоньку перетягиваю на себя аналитику, потому что сейчас ждать выполнение таска от аналитика - буквально месяц, а сидеть ждать не можем себе позволить. Из БД там мускуль 5.7 в проде, все логи приложений идут в КХ, техническое логирование - сентри, мониторинг - кибаны, елк и еще куча всего, хз что там еще у админов, не разбирался. Так что с КХ просто "повезло", причем судя по слаковым каналам, где админы обсужают инфраструктуру, КХ - пиздец в плане оперирования. Аналитики, неосторожные джоины и прочее постоянно кладут продовый кластер по памяти. Недавно аналитики еще приходили реквестировать апгрейд до новой версии, в которой добавили оконные функции, но техдир их послал нахуй с таким запросом, лал. При этом я ни разу не видел подобных жалоб, пока логи просто лежали в S3 и доставались самописной консольной тулзой из-под ssh.
Бабы нет. Я шизоид, и мне не очень интересны сексуальные контакты. ЗП 120, договорились, что поднимут до 150, когда сдам проект.
Формально - потому что я не разработчик, чтобы мне башляли 300к/наносек. А так, руководство устраивает хуй пойми какие махинации, и по документам я прохожу, как менеджер поддержки, и они не хотят моей зарплатой завышать рыночную вилку. Ну и такой вещи, как индексация, у нас нет. Пока босс не отвалит бабок - больше получать не будешь. А чтобы босс отвалил, надо пососать-полизать, либо закрыть какой-нибудь полезный для компании проект.
SET NOCOUNT ON
DECLARE @Err INT
DECLARE @tDatabaseName VARCHAR(55)
DECLARE @CmdStr VARCHAR(300)
DECLARE @tResult TABLE (Error INT, Level INT, State INT, MessageText VARCHAR(7000),RepairLevel INT,Status INT,DbId INT,ObjectId INT,IndexId INT,PartitionId INT, AllocUnitId INT, [File] INT,Page INT,Slot INT,RefFile INT,RefPage INT,RefSlot INT, Allocation INT)
SET @tDatabaseName = 'Database_Test'
PRINT '=========================================================================================================='
PRINT 'Шаг №4. Проверка тестовой БД после восстановления. Step_id = 4'
PRINT CAST(getdate() AS VARCHAR) + ' Старт процесса проверки тестовой БД.'
SET @CmdStr = 'DBCC CHECKDB('''+@tDatabaseName+''') WITH TABLERESULTS'
INSERT INTO @tResult EXEC (@CmdStr)
SELECT TOP 1 @CmdStr = MessageText FROM (SELECT TOP 2 * FROM @tResult ORDER BY ObjectID Desc) AS t1 ORDER BY ObjectID ASC
IF CHARINDEX('CHECKDB обнаружил 0 ошибок размещения и 0 ошибок согласованности',@CmdStr)>0
BEGIN
PRINT CAST(getdate() AS VARCHAR) + ' Проверка тестовой БД прошла успешно. Резервную копию можно переносить на внешний носитель.'
END
ELSE
BEGIN
PRINT CAST(getdate() AS VARCHAR) + ' При проверке тестовой БД командой DBCC CHECKDB обнаружены ошибки!'
PRINT CAST(getdate() AS VARCHAR) + @CmdStr
PRINT CAST(getdate() AS VARCHAR) + ' Резервную копию переносить нельзя!'
SET @Err = 1/0
END
PRINT CAST(getdate() AS VARCHAR) + ' Завершен процесс проверки тестовой БД.'
Как я понял, скрипт при проверке берет содержимое из последней строки таблицы, если совпало с IF CHARINDEX = успешно, не совпало - не успешно.
В таком виде всегда выпадает в Fail
Только вот я не понял, что писать в строке IF CHARINDEX, чтобы отрабатывало успешно?
SET NOCOUNT ON
DECLARE @Err INT
DECLARE @tDatabaseName VARCHAR(55)
DECLARE @CmdStr VARCHAR(300)
DECLARE @tResult TABLE (Error INT, Level INT, State INT, MessageText VARCHAR(7000),RepairLevel INT,Status INT,DbId INT,ObjectId INT,IndexId INT,PartitionId INT, AllocUnitId INT, [File] INT,Page INT,Slot INT,RefFile INT,RefPage INT,RefSlot INT, Allocation INT)
SET @tDatabaseName = 'Database_Test'
PRINT '=========================================================================================================='
PRINT 'Шаг №4. Проверка тестовой БД после восстановления. Step_id = 4'
PRINT CAST(getdate() AS VARCHAR) + ' Старт процесса проверки тестовой БД.'
SET @CmdStr = 'DBCC CHECKDB('''+@tDatabaseName+''') WITH TABLERESULTS'
INSERT INTO @tResult EXEC (@CmdStr)
SELECT TOP 1 @CmdStr = MessageText FROM (SELECT TOP 2 * FROM @tResult ORDER BY ObjectID Desc) AS t1 ORDER BY ObjectID ASC
IF CHARINDEX('CHECKDB обнаружил 0 ошибок размещения и 0 ошибок согласованности',@CmdStr)>0
BEGIN
PRINT CAST(getdate() AS VARCHAR) + ' Проверка тестовой БД прошла успешно. Резервную копию можно переносить на внешний носитель.'
END
ELSE
BEGIN
PRINT CAST(getdate() AS VARCHAR) + ' При проверке тестовой БД командой DBCC CHECKDB обнаружены ошибки!'
PRINT CAST(getdate() AS VARCHAR) + @CmdStr
PRINT CAST(getdate() AS VARCHAR) + ' Резервную копию переносить нельзя!'
SET @Err = 1/0
END
PRINT CAST(getdate() AS VARCHAR) + ' Завершен процесс проверки тестовой БД.'
Как я понял, скрипт при проверке берет содержимое из последней строки таблицы, если совпало с IF CHARINDEX = успешно, не совпало - не успешно.
В таком виде всегда выпадает в Fail
Только вот я не понял, что писать в строке IF CHARINDEX, чтобы отрабатывало успешно?
Следующий перекат только в конце лета, тогда можно добавить.
Уходи.
нет, он запускает chkedb, и если вернул ошибку %%ты пидор%. Там селект не из таблицы, а из результата выполнения.
А где вопрос то?
Чесно говоря говно какое-то, просто понапиханы все технологии, это не дата инженер, а осьминог ебанный какой-то. И самое главное, не одна из схем не обьясняет чем он собственно занимается
>
Тащемта, эти роадмапы сейчас любые стали делать как говно.
Пихают все что есть лишь бы раздуть на несколько экранов.
Здесь явно что-то с областью видимости цикла, но я не нахожу этого в документации.
Могу разве что экстраполировать свой бесконечный опыт с другими базами и сказать, что null значения не учитываются в индексе.
Удивлен, что null и пустой массив в этом случае не одно и то же.
Ну на самом деле null в данном случае - отсутствие поля в документе. И отсутствие таких документов в индексе ведь тоже помогает быстрее узнать, что для данного id этот массив отсутствует?
> отсутствие таких документов в индексе ведь тоже помогает быстрее узнать
Нет, чел, для того, чтобы узнать, каких документов нет в индексе, тебе сначала нужно считать все документы, которые есть в индексе. И проверить для каждого документа, входит он в этот список или не входит. Гораздо проще считать все значения и проверить их на null.
>чтобы узнать, каких документов нет в индексе, тебе сначала нужно считать все документы, которые есть в индексе
Зачем? Наверняка там внизу какая-то структура данных типа хешмапы или сета, в которой значение всегда получается за константное время.
Вот лично я работаю последние 5 лет в банках в разных отделах. Был в отделе отчетности, в рисках, в кредитном процессинге. И последний год работаю чисто в ETL. Но в чем я истинно силен? Наверно в SQL конечно, могу запрос любой сложности написать и оптимизировать. Пишу немного в Java код для общения с message broker: kafka, ibm mq, немного в python код для aiflow бихдата прости господи, немного в groovy для etl-средства. Еще на диалектах PL/SQL, на T-SQL, на pgSQL. Про зоопарк баз вообще молчу, так как почти не осталось СУБД с которыми я не работал.
Из всего этого зоопарка технологий уже начинаю забывать зачем я в эту область пришел, если приходится брать отовсюду по чуть-чуть. Куда дальше расти? Как себя идентифицировать? Или я просто начинаю выгорать в этой области?
Реквестирую ETL-братишек рассказать свои истории как боролись с такими ощущениями или у меня развивается СПГС.
Надеюсь в тот тред написал
Да, в тот.
Можешь называть себя Data Engineer, очень солидная профессия.
Сколько зарабатываешь?
Сейм друг. У меня такое же ощущение. Успел поработать с ораклом, террадатой, гринпламом, ETL на airflow писал, hadoop, pyspark сам понимаешь, сейчас ещё и BI отчётность пилю, только всё это я делал не в банках и, с оптимизацией запросов я хромаю, но я думаю, как-нить наверстаю. Как-то не чувствую себя разработчиком, при таком большом количестве js кодеров на дваче.
Зп 150к
Попробуй на этот кондишн "array.0": { $exists: true } создать индекс partialFilterExpression.
Да вот Data Engineers это другой департамент, которые ковыряют чисто Data Lake. Зарабатываю 180к на руки + годовая премия в 1 оклад. Не знаю много это или мало по местным меркам, официально я мидол.
>>063868
Ага, ты тоже уловил суть. Хоть может это и хорошо что откровенное быдло не лезет в нашу область. Хотя быдло-кабанчики-аналитики лезут
>Хоть может это и хорошо что откровенное быдло не лезет в нашу область
Мне почему-то кажется, что там порог входа чуть повыше. Ну т.е. довольно сложно заинтересовать быдло заниматься именно этим.
А, лол, я понял. Тоже туда собесился, но не пошел, потому предложили нихуя не выше рыночка, вопреки расхожему мнению, и потому что там был ебучий SAS DI, которым мне заниматься не очень хотелось.
> предложили нихуя не выше рыночка, вопреки расхожему мнению
СБЕР вообще достаточно жадный, у него явная политика платить средне по региону, причём это настолько жёстко, что до недавнего времени, если работаешь на удалёнке, нельзя было переехать в другой регион, ибо платить по-московски тому, кто живёт в Барнауле, он не хочет.
мимо джава-макака
Честно говоря никто не хочет. Недавно собесили на удаленку товарищей из Омска и Екб. Однако, процентов на 30% ЗП ниже чем у мидла в ДС.
Но заметил такое, что сеньер в регионах это, как правило, мидл в ДС по скидками. Лид в регионах - сеньер в ДС. Недавно собесил сеньера SQLщика с 9 месяцами опыта, но назвал себя ведущим программистом. Охуеть.
мимо другой банк
В шкалке один человек объяснил мне основы, дальше научился гуглить.
Базовыми. Даже оконных функций не знал.
Я начинал с того, что научился ставить винду на свой комп. Потом устроился в комп. клуб админом. Ну а потом приходишь в любую днище-фирму и говоришь - я админил сетку и 30-40 компов с круглосуточным аптаймом и постоянно меняющимися юзерами без навыков. Обычно этого достаточно чтобы взяли на испытательный срок. Там месяц-два учат своему софту, если выучил и справляешься с поддержкой - остаешься. Так я стал сисадмином. Дальше, если не обленишься, учишь язык. Я вот учу, дается легко, так как всё знакомое. Опыт в ИТ есть, язык знаешь - идешь джуном. Получаешь опыт в разработке, а дальше либо по разработке двигаешься, либо в девопс. Если в девопс, то можно получить опыт, обмазаться безопасностью и в спецопс.
Даже не знал, что такое язык SQL. Решил пару задачек на логику и взяли. Ну а потом уже начался язык SQL и база данных Oracle.
Не бойся, в этой сфере очень большой процент ничтожеств, так что либо гармонично туда впишешься, либо будешь выгодно выделяться.
Меня сразу заставили нырять в ёба процедуры с головой лул я сразу сломал кое-что и заниматься реверс инженеригом чужих говен честно говоря и по происшествию года кое-что не понимаю, представь как я знатно охуевал в первые месяцы
мимокрок
Везде форсят autoexplain, но или я что-то не понял, или он пишет куда-то в логи, куда я не хочу лезть и вообще мне нах не надо это на каждый запрос. Хочу просто один раз посмотреть и все.
Немного побугуртили, потом дали задачу попроще но один хуй слишком сложную чтоб я её мог сделать. Потом отправили дебыватся до подрядчика чтоб они меня научили это была пиздец подстава и позорище, я полез в скайпе доебыватся до их синьёра, он от такого знатно охуел, и позвал ПМ-а, вобщем до сих пор стыдно. Мне кажется первые месяца три меня всерьез подумывали выпиздить, но потом выяснимлось, что я могу в MDX немного, и жтот навык оказался полезным, а потом я уже и SQL подтянул.
Аналитики разные бывают, в разных департаментах. Но если брать именно анализ данных то:
1) Ищут данные для разных подразделений
2) Правят маппинги, чтобы потом разраб доработал ETL
3) Поясняют за данные - почему таблица Х прогрузилась именно так, а не иначе
4) Ебашут ad hoc
5) Пишут ТЗ разрабам чтобы те разработали новую загрузку
на самом деле в этом списке технически сложных вещей нет, скорее муторно, и надо быть внимательным, и хорошо разбираться в предметной области.
другой анон
Да, у меня такое-же было, правда через год-два работы ЕТЛ-щиком. Делал все и по немногу.
В итоге я погрузился сильнее в техническую часть, освоил С, начал изучать внутрянку баз, как они в ОС работают, алгоритмы поиска, обращения к данным как реализованы и тд и тп. Понимания, кто я в современной градации мне это так и не прибавило, но задачи больше нравятся).С данными уже давно не работал, в основном в ОС что-то допиливаю или настраиваю.Сейчас это похоже на какую-то смесь админа, системного разработчика и архитектора.
И да, плюс о котором выше писали - так как область не хайповая - залетных хипстеров и гуманитариев почти нет. Работаешь так сказать в кругу единомышленников)
6) бесконечные переписки с БА (если сам аналитик СА), или с бизнесом (если сам аналитик БА). Очень много деловой переписки, отвечаю, аналитики половину рабочего времени просто со всякими бизнесами общаются.
Я когда готовился к приему на эту работу, у меня было 2-3 месяца, за это время я организовал вкат в SQL и учил MDX. MDX довольно простой оказался, точно уж проще SQL, по итогу мне даже всё не пригодилось, что я курил по MDX. Конечно в mdx есть скоупы, которые довольно странно иногда работают, но с этим я подьяснился уже на проекте.
Да тупо пару статей читани с хабра. У меня тоже это в требованиях было чуть ли не обязательным требованием. В итоге спросили про снежинку/звёздочку. Про факты/дименшены. По факту ведь мало кто руководствуется именно манярекомендациям этих товарищей. В голове держат, но четко не следуют.
Ну хуй знает кимбал как по мне довольно жизненные байки травит.
Отечественным двх-рабработчикам энтерпрайзовым гречневым конечно похую, но тем не менее
А, понял. Во втором THEN должно быть значение, а не выражение.
Действительно, так работает.
Я даже понял, почему он до этого присваивал нулл или пустые строки: выражение "SET sex =" начинает выполняться в любом случае, и если нет подходящих CASE, то оно таким и останется, порождая нуллы и пустоту.
апну вопрос
По личному опыту кто-нибудь посоветует книгу?
Подойдет всё, что связано с теорией БД, sql и тд.
P.S. видел книги в шапке, но может ещё какие накидаете
Мне прочитанная в 2012 книга Ицика Бен-Гана T-Sql Querying зашла так, что с тех пор по rdbms ничего не читал (читал про nosql и всякое распределенное), но я дотнетомакакен.
Параллельно решал sql-ex, видимо по-этому закрепилось достаточно и для собесов, и для работы.
Пытаюсь гуглить, а там какие-то очень сложные для меня запросы
Нет. Таблица в базе данных это куча, если у тебя нет айди и даты изменения, то тебе сначала нужно их добавить, иначе ничего не выйдет.
Конечно, вопрос еще зависит от того, какая у тебя база. В Oracle, например, есть rowid у каждой строчки, в общем случае они упорядочены, но это все равно не гарантируется и завязываться на это не принято.
Оракл. Есть таблица для временных данных.
При нормальной работе больше чем на пару секунд данные там не задержатся, но в случае ошибки останется мусор, который надо автоматически вычищать.
Как можно это сделать на уровне дб? Там простейший delete from TABLE.
Хочу чтобы это запускалось разок посреди ночи.
Как в случае ошибки может остаться мусор? У тебя же должен при этом происходить автоматический откат транзакции. Вообще, в оракле есть планировщик: https://docs.oracle.com/en/database/oracle/oracle-database/19/admin/scheduling-jobs-with-oracle-scheduler.html или можно через какой-нибудь крон или дженкинс.
А эти данные используются больше чем в одной сессии? У оракла есть прекрасные global temporary tables под такую хуйню.
Еще у оракла есть exception, можешь там прописать очистку таблицы, если что-то пошло не так.
Если эти изящные варианты решения проблемы тебя не устраивают, то да, ебашь джоб на уровне бд, но это уебанство, потому что так у тебя два разных процесса будут менять одну таблицу и ошибок ты можешь только больше наплодить.
>>069286
>>069264
Я не упомянул кое-что и ввел в заблуждение.
Ошибка может возникнуть лишь на уровне сетевых запросов. Есть действие, которое выполняется в несколько последовательных запросов, и, если какой-нибудь пост не долетит до сервака, строка в бд так и останется висеть.
Спасибо за инфу, погуглю про это.
тогда ты вообще не туда дуешь
смотри в сторону транзакции
если ошибка произошла - транзакцию откатываешь
Аноны, попался такой запрос:
SELECT COUNT(1) as value, Status,
CASE
WHEN Status = 1 THEN 'status_up'
WHEN Status =14 THEN 'status_down'
WHEN Status =3 THEN 'status_warning'
ELSE 'status_unknown'
END as icon,
CASE
WHEN Status = 1 THEN 'green'
WHEN Status =14 THEN 'red'
WHEN Status = 3 THEN 'yellow'
ELSE 'gray'
END as color
FROM Nodes
GROUP BY status
ORDER BY value DESC
Что такое COUNT(1) ?
Я привык, что в каунт мы забиваем название столбца, чтобы посчитать строки. Но там нет столбца "1". Или это индекс какой-то?
На https://www.w3schools.com/sql/sql_count_avg_sum.asp про это нет
Эквивалентно count(*).
Обычно так пишут хуесосы, которые ничего не понимают в бд и верят, что count(1) работает быстрее. Распространенное суеверие, можешь ссать на лицо автору запроса.
Чтобы понять, как это работает, можешь представить, что сначала ты делаешь select 1 from table (т.е. возвращаешь столбец из единичек по количеству строк в таблице), а потом делаешь count по полученному результату.
Протасевич так же думал...
У него несколько запросов, а значит и транзакций несколько. Откатить не получится.
Этот запрос не работает если есть два человека нанятые в один день.
SELECT * FROM otdel_kadrov.employee right JOIN
(SELECT max(dateup) as dateup, heads.FIO1 FROM otdel_kadrov.employee LEFT JOIN heads
on employee.head = heads.IdHeads GROUP BY FIO1) as t on employee.dateup = t.dateup;
если дата точнее дня не пишется, то можешь дополнительно отсортировать по id (они же инкрементируются)
Можешь поконкретнее, где нужно отсортировать?
select from heads join (select from emp order by dateup desc) emps on heads.id = emps.head group by heads.id;
Всё там работает, джойним начальников и сортированных холопов и группируем по начальнику.
Почему?
Модельки в django или во flask, например. Если ты про python
pgadmin
1. Профайлер. Как работать, как оптимизировать запросы;
2. Индексы - Seek, scan, full text index;
3. Масштабирование;
4. EF to ms sql (ORM .net) - AsNoTracking, Querable.
Что еще посоветуете?
Есть у меня одна таблица, хочу ограничение повесить на поле, уникальным сделать.
ALTER TABLE table DROP CONSTRAINT IF EXISTS table_name_key;
CREATE UNIQUE INDEX CONCURRENTLY table_name_key ON table (name);
ALTER TABLE table ADD CONSTRAINT table_name_key UNIQUE USING INDEX table_name_key;
Так вот проблема при самом удалении ограничения. Его блокирует другая таблица, селект из неё. Они вообще никак не связаны, никаких внешних ключей.
Почему? Как мне удалить ограничение, не останавливая работу прода?
Вот что лок вешает
SELECT u.* FROM users u WHERE u.id = 128592314 ORDER BY CASE WHEN u.type = 'active' THEN 1 ELSE 2 END, u.id DESC
> Вот что лок вешает
> SELECT u.* FROM users u WHERE u.id = 128592314 ORDER BY CASE WHEN u.type = 'active' THEN 1 ELSE 2 END, u.id DESC
Как оно может лок вешать? Оно же должно отработать и угомониться.
А я ебу? Вот поэтому я и спрашиваю, как оно вообще вешает лок, да еще и на левую таблицу.
Причем на 13 версии постгри это не мешает, а в 9.6 почему-то странные локи висят
Я же не от делать нечего такое спрашиваю
blocked_statement | current_statement_in_blocking_process
-------------------------------------------------------------+--------------------------------------------------------------------------------------------------------------
ALTER TABLE table DROP CONSTRAINT IF EXISTS table_name_key; | SELECT u. FROM users u WHERE u.id = 37640008 ORDER BY CASE WHEN u.type = 'A' THEN 1 ELSE 2 END, u.id DESC
ALTER TABLE table DROP CONSTRAINT IF EXISTS table_name_key; | SELECT u. FROM users u WHERE u.id = 34794093 ORDER BY CASE WHEN u.type = 'A' THEN 1 ELSE 2 END, u.id DESC
Тут я сломался, посколько как прикрутить сюда влияние модификаций - ноль идей.
Даже у тех кто на отлично уже сдал спрашивал, тоже молчат. Прошу помощи как это сделать, плюс какие нибудь общие советы.
В том что в моем (неправильном) решении этого вопроса влияние от прицела происходит вообще на все характеристики, а должно только на точность. Пытаюсь переварить все это, а голова кипятится - SQL для меня тема новая.
select id_weapon,id_stat,stat_value+mod_stat
from weapon_stats ws join
(select id_weapon,id_stat,sum(stats_effect) mod_stat from mod_stats m join weapon_mod w on m.id_mod=w.id_mod group by id_weapon,id_stat) ms
on ms.id_weapon = ws.id_weapon and ms.id_stat=ws.id_stat
Процентов 90 что где-то я с синтаксисом объебался, но логика вроде верная.
Эх, оно все равно тупо суммирует ко всему.
Mod_Stat это если что название другой таблицы, а название колонки - Stat_Effect
Название таблицы у тебя mod_stats, mod_stat - это элиас который я назначил для суммы значений stats_effect для конкретного стата конкретного оружия, можешь любой въебать.
В джойне mod_stat должно быть еще условие на weapon_stats.id_stat = mod_stat.id_stat
Дружеский совет: inner join'ы для модификаций перепиши на left join'ы, потому что твой запрос отсеивает оружие, для которого нет модификаций, что неверно, в общем-то.
И в части select должно быть coalesce(stat_effect,0) для обработки ситуаций, когда по оружию или по какой-то характеристике нет изменений, потому что на языке sql 1 + null = null
И скорее всего нужно делать group by и считать сумму модификаций, если несколько разных модицикаций могут влиять на одну характеристику.
Спасибо, попытаюсь разобраться
Гуглением нашел что-то такое, но не знаю что делать с ключом.
INSERT INTO table (a,b,c) VALUES (1,2,3), (4,5,6),..., (101, 102, 103)
ON DUPLICATE KEY ?????
По идее можно создать 4-й столбец = CONCAT(a, b, c) a,b,c - строки и сделать его ключом? Но чет звучит как костыль.
Простите, а там что, нельзя создать таблицу без primary key?
А обычный автоинкрементящийся праймари кей?
В чем вопрос?
Можно. Я хуево вопрос написал наверное. Мне нужно вставить в table(a, b, c) новые такие значения (a, b, c), чтобы при этом строки, которые уже есть в таблице, не вставлялись т.е. чтобы в table не образовывались дубликаты.
С автоинкрементом он будет писать подряд все (id, a, b, c), а мне нужно, чтобы (a, b, c) были уникальными.
ALTER TABLE `table` ADD UNIQUE `unique_index`(`a`, `b`, `c`);
Потом через INSERT IGNORE вставляешь.
> Это нормально, что у меня primary_key это и foreign_key всегда одновременно?
Конечно, что в одной таблице праймари кей, то в другой форейн кей.
А схему твою мне впадлу смотреть.
То есть есть таблица, в которой хранятся jsonы, и значения одной из колонок в жсоне одинаковы в 98% случаев. И мы фильтруем именно по этому значению.
Если добавить индекс то он игнорируется, потому что индексы юзаются только для не слишком часто встречаемых значений.
Добавлять поля в таблицу не вариант, структура должна остаться такой же.
Если постгрес новый то создайте партиционирование по этому полю. Таблицу придется пересоздать.
Знаете что. В моей картине мира json это формат для обмена данными, а не для хранения данных. В реляционной базе данных все должно храниться строчками, а не джейсонами. Архитектура ваша — говно.
>>079954
Двачну анона с партициями.
Еще почитайте про битмап индексы, если они есть в вашей бд и если подходят под эту ситуацию, там нюансы
В сервис из сторонней интеграции прилетают json-данные довольно произвольного и часто меняющегося формата, с парой постоянно встречающихся полей и остальными рандомными. Причем эти данные не требуется анализировать, а просто хранить и отдавать по запросу всей котлетой. Твои предложения к такой архитектуре?
Кажется это бекап сформированный через pg_dump. Ресторится база через pg_restore. НО КАК БЛ, читал на стеке ниодин вариант не подошел, хххелп плс!
Ой(
Анон, как оптимизировать sql-запросы? Если это сильно привязано к СУБД, то пусть вопрос будет для PostgreSQL.
Например, вот анон пишет:
>>063764
>в SQL ... могу запрос любой сложности написать и оптимизировать.
Какие хорошие ресурсы есть по этой теме?
Я так понимаю, это связано с реляционной алгеброй, это большая тема, нужно прочитать какие-то талмуды или там всё проще?
Посмотри, что такое explain и кури в эту сторону.
Т.е. улучшение эффективности получения конкретного результата подбором правильного плана запроса, навешивания индексов для ускорения и т.д.
Я не понимаю, почему постоянно говорят про индексы. В чём проблема? Берёшь проект, сканируешь его запросы, получаешь список таблиц и для каждой таблицы список столбцов, по которым производится поиск, на все эти столбцы навешиваешь индексы.
На это можно ответить, что слишком много индексов замедляют запись. Ну и чё делать теперь? Запрос-то исполнять надо. Что делать в ситуации, когда тебе нужно добавить индекс к столбцу, но почему-то нельзя?
Там всё несколько сложне чем просто ололо навешаем индексы везде, где ведутся запросы.
Для мелкобаз это не особо актуально и зачастую достаточно такого подхода, да.
Наверное приходится выбирать между двумя запросами, решать, какой из запросов важнее, в каком запросе скорость критичнее, и замедлять один запрос чтобы ускорить второй.
А ещё есть кэши.
Получается такая история: если бы у нас была идеальная база данных, то мы бы просто выполняли запросы безо всяких индексов и всего такого.
Если бы у нас была идеальная база данных с индексами, то мы просто добавляли бы индексы на все столбцы, по которым ведётся поиск, и всё бы работало без проблем.
Но так как мы имеем дело с не-идеальными базами данных, то приходится думать о трейд-офф-ах, использовать всякие костыли и подпорки в видей кэшей, вью, триггеров и прочего. Чем ещё можно дополнить этот список?
1) Большая выборка с джоином, в итоге поменял запрос чтобы большая таблица была в WITH с фильтром, а не фильтровалось во время джоина.
2) Джоин большой таблицы из подзопроса , чтоб не вешать индексы по полям для джоина, добавил параметризированый фильтр внутрь подзапроса, там индекс по дате был, а по полям по которым идёт джоин нет, чтоб получилось что-то вроде:
select
from zalupa join
(select from govno
where date beetwen {param1} and {param2})
where date beetwen {param1} and {param2}
Вот такая хуйня малята.
Это типа создавать поколения данных, и потомков первых данных считать патрициями, а остальных - плебеями? Как это поможет оптимизировать запросы? Ну и из истории мы знаем, что сословия перемешались, а потом патрицианские роды и вовсе вымерли.
Гугли распаковку бекапа от pg_restore. Там через цмд открываешь папку с это утилитой, и потом пишешь чтото типа: /pg_restore -U имя юзера в пг админе -d новая база, в которую хочешь поместить бекап(имя этой базы в пг админе) и имя самого бекапа (у меня сработало только тогда, когда переместил бекап в папку с утилитой, через -f путь файла не работало)
https://postgrespro.ru/docs/postgrespro/10/app-pgrestore
Вот это сильно помогло
Хз, могу ответить про Оракл, может поможет.
Первое, вообще самое первое в оптимизации - это посидеть и подумать, что и нахуя ты делаешь. Тем более, если от бизнеса задача прилетела. Взять аналитика и по каждой строчке пойти, что он именно хочет.
Но самое важное - это планы запроса, да. Не знаю, как в Пострге, но оракл страдает такой проблемой, что план, который тебе объяснили, и реальный план исполнения - вообще разные вещи.
В оракле есть штуки уровня dba_hist_* табличек, в которых логируются состояния сессий/процессов, и просто охуенный тулз sql_monitor, позволяющий риалтайм смотреть, что процесс реально делает. Наверное, в Пострге тоже подобные штуки есть.
Я работаю с большими и тупыми базами данных, где часто проблема не в оптимизации как таковой, а в тупых настройках бд, оптимизатора или кретинских регламентах работы на источниках, которые вечно мне всё локают.
СУБД вроде и так сами по себе достаточно умные, нужно только мониторить, чтобы они совсем херь не делали.
1) если у тебя не идёт замножения при джойне, то никакой разницы по факту. Предикатный фильтр можно и внутри условия джойна сделать, чтобы сразу доступ к таблице только по фильтру был.
Вот если оно у тебя в CTEхе материализацию сделало, тогда да, могло помочь.
сам вешаю индексы только на PK
> В оракле есть штуки уровня dba_hist_* табличек, в которых логируются состояния сессий/процессов, и просто охуенный тулз sql_monitor, позволяющий риалтайм смотреть, что процесс реально делает. Наверное, в Пострге тоже подобные штуки есть.
А как тебе это поможет при оптимизации конкретного запроса? Что могло бы помочь - это если бы какая-то штука разбила твой запрос на шаги или подзапросы и для каждого шага показала бы, сколько он исполнялся в целом и в процентах. Так это работает?
>сам вешаю индексы только на PK
ты трололо или туттуру?
мы же только что только выяснили, что надо навешивать индексы.
прикинь если бы ты попросил у человека номер телефона, а он бы тебе сказал: "я никогда не спрашиваю номер, я просто перебираю все номера, и рано или поздно всё равно дозвонишься туда, куда надо".
https://use-the-index-luke.com/
>а не фильтровалось во время джоина.
Разумно, зачем фильтровать много данных когда можно фильтровать мало данных.
> индекс по дате был, а по полям по которым идёт джоин нет, чтоб получилось что-то вроде:
Те ты заменил join подзапросом?
>внутри условия джойна сделать, чтобы сразу доступ к таблице только по фильтру был.
Я так понял было следующее:
n строк m строк = nm строк + фильтр = q строк + фильтр = k строк
Vs
(n строк + фильтр) = p строк m строк = k строк
n < q
Монитор как раз по шагам пишет, сколько делал, сколько темпа, сколько I/O. И порядок этих шагов.
Запускаешь запрос — смотришь, где проблема при исполнении — думаешь, можно ли пофиксить в коде. В оркале это часто хинты на порядки джойнов или хинт на запрет какой-то тупой хуйни уровня: оракл считает, что после джойна будет 1 строка, а выходит 10лямов, и он хуярит NESTED LOOP, конечно, это будет вечность считаться.
че т теперь я не понимаю. Ты если явно условие фильтра в джойне укажет, то СУБД сперва соберёт (n строк + фильтр), и только потом будет n'm делать, где n' - n после фильтра.
Если СУБД так не делает, то ей нужно объяснить, что она не права, лол.
Но вообще почитаю, спасибо.
Я тоже думал разницы нет, и оно само на этапе джоина отфильтрует сначала, потом сделает джоин. Оказалось нет, если явно в CTE фильтровать перед тем как джоинить работает быстрее.
В первом случае явный WHERE в CTE, во втором and {Условие} в джлине.
>>081787
Нет, там джоин идёт к подзапросу, я добавил фильтр к подзапросу, по полю дата. Вон я же пример написал.
И подскажите, как в SQL Server смотреть план выполнения? В MySql есть Explain, в MsSql я что-то такого не нахожу
P.s дана была задача хранить перфокарту(с выбранными отверстиями) и решил использовать json
или есть варианты по-лучше?
а какие еще варианты есть хранения (с минимумом занимаемой памяти)?
(на перфокарте 40 областей с различной длинной)
Бинари меньше всего будет занимать, тем более у тебя на дискете уже хранится в двоичном виде по сути. Можно ещё вьебать говна и записать каждую дискету как 40 различных строчек, с ключом - имя перфокарты. Можно вобще ссылку на файл хранить, а перфкарты хранить на диске. Непонятно из-за чего сырбор, эти данные с перфокарт нихуя не весят, по отдельнеости неконститенты, если ты читаешь перфокарту ты хочешь читать её всю, разделители эту условность нужная самой перфокарте для работы. Можно ебануть в longstr с разделителям.
Обычно вопрос не ставят КАК СДЕЛАТЬ, обычно начинают от ЧТО НУЖНО ПОЛУЧИТЬ. Вобщем с ёбой ехидного колобка спрашивай у деда препода А КАКАЯ БИЗНЕС ЗАДАЧА? КАКОЕ БИЗНЕС ВЕЛЬЮ ВЫ ХОТИТЕ ПОЛУЧИТЬ ОТ РЕАЛИЗАЦИИ ЭТОЙ ЗАДАЧИ? Более чем уверен у тебя там затхлый совковый пердун, который говорит СИКВЕЛ.
Вот я написал свою базу данных для работы, но она вся висит в оперативке сервера и её копия в тхтшке. Если идёт запрос данных - то он обрабатывается с оперативке. Если изменения данных - то они меняются в оперативке, а потом вся база целиком сбрасывается в тхтшку. И оперативно и надёжно, как мне кажется.
Но весь мир говорит, что базы данных должны хранится в sql. Окей, я его освоил по минимуму, могу создать базу, запрос.
Но в целом архитектура мне не ясна. Получается что вся база должна хранится в sql и если идёт запрос данных, то сервер должен формировать соответствующий запрос sql, получать данные из базы и переправлять пользователю? А если запрос сложный? Допустим мне надо целую страницу хтмл сформировать с данными, мне надо раз 20 обратиться к базе?
Таблетки прими.
Есть общее правило: никогда не пиши свою СУБД, далее если кажется, что есть необходимость.
> Вот я написал свою базу данных для работы, но она вся висит в оперативке сервера и её копия в тхтшке. Если идёт запрос данных - то он обрабатывается с оперативке. Если изменения данных - то они меняются в оперативке, а потом вся база целиком сбрасывается в тхтшку. И оперативно и надёжно, как мне кажется.
Просто пиздец.
1. При росте размеров БД на каждое небольшое изменение целиком перезаписывается файл. И медленно, и всеоре убьёт диск из-за постоянной перезаписи.
2. Если во время записи файла ввключится питание, модет записаться половина файла, вторую не восстановить никак.
3. Большая БД не влезет в ОЗУ.
> Но весь мир говорит, что базы данных должны хранится в sql. Окей, я его освоил по минимуму, могу создать базу, запрос.
Она не хранится в SQL. SQL - это просто язык запросов, внутри БД может быть реализована как угодно.
> Но в целом архитектура мне не ясна. Получается что вся база должна хранится в sql и если идёт запрос данных, то сервер должен формировать соответствующий запрос sql, получать данные из базы и переправлять пользователю?
Не обязательно сервер, есть sqlite. Но в целом приложение выступает прослойкой между БД и пользователем.
> А если запрос сложный? Допустим мне надо целую страницу хтмл сформировать с данными, мне надо раз 20 обратиться к базе?
Обращайся 20 раз. Можешь кешировать чтение. Это лучше, чем возможность ситуации, когда однажды самописная БД сдохнет.
>1. При росте размеров БД на каждое небольшое изменение целиком перезаписывается файл. И медленно, и всеоре убьёт диск из-за постоянной перезаписи.
Ну, допустим, у меня нет перспектив что база данных станет мега гигантской. 10-20 мегабайт, это прям капец с каким запасом. Тем более в перспективе можно подумать как оптимизировать место. Ну и разве тот же sqllite не записывает всё равно каждый раз все данные в файл?
>2. Если во время записи файла ввключится питание, модет записаться половина файла, вторую не восстановить никак.
Это легко фиксится. База пишется не в один а два файла, которые меняются местами. Сначала в один, при следующем сохранении в другой.
>3. Большая БД не влезет в ОЗУ.
С этим согласен. Но опять же, если нет перспектив что база будет занимать гигабайты места - этим можно пользоваться?
>Она не хранится в SQL. SQL - это просто язык запросов, внутри БД может быть реализована как угодно.
Ну окей, освоил язык. Сути не меняет, будет она хранится в sqllite или MySql
>Обращайся 20 раз.
Понятно. Грустно как то. В итоге мой вариант более оптимизирован, но из за стандартов юзанья sql - становится признаком нуба.
>Это лучше, чем возможность ситуации, когда однажды самописная БД сдохнет.
Это легко предотвратить.
Sqlite делали умные люди и нахуячили туда сотни оптимизаций, а ты хуяришь строчки в простой тхт-файл и думаешь что у тебя то же самое. Чел.....
Можешь посмотреть на всякие in-memory СУБД, там тоже всё держится в ОЗУ и иногда сохраняется на диск, там это делается оптимальнее, чем в самописной. В реальности используется в основном для данных, которые не жалко потерять, всякие кеши, результаты вычислений, очереди сообщений и подобное, что можно легко восстановить.
Я не говорю что то же самое. Но лично пробовал, скинуть целиком базу в тхтшку на порядки быстрее, чем скинуть её в sqlite. В других бд не пробовал.
Ну ладно, я сюда не обсирать или отстаивать свою точку зрения пришёл. Думал может я что то не так понимаю. В целом то для моей задумки абсолютно не критично, будет запрос обрабатываться 0,1 секунду или 0,01 секунду.
>>083717
В целом я делаю проект больше для портфолию, мне надо что было как у всех...
Это не он, тому надо было проприетарный копирастский sqlite с зондами запустить через mono на windows xp.
>Надо чтобы было как у всех
>Делает самописную базу на тхтшках вместо того чтобы заюзать склайт
Челллллл....
А чего не mongodb? Тоже файловая, если сохранность данных не сильно в приоритете, то может подойти.
С каких пор монгодб файловая? Уже не надо тащить целый сервер, писать конфиг и разворачивать кластер из единственной ноды?
Еще есть редис
понял, спасибо
Т.е для nvarchar(max) длина будет уже как int16, верно?
(занимает то символ 2 байта)
Увидел вот такую конструкцию в одном из запросов для mysql:
FROM {message} mm1
Что еще за фигурные скобки? mm1 понимаю что это сокращение для таблицы message, только тут AS опустили
Нет, не понял.
Signed int32 - длина поля в байтах.
Varchar вмещает 2ккк байт == 2ккк символов == char == uint8.
Nvarchar вмещает 2ккк байт == 1ккк уникодных символов == wchar == uint16.
Это переменная. Туда подставится значение в скобки
Юникодный символ может быть и 6 байт длиной.
1. Если на каждое из полей вешать compound индекс, будет ли в этом толк?
2. Будет ли в 1 кейсе перекрытие индексов, если оба поля будут участвовать в выборке?
3. Нужны ли partial filter expressions вообще? Выжу в них смысл только в тех кейсах, где одна и та же кверя отрабатывает по нескольку раз.
Спасибо
Подскажите, я могу делать всё как по этому гайду, но только с postgres? Через PDO всё будет такое же или нет? Mysql никак не хочет устанавливаться.
В пхп части будет, а сам постгрес чуток другой, очевидно.
Ну там просто запросы передаются, хули тут делать. Вобще юзай ларавель и нееби голову.
чел если ты обосрался ещё на этапе установки бд, у меня для тебя плохие новости
спасибо абу, как же ахуенно капчу каждый раз вводить чтоб блядь на телефоне у тебя была такая же капча, макака сранная
>ты обосрался ещё на этапе установки бд
Лол, установщик не может запустить сервер, а виноват конечно пользователь, а не говнокорпа. Гугл говорит, что это извечная проблемаmysql, но из решений только танцы с бубнами, которые мне не помогли.
Ну в случае тотального отсутствия вариантов решения проблемы, за исключением сноса винды, конечно да, хоть уволюсь, в чём проблема? Мне из жопы высрать нормальный mysql, написанные не криворукими дебилами?
Заебал, поставь docker desktop на винду и запускай любую хуйню, на сколько оперативы хватит.
запрос вида
SELECT *
FROM GOVNO
WHERE BEGIN>=2020-01-01
and END>=2020-01-02
Достаточно ли будет проиндексировать BEGIN+END или нужен связанный индекс по двум полям, или ещё какое-нибудь колдунство? Что посоветуете при таком сценарии вобще?
самофкис, да очевидно что в случае с END знак в другое стороны, проебался но я думаю вы умненькие и так всё поняли
бамп
Всё очень плохо.
Если у тебя будут индексы на обоих полях, для доступа к данным все равно будет использоваться только один индекс.
И надо учитывать, что если твои условия выполнены для большинства записей (очень старая дата BEGIN, очень новая дата END), то от индекса будет только хуже. По тем же причинам индекс на одновременно BEGIN + END будет говной.
Как вариант, можешь попробовать партиции на одно из полей и индекс на второе.
Если на простой запрос повесить условие
select *
from table
where atr = 'aaa'
Условие на запросе будет работать быстрее, если таблица СУБД колоночная?
Конечно, будет, именно для этого они и нужны.
Но вы учитывайте, что в колоночных СУБД дорогие апдейты и джойны, так что нужно выбирать СУБД исходя из решаемых задач в целом.
ебнул join в КХ == выстрелил себе в ногу
select * from muk.puk where mne='pora'
Бля чот подумал что изи катка...А оно во то оно как. Странно что под такой распространеный кейс нет стандартного шаблона.
А что касается партиций, я что-то не уверен, мимокроки пишут, что прирост перфоменса хуйня
http://mysql.rjweb.org/doc.php/partitionmaint
За ответ спасибо
Так перформанс по партициям сильно от объема данных зависит, не?
Одно дело по ключу партиции вытащить несколько лямов, а другое дело даты дрочить.
Не делайте себе голову, проверяйте на своем железе. Тут запросы пару строчек
Если ты про всякую IDEF0-ER-UML-парашу, ей пользуются только студенты на лабах и то только потому, что заставили преподы. Просто думаешь, какие таблицы тебе нужны, пишешь скрипты для их создания, и всё.
Что значит проектировать?
В draw.io диаграмму нарисуй и хватит.
Это разные вещи. Всё равно что сравнивать нулевую температуру и вакуум, где понятия температуры нет.
NULL.
желательно ногами в живот
Что лучше: отсосать с достоинством или позорно быть выебанным в жопу?
Есть запрос с фильтром по СТАТУС + КОМПАНИЯ:
> SELECT * FROM orders
> WHERE
> status IN ('pending', 'success', 'sended', 'received', 'in_process')
> AND
> company_id IN (91785)
> ORDER BY deadline_at DESC, id DESC
> LIMIT 100
И есть индекс на ДАТА + КОМПАНИЯ.
> CREATE INDEX orders_created_at_company_id_idx ON public.orders USING btree (created_at, company_id);
И каким-то образом этот индекс работает для этого запроса:
> Limit (cost=66625.18..66625.43 rows=101 width=110) (actual time=74.533..74.543 rows=81 loops=1)
> -> Sort (cost=66625.18..66625.57 rows=158 width=110) (actual time=74.531..74.536 rows=81 loops=1)
> Sort Key: deadline_at DESC, id DESC
> Sort Method: quicksort Memory: 36kB
> -> Index Scan using orders_created_at_company_id_idx on orders (cost=0.43..66619.41 rows=158 width=110) (actual time=43.235..74.485 rows=81 loops=1)
> Index Cond: (company_id = 91785)
> Filter: ((status)::text = ANY ('{pending,success,sended,received,in_process}'::text[]))
> Planning time: 0.474 ms
> Execution time: 74.615 ms
Я не понимаю, а как он вообще может использовать такой индекс?
Время же хранится как 8-байтоый инт - то есть это микросекунды и заказы размазаны по суткам абсолютно хаотично. И он идет первым в индексе. А второй идет компания.
Это же вообще бессмысленный индекс, но блять, он работает и фильтрует по нему компанию. Как так?
Есть запрос с фильтром по СТАТУС + КОМПАНИЯ:
> SELECT * FROM orders
> WHERE
> status IN ('pending', 'success', 'sended', 'received', 'in_process')
> AND
> company_id IN (91785)
> ORDER BY deadline_at DESC, id DESC
> LIMIT 100
И есть индекс на ДАТА + КОМПАНИЯ.
> CREATE INDEX orders_created_at_company_id_idx ON public.orders USING btree (created_at, company_id);
И каким-то образом этот индекс работает для этого запроса:
> Limit (cost=66625.18..66625.43 rows=101 width=110) (actual time=74.533..74.543 rows=81 loops=1)
> -> Sort (cost=66625.18..66625.57 rows=158 width=110) (actual time=74.531..74.536 rows=81 loops=1)
> Sort Key: deadline_at DESC, id DESC
> Sort Method: quicksort Memory: 36kB
> -> Index Scan using orders_created_at_company_id_idx on orders (cost=0.43..66619.41 rows=158 width=110) (actual time=43.235..74.485 rows=81 loops=1)
> Index Cond: (company_id = 91785)
> Filter: ((status)::text = ANY ('{pending,success,sended,received,in_process}'::text[]))
> Planning time: 0.474 ms
> Execution time: 74.615 ms
Я не понимаю, а как он вообще может использовать такой индекс?
Время же хранится как 8-байтоый инт - то есть это микросекунды и заказы размазаны по суткам абсолютно хаотично. И он идет первым в индексе. А второй идет компания.
Это же вообще бессмысленный индекс, но блять, он работает и фильтрует по нему компанию. Как так?
Лол, у тебя может одна и та же компания быть создана несколько раз в разное время?
Есть ощущение, что created_at, company_id - 1 уникальная пара для company_id, так что оно по этому индексу как раз находит компанию.
А потом уже фильтр на те строки, что по индексу.
А не, я объебос и читать не умею.
Хз, хинтани как-то full scan по фильтру и посмотри. Мейби ему рли проще по дереву индексов пройтись, игноря даты.
> Index Cond: (company_id = 91785)
Он же сам пишет, что по 1 кондишену индекс смотрит.
Чё за СУБД?
Почитал, как в Постгре индекс на несколько атрибутов работает.
Мейби, у тебя жирнющая таблица с херовой тучей полей, и к ней так тяжко обращаться, что проще весь индекс прочитать, чем сперва таблицу трогать?
https://www.postgresql.org/docs/9.6/indexes-multicolumn.html
Дока говорит, что
>This index could in principle be used for queries that have constraints on b and/or c with no constraint on a — but the entire index would have to be scanned, so in most cases the planner would prefer a sequential table scan over using the index.
Хмм, да возможно, что-то я не подумал. Это типа получается как фулскан, только по индексу бежать типа быстрее.
Да, спасибо анон, видимо так оно и есть.
Таблица большая, порядка 3кк, но полей не много.
Во, придумал, кажется.
При Table Full Scan нам всегда нужно 100% строк смотреть.
При Index Full Scan иногда возможен такой кейс.
Пример:
date1
- с1
- с2
-...
-сN
date2
- c1
- c3
-...
-cM
Нам нужно найти с2, допустим. Пойдем по каждой дате, но будет чекать не 100% записей в индексе, а только до момента записи с2, потом дальше в ветке по дате смотреть нет смысла. И выходит, что вроде как Full Read, но читаем не всё.
А если ещё окажется, что оно как-то алфавитно или по моменту добавления индексы строит, или по частоте запросов (хуй знает, пути СУБД неисповедимы иногда), то мейби там вообще в 1-2 блоке индекса щас лежало и всё так шустренько вывело.
>а только до момента записи с2
Ну да, логично.
Правда в моем кейсе это будет безпрофитно, тк почти невероятно то что заказы будут в одну микросекунду. Но так-то да.
Может тогда стоит ребилдануть индекс по DATE без времени?
Что это даст в производительности случайных запросов?
Или уже есть партиции по дням/неделям/месяцам?
Данные: есть номера, типы и даты. Сочетание "номер + тип + дата" уникально, а сочетание "номер + тип" может повторяться.
Задача: необходимо отобразить историю изменений типов в рамках номера с течением времени.
Простая группировка вида
select cr_client_id, private, min(period) as "amin", max(period) as "amax" from ohldata where cr_client_id in(12662312) group by cr_client_id, private order by 3;
подходит только для таких случаев:
123;2;01.04.2021
123;2;01.05.2021
123;2;01.06.2021
123;3;01.07.2021
но не подходит для случаев:
123;2;01.05.2021
123;1;01.06.2021
123;2;01.07.2021
123;3;01.08.2021
т.е. когда с течением времени в поле "тип" начинают повторяться значения.
сап, двач!
собираюсь вкатиться в дата инжир джуном.
знаю так себе скл, ковырял немножко оракл, знаю основы питона
какие подводные??
Это очень интересная задача, но ты все делаешь неправильно, как ты сам заметил, ты не должен просто группировать по типу, потому что это не отрабатывает ситуации, когда значения одного типа были в два разных периода.
Эта задача решается через аналитические функции, они есть в бд, в которой происходит действие?
>>093552
Хорошая работа, минусов нет.
классно, пойду наверну курсов
Тебе повезло, что я в отпуске и задача крутая.
Вот так она должна решаться.
Первый запрос: получить признак того, что значение поменялось.
Второй запрос: просуммировать единички нарастающим итогом и получить цифру, которая одинаковая у всех в рамках одной группы, айди группы, короче.
Последний запрос: сгруппировать по полученному айди и вывести значения.
нихуя не понял, но спасибо
Не только, там ещё запятая. Сначала объявляешь колонку, а затем отдельно делаешь её внешним ключом.
Получилось, спасибо
Если чё, то это базовый поиск уникальных периодов, базовый кейс, везде нужно.
Системное поле с моментов вставки/обновления строки добавь. Или хотя бы с номером загрузки.
Или ебись костылями через rowid или его эквивалент.
Нет другого способа? Скрипт должен работать с любым загрузчиком и любой таблицей
Почему ты не можешь на этапе работы скрипта логировать строки, которые не занеслись в базу? Хуйню какую-то придумываешь.
Да не я эту хуйню придумал, мне так задачу поставили(
Типа это должно работать с любым загрузчиком
Огромнейшее тебе спасибо! Добра, большой зп и интересных задач!
Аналитических функций в моей БД (Sybase 9.0.2 + ASA 9.0) не оказалось, а написать альтернативу lag я пока не смог (пробовал через добавление ещё одного столбца с порядковым номером строки и последующим селфджойном со смещением на предыдущую строку и проверкой на равенство типов между строк, но что-то нужного результата пока не получил; также поэкспериментировал с rank() и dense_rank(), результата также не получил, но хотя бы наглядно понял их отличие), так что перенес данные в другую БД и воспользовался твоим запросом.
Ещё раз большое спасибо :3
Спасибо за добрые слова! Обращайся.
Ебашь мердж, если в таблице нехватает добавит, если нет обновит. Либо делай инсерт с игнором ошибок, чтоб дублей не было. Вобще я чот нихуя не понял в чём проблема то?
Если тебя смущает что данных много, то часто делают мердж только за определенные даты, скажем за сутки.
И заодно сразу спрошу: как вывести только тех продавцов которые содержаться в таблице purchase_archive?
Заебался шо пиздец
SELECT DISTINCT salesperson FROM purchase_archive INNER JOIN purchase ON purchase_archive.salesperson = purchase.salesperson;
Тоже не срабатывает, хз че не так
SELECT DISTINCT purchase.code FROM purchase JOIN archive ON purchase.code = archive.code WHERE archive.code IS NOT NULL;
Это которые есть, которых нет соответственно IS NULL
Это тренировочная задачка? Давай бд, не все же тут старшие дата инженеры в отпусках, чтобы самим данные вбивать.
LEFT JOIN то есть
Да дай ссылку на бд свою, что ты жадничаешь? Какой смысл наугад запросы придумывать, чтоб ты проверял, если можно сразу нормально сделать?
Да у меня нет ссылки, я делаю в sql 8.0, это практическое задание
Да бля сижу целый день, уже нихуя не понимаю под вечер
SELECT DISTINCT salesperson FROM purchase_archive LEFT JOIN purchase ON purchase_archive.salesperson = purchase.salesperson WHERE purchase_archive.salesperson IS NOT NULL; Так что ли?
ERROR 1052 (23000): Column 'salesperson' in field list is ambiguous
SELECT DISTINCT purchase_archive.salesperson FROM purchase_archive LEFT JOIN purchase ON purchase_archive.salesperson = purchase.salesperson WHERE purchase.salesperson IS NOT NULL;
Вроде так.
Сколько зп?
Получилось спасибо
Возьми какое-нибудь готовое решение для кеша, не надо ничего велосипедить.
Хотя чет другое поведение и трудно представить или может быть?
Нет, он просто скидывает на диск иногда или пишет в журнал, актуальная база всегда в памяти.
А как тогда сделать, чтобы и в памяти было и подгружалось из файла, если нет в ОЗУ?
Мне надо, чтобы на случай, когда очень много ключей и не влезают в ОЗУ. Тогда старые (незапрашиваемые) идут в файл откуда можно достать если что и поместить уже в ОЗУ. А часто используемые и остаются в ОЗУ, хотя и их тоже желательно иногда в файл. Такое возможно? Если да, то как? Задача ж вроде популярная, наверное.
Нет, тогда используй другую k-v базу.
Смысл редиса как раз в том, что он сидит в памяти, файлы это вообще опциональная фича.
Только первые два подходят из всего списка? https://en.wikipedia.org/wiki/Key–value_database
Можешь хранить в чем угодно, а поверху кешем редис, он как раз умеет в такие штуки.
Разжуйте, пожалуйста. Ощущение, что понял совершенно не так, как написано. Цитата из Джуба, Волков, "Изучаем PostgreSQL 10", стр. 32 (отсюда: https://postgrespro.ru/education/books):
"Но, в отличие от первичного ключа, внешний может принимать значение null. Он также может ссылаться на уникальный атрибут внешнего отношения. Допуская значения null во внешнем ключе, мы получаем возможность моделировать различные ограничения кардинальности, т. е. ограничения на количество элементов по обе стороны связи. Например, если родитель может иметь более одного потомка, то говорят о связи один-ко-многим, поскольку с одним кортежем первичного (ссылающегося) отношения может быть ассоциировано несколько кортежей внешнего."
Определение внешнего ключа: Внешний ключ - это атрибут или группа атрибутов, однозначно идентифицирующих кортеж в отношении, на которое производится ссылка (внешнем отношении).
Зачем внешнему ключу может быть нужно разрешение принимать null? Правильно ли я понимаю, что:
1. Имеем таблицы customer, service и customer_service (кот. содержит ссылки на id клиента и сервиса в соотв. таблицах).
2. У нас есть внешний ключ в customer_service, который, помимо ссылки на атрибут customer_id в таблице customer имеет ссылку на еще какой-нибудь атрибут оттуда же, например, first_name.
3. И вопрос в следующем: правильно ли я понимаю, что этот FK не может иметь null для атрибута customer_id, но может иметь null для атрибута first_name?
REDIS
Ответ на вопрос: нет, неправильно. Для начала внешний ключ должен ссылаться на потенциальный ключ.
Насчет NULL: он нужен в FK в том случае, если я хочу смоделировать отсутствие соответствия в главном отношении. Например, есть таски, есть разработчики, каждая может быть назначена какому-то одному разработчику. Пока таска никому не назначена - все бухают ее FK будет NULL.
На 34-й странице автор утверждает, что для теоретико-множественных операций алгебры необходим строгий порядок атрибутов. Грубое надругательство над Коддом.
На 37-й странице Дзюба после декартова произведения получает отношение с двумя атрибутами customer_id.
Закрыл книгу.
Нахуй такую литературу, малец. Кузнецова читай.
> Допуская значения null во внешнем ключе, мы получаем возможность моделировать различные ограничения кардинальности, т. е. ограничения на количество элементов по обе стороны связи. Например, если родитель может иметь более одного потомка, то говорят о связи один-ко-многим, поскольку с одним кортежем первичного (ссылающегося) отношения может быть ассоциировано несколько кортежей внешнего.
Это тоже звучит как бред и неудивительно что вызывает вопросы.
Сейчас я делаю так: загружаю таблицу в другой csv-файл, и каждую строку из первого файла ищу во втором. Короче, медленно. Можно ли быстрее?
Использую python (можно bash)
1) Пиухон умеет в декартовы произведения, в чем проблема?
2) SQL умеет работать с csv\json, тащемта первая ссылка в гугле:
https://docs.microsoft.com/ru-ru/azure/synapse-analytics/sql/query-single-csv-file
Хули ты суда принёс это? Пиздуй к питухонистам в тхреад
hui:DATABASE=> insert into
users (name,surname,username,email,password,datecreate,defaultcity,changeStatus,userWeather)
values ('name','surname','username','email','password','datecreate','defaultcity','changeStatus','userWeather');
ERROR: column "changestatus" of relation "users" does not exist
СТРОКА 1: ...me,username,email,password,datecreate,defaultcity,changeStat..
Вот тута select * from users, тута есть столбец.
id | name | surname | username | email | password | datecreate | defaultcity | changeStatus | userWeather
924x720, 0:03
Я не работал ни сисадмином , вообще в этой сфере не работал. Но мне человек сказал, что в SQL любой может вкатится и получать свои 120к в мск.
https://www.youtube.com/watch?v=BYCU3XyKCzA смотрю Кухаря, на 3ем уроке пошли какие то чары варчары, в общем нехуя особо не рассказывается откуда он какие то формулы берет и для чего, нехуя не понятно. Мне что просто повторять за ним как мартышка и я в итоге пойму или как ? а подскажите аноны, а то меня из дома выгонят скоро.
В каком направлении двигаться то , может кто расписать что сначала изучать начать, а что потом, чтобы дебил с 0 мог понять смысл вещей.
> Ебать, надо каждое слово с разными регистрами оборачивать в двойные ковычки, уу сука
Потому что при создании ты написал идентификатор в двойных кавычках. Пиши всё без кавычек и капсом, и проблем не будет.
> Но мне человек сказал, что в SQL любой может вкатится и получать свои 120к в мск.
Нихуя новый положняк для вкатышей.
Нет, в твоём случае это нереально, ведь в тебе ноль интереса к теме, нет образования и способностей, только жадное желание получать сотыгу всеми правдами и неправдами.
Рекомендую вкат в гей-проституцию.
я человек не жадный, высш.физ и мат я учил , образование какое то есть. Я понимаю вам лишь бы обосрать, а помочь советом кто нибудь может ?
Боимся конкуренции от такого могучего деятеля, да.
Просто вопрос максимально идиотский. Хочю стать хуй-нейм, чо делоть?
Читай книги, смотри своих цыган, потом приходи и спрашивай по сути.
Какой совет тебе дать? Советую заниматься тем, что нравится, а не тем, за что всем сотыгу платят в Москве.
> вопрос максимально идиотский
Даже конченный идиот может зарабатывать 120к в месяц, нужно всего лишь ... (продолжение в источнике)
ну так мне нравится анализ данных и тд, поэтому мне и посоветовали это. Я прошу просто дать мне алгоритм обучения, чтобы я с 0 смог иметь понимания , а не тупо зубрить как учили в школе, вот и всё. Хуле вы все такие негативные то блять
Ты плохо залетел, надо было сразу мимикрировать под джуна с горящими глазами.
Ну а мы самый нищий слой айти и к тому же двачеры, так что не удивляйся.
советов по существу не дам, всё пока
Этот гречневый порвался, несите следующего
Щас вкатываюсь в Spark. Вроде похоже нa SQL, но много всяких погромистких нюансов, создаётся ощущение, что это не SQL макак а дли мидлов бекендеров, ууу сука ъхъ.
Раскуриваю Learning Spark, 2nd Edition с орели там бесконечные триалы можно абузить, не сказать чне понятно, но очень много новой инфы, и как назло топики которые мнен ужны, в самом конце книги. Ёбаный рот это казино, я тока неделю пытался среду разработки приколхозить. Такие дела анончики
Они кстати хорошо получают, времена верстальщиков давно прошли. Всё из-за востребованности их хуйни, при этом знать надо не так много. Думаешь, почему они такие охуевшие? Кто действительно бедный - так пхп-шники и 1с-ники.
Приготовься охуенно соснуть. Спарк это JS бигдаты, финальный босс от которого твоя жопа разлетится на мелкие кусочки так что никакой хирург не соберет обратно.
А если нет, то я тебя все равно попущу на собесе. Чел, серьезно, не стоит вскрывать эту тему.
DECLARE
..x text;
BEGIN
..FOREACH x IN ARRAY (SELECT b."Key" FROM public."Bitches" b)
..LOOP
....RAISE NOTICE '%',x;
..END LOOP;
Ясно, что-то я жидко пукнул, когда решил через консолечку это делать, хотя работы на час-два было, но вроде разобрался.
Вроде сделал через FOR. Теперь вопрос, а что я должен вернуть из функции before truncate триггера? Если я верну NULL, то другие триггеры не вызовуться (так же?), new/old тут не имеют смысла, тогда что?
Ебать ты оптимизатор.
Зачем, ведь можно же просто писать count(1) кстати, это детектор конченных уебищ, ничего не понимающих в бд
Что не так с count(1)? Уже несколько раз видел негатив в сторону данного выражения. Объясните позицию.
Всё как обычно зависит от задачи. Если у тебя сотни записей и есть индекс, то быстро. Если надо посчитать миллионы записей, то имеет смысл сделать поле count и повесить триггер на delete/insert, но в таком случае ты замедлишь эти операции в несколько десятков раз, плюс поле count не поможет, если надо посчитать используя фильтр.
Те, кто пишут count (1), веруют, что это работает быстрее, чем count (*). А это неправда.
Большинство тех, кто это пишет, ни во что не веруют и просто копируют из примеров, думая, что это волшебное обозначение такое.
Зачем отдельное поле? У тебя есть поле с первичным ключём уже. Да и вобще не думаю что на count влияет содержимое поля. COUNT(1) нужно только для того чтобы посчитать без NULL для конкретного столбца. Вобще не выебывайся ,а иди смотреть план запроса.
А ёбана, я думал 1, просто номер столбца, ну не так что б жиденько, но да, слегка поддал
Ничего, бывает.
count(1) это как если бы ты добавил столбец, состоящий из единичек и сделал count по нему.
Еще крутой вопрос, которым можно душить джунов: что вернет count(null)?
Нулл нуллу волк.
>Еще крутой вопрос, которым можно душить джунов: что вернет count(null)?
Расскажи. Судя по логике остального, он как будто добавит столбец, состоящий из null, и сделает count по нему, но так как null он не считает, то получится 0.
чото мсскул сказал что %%ты пидор% нельзя нуль
Звездочка находится на цифре 8. Если учесть, что ты печатаешь ещё и скобочки, то для (*) ты нажмёшь shift + 980, все рядом. А для (1) ты будешь тянуться к единице и отжимать шифт, чтобы ее нажать.
Второй тест на уебана: where 1=1 пишешь?
1) Насколько вообще востребован SQL сам по себе? Без нормального знания какого-то ОО языка программирования есть смысл в это лезть, или без связки вообще не стоит?
2) Как понять, что ты готов пиздовать на джуна? Какие вообще задачи дают джунам? Явно же не только задания уровня сделать nное количество простых запросов с джоинами и парой стандартных функций в селекте.
Спасибо
Да, востребован и сам по себе. Есть очень много разных аналитиков или разработчиков баз данных. Но почему ты не хочешь вкатиться в настоящее программирование пока молодой?
Да, джунам в основном дают простые задачи, взрослых дядек спрашивают по кишочкам конкретных БД.
Только если динамическое спагетти собираю.
1) Вполне востребована, во всех банках пердолятся с этим говном
2) Когда можешь сложные джоины, оконные функции, немного хранимые процедуры.
psql (PostgreSQL) 13.3
А если латинские? Что-то с кодировкой небось.
Вот что-то с кирилицей. До сноса работало всё нормально. Куда копать? Может что-то с конфигами?
В таблице у меня на лету в тестах кидается запись в бд, всё в utf
>>2099130 →
Аноны, кто шарит в базоданности всей этой базоданнизациоанальной,
подскажите плиз - с чего начать, блядь?
Думаю, короче, присобачить на наноборду SQLite,
чтобы там всё реляционным было и чтобы реляционизировало
реляционность реляциональнизационно.
Есть даже такая вот dll-ка, https://github.com/username1565/System.Data.SQLite
которая билдится под шиндой, но херово билдится на mono (какая-то шляпа нипанатная, выдаётся на выходе).
В общем, как я понял, судя по исходнику, код базы где-то вот здесь:
https://github.com/username1565/nanoboard/blob/dev/nanodb.exe-source/Database/PostDb.cs
и как туда впихнть сиквелайт - хуй знает блядь.
В общем, интересует всё, струкура таблиц там, индексы-хуиндексы,
репликационность, шардинг, ну и собственно базоданность заебенчатая, чтоб летало всё и не бузило.
Опционально, криптование базы, чтобы мусор не спиздил инфо.
Шифрование думаю тупо сделать AES, а инфу хранить в blob'aх, но это уже второстепенное всё.
Надо короче набросать план, а с чего начать не знаю, блядь.
Походу мне надо кто-то, кто шарит в проектировании баз данных, для датацентров пиздатых,
потому что в будущем, база нанопостов такого глобального проекта как наноборда,
он может занимать целые пиздатые подземные лаборатории в замкнутых экосистемах на различных экзопланетах.
Пусть есть таблица, реализующая дерево.
| ID | parentID | data |
Для каждого ID, здесь, существует, один и только один parentID.
Вопрос. А возможно ли, каким-либо образом, реализовать связь один ID -> много parentID, сделав это, с сохранением обратной совместимости с этой вот таблицей?
Первое, что приходит в голову, это включить дополнительные parentID's внутрь data, но тогда придётся парсить data для каждого ID. Может есть способ попижже, через какую-то дополнительную таблицу, заебенить сие, но сделав это так, чтобы эту вот таблицу не передёргивать, чтобы новый способ был как-бы опциональным, и мог не работать, но эта шняга чтобы гарантированно работала, как и прежде... Мм?
Да, никакого волшебства здесь нет.
Сначала считать все строки, потом сделать count, потом применить к нему условие.
Во втором случае сразу ограничиваешь количество строк, которые читаешь, поэтому быстрее.
Никаких подводных нет, вопрос только, нахуя тебе это нужно? Проверить, есть ли в таблице 100 записей? Ну ок.
>нахуя тебе это нужно? Проверить, есть ли в таблице 100 записей?
Типа того. Пишу борду (судя по посту несколько выше не я один), и так как сортировка тредов на доске у меня начала подпердовать уже на 300к постов (~100мс), то я принял волевое решение добавить в тред поле lastBump и повесть на инсерт поста триггер, который обновляет это поле. Соответственно триггеру надо проверить количество count(*) > bumpLimit и решить поднимать тред или нет. Конечно в моем случае не будет разницы между количеством постов и лимитом в 1000 раз, когда разница в скорости подсчета становится заметна (пока писал подумал, может еще добавить поле с количеством постов и два триггера на инсерт/делит хм.. Стоит ли?), так что вопрос скорее возник из спортивного интереса. Допускаю что я пошел совсем не тем путем, я совсем зеленый и "проектирую" все на ходу. Зачем я высрал этот пост? ХЗ.
>Зачем я высрал этот пост? ХЗ.
Нет-нет, очень интересная проблема.
Но с триггером хуйня затея, очень большие накладные расходы, если заниматься этим на каждом посте.
Не хочешь повесить джоб, который запускается раз в 5-10 минут и тред все треды, в которых больше определенного количества постов и последний бамп был определенное количество минут назад?
Кстати, обрати внимание, как двач сделан.
Есть уникальный ID поста и есть номер поста в рамках треда.
Может быть, тебе будет проще поддерживать номер поста и не поднимать, если номер нового поста больше 500?
>>102318
>Но с триггером хуйня затея
Ты про триггер, который lastBump ставит? Так это поле очень полезно: имея индекс (доска, бамп) можно очень быстро получать какие треды должны быть на какой странице. Плюс на главной показывать последние обновленные треды. В общем-то вот эта сортировка тредов на доске по последнему бампу с учетом сажи и сжирала 100мс.
>джоб, который запускается раз в 5-10 минут
Вообще есть такое желание, толко не тереть а отправлять в архив, например в виде json'a. Но до этого мне еще пердолить и пердолить.
Например на форчане 10 страниц по 10 тредов + n тредов, которые утонули, но еще доступны по ссылкам, хуё-мое, получаем ну пусть 300 тредов по 500 постов. итого 150К постов, т.е. рядом теми 300К, которые я тесстировал.
>Кстати, обрати внимание, как двач сделан.
>Есть уникальный ID поста и есть номер поста в рамках треда.
О, а тут у меня совсем наркомания. Я ковырял vichan на гите и там в бд для каждой доски своя таблица постов и нет сущности тред (там у постов есть поле parentId - ссылка на оппост, приреплен ли тред тоже свойство поста), но мне такое не очень понравилось, все-таки тред это тред, а пост это пост. Так вот, что бы сделать раздельную нумерацию постов на досках, я при создании доски (через триггер) создаю и sequences для каждой доски и при постинге посту (снова через триггер) устанавливоется поле Number. А насчет номера поста в треде, его же все равно надо вычислять (да банально max() + 1) и при удалении постов мочей придется сдвигать нумерацию. Хотя это наверняка будет быстрей, чем каждый раз count() делать.
Кстати насчет tinyboard, там хитро сделано, что сами треды дублируются в виде фалов на диске и автоматически обновляются. Т.е. при запросе отдаются статические файлы и база практически не напрягается. Такой вот ультимативный кэш.
Хочется сделать приличное ядро и при этом не тупо копировать у других, но возможно я замахнулся на то, что мне не под силам. Но в любом случае, как говорится, обосраться - тоже опыт.
И в чем отличие треда от поста? Ничем. Во многих движках тред и пост - это одна сущность.
>в чем отличие треда от поста?
На мой взгляд, прикреплен ли тред, заголовок треда, является ли тред ридонли и прочие прараметры хранить в таблице постов неправильно, они же могут быть применены только к оп-посту. Как-же нормализация БД?
>Во многих движках тред и пост
Знаю, вон даже номер треда это номер оп-поста.
Нихуя не понел.
То есть, надо просто ещё одну таблицу сделать
| ID | DataID | parendDataID |
сформировав как-бы набор-данных из этих двух таблиц,
и её уже наполнить, парся data для каждой заПИСИ?
Есть какие-нибудь средства для этого (MS SQL Server) - и да, я не шарю в девопсе и про базы данных знаю только на уровне команд SQL, поэтому мне надо попроще
при чем тут это? я спрашиваю как узнать что и где изменилось в базе данных.
То есть в закрытой проге я нажимаю кнопку, она вносит какие-то изменения в таблицы базы данных
и вот я хочу узнать - какие изменения - какие таблицы были изменены, что в них записалось и т.д.
В SSMS, про который тебе ответили выше, есть SQL Server Profiler.
Ты им подлкючаешься к БД, настраиваешь нужные параметры (что именно логировать, для какого клиента и тд), запускаешь свою закрытую прогу и смотришь в профайлере все запросы, которые она шлёт.
спс, попробую
table1 100
table2 500
Сейчас вывод:
+----------+
| COUNT(*) |
+----------+
| 219775 |
| 2859 |
| 109 |
| 2896 |
| 1059 |
+----------+
Т.е. как добавить в результат имя таблицы
Хардкодом написать.
Можно динамически строить запрос, с начало запрашиваешь имена таблиц, потом из этих имен клепаешь запросы, в том числе одно из полей имя таблицы. Название таблиц берешь либо из системной таблицы либо создаёшь свою настоечную таблицу.
Из знаний, ВУЗовский SQL 92, пинус и доебавший EF Core.
Хочется узнать:
- Принципы работы PostgreSQL под капотом
- Как работают индексы с примерами "вы обосрались"
- Мониторинг, логирование
- Репликация и масштабирование
- Проектирование
Я не знаю чо я хочу. Я хочу чтобы можно было самому себе сказать, что я знаю как это делать и не было стыдно перед работодателем и собою. Чтобы я мог в целом предсказать поведение СУБД, а не рассказывать что дропать индексы ради переименования или джойнить жопой медленно, потому что пук.
Есть какой-нибудь адекватный план по вкатыванию путем книжек, курсов, etc?
По сути только https://www.postgresql.org/docs/books/
Бери любую да читай, но хз мб двач подскажет че-нить
В особенности при добавлении FOREIGN KEY
> хочу вкатится в условное DBA по PostgreSQL.
У постгрес про есть пиздатый курс дба на русском. Только нахуй тебе, потенциальному разработчику, DBAшные знания?
Пытался добавить запись в таблицу из php и получаю:
Unique violation: 7 ОШИБКА: повторяющееся значение ключа нарушает ограничение уникальности "elem_pkey" DETAIL: Ключ "(id)=(1)" уже существует
Какого? Оно же само должно увеличиваться? Мне что блять, самому ещё туда уникальное id заносить?
Его и нет в инсерте, это уже sql пытается подставить ID=1, хотя в таблице уже есть две записи.
Ну значит криво сделал схему, проверяй.
> У постгрес про есть пиздатый курс дба на русском
Можешь кинуть ссылку или название курса?
> Только нахуй тебе, потенциальному разработчику, DBAшные знания?
У меня основной профиль информационная безопасность, поэтому сижу на двух стульях одновременно - администрирование и программирование. Если говорить на языке зумеров - SecDevOps, Security Champion или DevSecOps.
Более реальный кейс - System Architect. Ну и чем хуевей проект (стартап или отсуствие денег), тем мультизадачней тебе надо быть
P.S. Или есть какой то синтаксис, что бы можно было вставлять строку с условием? Ну то есть если условие выполняется, то вставка работала, а если нет - то нет. Что б это в одном запросе как то было...
> В общем всё сделал, но вылазиет фигня что так как многопоточно, то получаются лишние резервации, сверх запаса.
Раз тебе на тесте сказали сделать что-то многопоточно, то скорее всего подразумевается, что ты будешь использовать транзакции, определишь границы транзакций, выставишь уровни изоляции и т.д.
Лишние резервации сверх запаса получаются из-за того, что чтение количества резерваций и запись (добавление) резервации выполняются не атомно. Нужно чтение и запись резерваций объединить в одну транзакцию.
Ещё бы назвали всех китайцев Чин-чонгами.
Ты уже ебанулся с утомлением от толерастов.
Если бы было айвен фром мухосранск то было бы неполиткорректно?
А что не так? Хуан, Джон и Иван стандартные шаблоны имён. Имя апостола Иоанна на разных языках тащемто.
Даже Шон - это ирландский Иван.
Транзакции не помогут, как я понимаю.
Я засунул весь процесс в одну хранимую функцию. Если вкратце, она сначала смотрит запас, потом вносит резервацию, потом проверяет снова запас, и если бронь таки получилась лишней, то удаляет её. По сути копия транзакции (не делал напрямую транзакции, потому что требуется использовать процедуру, а мне нужна была функция, что бы показывало итоговое количество резерваций) Но всё равно, вылезают лишние резервации.
Как я читал про постгри, про её работу с многопоточностью, то там получается каждый поток работает с копией бд, а потом результат синхронизируется.
Условие задания такое, что бы была многопоточность.
Поиск 1)
SELECT FROM database WHERE MATCH (text) AGAINST ("+word1 +word2 -word3" IN BOOLEAN MODE)
26 rows in set (20.26 sec)
Поиск 2)
SELECT FROM database WHERE text LIKE "%word1%" AND text LIKE "%word2%" AND text NOT LIKE "%word3%"
32 rows in set (5.04 sec)
Так и должно быть? Вроде пишут что первый метод быстрее
И ещё чем почему все крупные компании не используют MySQL а используют другие БД?
Ну мне кажется логично, что второй метод быстрее. В первом он фактически проверяет соответствие всем трём условиям сразу, а во втором, если первое не подходит, то он второе уже не проверяет, например.
Нужен какой-то запрос в БД, который выполнится даже если он запущен из под пользователя, у которого вообще ни каких прав в базе нет.
Мой говнокод работает через Qt и QSqlQuery.
Грубо говоря, процесс ввода логина пароля - это просто их запись в оперативную память компьютера.
А дальше прога в работе либо выдаёт ошибки (если ты не залогинен, либо нет доступа), либо работает нормально.
Мне надо сделать какой-то запрос, чтобы после клика по кнопочке "Войти" он писал - удачно я вошёл или нет.
А для этого нужно отправить какой-нибудь запрос в БД. Но городить костыли в виде if-ов, в которых проверяется доступ хотя бы к одной базе - вообще не хочется
>костыли в виде if-ов
Это и есть программирование, разве что исключения попробуй, что по сути оно же.
Ты еще здеся?
Как аппа инсертит логи в КХ? Апп => (RabbitMQ/вставить нужное) => Bulk-Insert в КХ?
Id, ParentId, Name...
Как можно в определении таблицы сделать ограничение на ParentId так, чтобы он был либо NULL, либо соответствовал одному из уже имеющихся Id в этой же таблице?
PostgreSQL - это open source.
Что мешает посмотреть исходники и разобраться?
Книги - это втор. продукт уже.
Есть схема пиклередй.
На всякий случай ещё раз опиши текстом, есть три таблицы, в одной хранятся данные, какие-то нормы, скажем артериальное давление, оно бывает двух типов верхнее и нижнее, соответственно тип вынесен в отдельный справочник. Так же в отдельную таблицу вынесен период действия этих норм, условно в январе одни нормативы, в феврале другие. Но у нас ещё есть скажем температура тела, но так как он не привязана к типу, мы ебашим его прям в периоды. Да, по мне как гавнодизайн, но вопрос не в этом:
1) В каком НФ находятся синие таблицы?
2) Чем это черевато?
3) Какие весомые аргументы есть в пользу нормализации и вынесения второго набора нормативов в отдельный справочник.
Мне кажется это BCNF
Зачем же нули, если можно null.
дата, кол-во записей
например
2021-07-20 100
2021-07-21 120
2021-07-23 97
Можно
rftm "group by" + count
| ID | A | ID | B |
Я не хочу гонять сам запрос от клиента к бд, поэтому решил сделать функцию. И не хочу усложнять маппинг, поэтому хочу столбцы с оригинальными названиями.
Так не делай parentId not null o.O
А можно ткнуть меня лицом в доку по этому пайпу? Гугл выдает раздел про pipeline, который относится к старой версии постгреса, в новой версии такой страницы нет вообще
На орели есть видео где дед сам рассказывает
А что сейчас модно? Видяшка на ютубе от Алёши Писюнкова?
pg sql
Есть две табы, связь один ко многим.
Я делаю запрос на получение данных из первой табы, но мне также нужно подсчитать число записей во второй таблице, относящихся к первой таблице, и при этом подсчитывать надо только те, у которых значение поля free = false.
SELECT
table1.id,
table2.number_free_seats,
FROM
table1
LEFT JOIN table2 ON
table2.table1_id = table1.id
WHERE table1_id = $table1_id
ORDER BY table1.id
Я не понимаю, где и как тут правильно подсчитать count? Как его вообще отнести именно к таблице table2 и как при этом подставить "case when free = 'null' then 1 else null end", или это надо делать через where?
И даже если я просто подставляю count(table2.id) без выборки по соответствию поля free = false, но на это получаю:
>столбец "table1.id" должен фигурировать в предложении GROUP BY или использоваться в агрегатной функции
(У МЕНЯ ЭТО УЖЕ СДЕЛАНО, почему мне это пишут?)
Пишут, что такую ошибку надо исправлять тем, что делать count прямо в left join, а результат равнять какому-то полю, и это поле запрашивать в select, но у меня для этого нет никакой поля в table2...
Шиз, спок. Щас бы читать алгебраическую теорию тривиальной хуйни, которую можно на пальцах объяснить.
SELECT
table1.id,
(select count(*) from table2 t2 where t2.t1_id = t1.id and not t2.free) as number_not_free_seats,
FROM
table1 t1
ORDER BY table1.id
Вы видите копию треда, сохраненную 1 августа 2021 года.
Скачать тред: только с превью, с превью и прикрепленными файлами.
Второй вариант может долго скачиваться. Файлы будут только в живых или недавно утонувших тредах. Подробнее
Если вам полезен архив М.Двача, пожертвуйте на оплату сервера.