Задать вопрос
Ответы пользователя по тегу SQL
  • Как эффективно использовать HQL при запросах сущностей с множеством связей?

    mayton2019
    @mayton2019 Куратор тега Java
    Bigdata Engineer
    У меня - сходу замечание по твоему стилю. Зачем ты переменную card переписываешь? Это сбивает с толку.
    List<Card> cards = .....
    
    cards = entityManager

    Нельзя одну переменную брать в двух ипостасях. Сэкономил в одном - проиграл в читаемости.

    Второе я думаю что эта задача прекрасно решается одним SQL-запросом. Так было в продуктовых системах с 2000х годов когда еще не было этих ваших ORM/Hibernate. И все нормально работало. Поэтому делай все одним запросом. Не думай о накладных расходах в базе. Мой опыт показывает что база - лучше справляется когда выбирает все данные сразу одним курсором (запросом).

    А игры с Lazy-Eager которые придумали в ORM решают проблемый самого ORM и ApplicationServer а базе они вобщем-то не нужны.

    Если ты собрался глубоко заняться оптимизацией - посмотри лекцию Алименкова особенно в части трассировки Hibernate запросов. Собери цифры. Сколько карточек на 1 акк в среднем? 1 или 10 или 1000? Сколько транзакций на акк? Это все влияет на смыслы оптимизаций.
    Ответ написан
    6 комментариев
  • Можно ли переносить данные базы данных через phinx?

    mayton2019
    @mayton2019
    Bigdata Engineer
    Типа можно накатить изменения и также безопасно откатить.

    По поводу безопасного отката. Это на 99% зависит от SQL кода который вы напишете. Это никак не связано с фреймворком поддержки миграций. Берите какой угодно фреймворк. Например liquibase или flyway.

    И даже в них если во время alter table rename column вы столкнетесь с активными сессиями в БД - то ваша транзакция переименования упадет и вы будете вручную решать ситуацию отката или наката.

    Безопасность наката и отката также зависит от грамотности описания ваших чендж-сетов. Бывает так что в 1 чендж-сет запихивают 2 DDL команды и одна из них проходит а вторая не проходит и фреймворк повисает навсегда в клинче. Двигаться назад он не может т.к. Не был применен чендж-сет. И двигаться вперет тоже не может т.к. первая DDL команда уже выполнена и повторо ее вызывает ошибку типа "table/index already exists".

    Выводы - грамотность описания чендж-сетов. И все.

    Ваш фреймворк phinx выглядит ужасно с точки зрения кода. Как по мне он не делает главной задачи а именно - не является DSL для upgrade/rollback. Он - прибит гвоздями к PHP и следовательно его можно рассматривать только под углом вашего PHP-удобства. Удобен он вам? Используйте.
    Ответ написан
    Комментировать
  • Что лучше, по одной или несколько записей при INSERT?

    mayton2019
    @mayton2019
    Bigdata Engineer
    Имеется система логов, которая довольно часто вызывается, при пиковых значениях достигает до 30-40 записей в секунду. Использую engine ARCHIVE, сервер MariaDB, подключение по unix сокету.

    Имеет ли смысл собирать кучу данных допустим 50 записей и потом одним запросом добавлять 50 записей.

    Смотри. Писание логов в Марию - это как по мне лишнее. Оверинжинеринг. В наше время логи собирают logstash-ем и пишут в Кибану. Там для каждого формата есть свой парсер. Для Ninx, Apache e.t.c.

    Если тебе прям сильно-сильно надо писать логи в реляционную систему (очевидно что-то джойнить с логами) - то пиши максимально большой пачкой. Хоть 1000 штук. Сколько позволяет размер фрейма в этом unix socket. (Кстати какой он там?) А чорт его знает. Но.... если ты записал 999 записей а последняя еще не пришла, а тебе срочно нужно глядеть в базу - тогда делай периодически сброс по времени. Например через 3 секунды от начала пачки ты будешь делать insert независимо от того сколько строк накопил.

    Вот так.
    Ответ написан
    Комментировать
  • Как экранировать все «'»?

    mayton2019
    @mayton2019
    Bigdata Engineer
    В современном мире, если вы используете bind-variables или нормальные ORM-фреймворки - то вам ничего нигде не надо экранировать. Пользуйтесь коробочным продуктом и не изобретайте своих SQL билдеров.
    Ответ написан
    Комментировать
  • В чем суть отличия двух SQL запросов?

    mayton2019
    @mayton2019
    Bigdata Engineer
    Автор да ты издеваешся наверное? Ты можешь взять в среде разработки и
    открыв два файла просто посмотреть difference и среда подсвечивает в чем различия.

    И приведи к одинаковому case символы и отформатируй. Всё будет видно.
    Ответ написан
    3 комментария
  • Как можно ускорить запрос или какой индекс использовать?

    mayton2019
    @mayton2019
    Bigdata Engineer
    Ну во первых смысл неправильный. У тебя - взаимоисключающие предикаты. Поэтому надо использовать OR.
    Уже написали выше про это.

    Попробуй так. Должно быть быстрее.

    SELECT * FROM data WHERE name LIKE "Иван%";

    И построй индекс по name. А лидирующий метасимвол % лучше не ставить т.к. это отключает
    возможность использования классическийх B-Tree индексов.
    Ответ написан
    Комментировать
  • Как сделать изменения одной колонки?

    mayton2019
    @mayton2019
    Bigdata Engineer
    Тебе нужно что-то вроде.

    UPDATE peopletable SET columnName = 'value'  WHERE some_key = 'keyvalue';
    Ответ написан
    Комментировать
  • Какой sql запрос нужен чтобы получить последнюю дату события для каждого домена?

    mayton2019
    @mayton2019
    Bigdata Engineer
    Возможно это не простая таблица а Google Big Table. Тогда обычные практики оптимизации SQL могут плохо работать. Я-бы предложил не использовать group by а переписать с window functions если gbt это поддерживает. И посмотреть как партицирована таблица. Возможно под специфичный query стоит сменить partitioning если там он дефолтный или неудачный.
    Ответ написан
    Комментировать
  • Может ли у одной родительской сущности быть несколько дочерних сущностей со связью категории 1-1?

    mayton2019
    @mayton2019
    Bigdata Engineer
    А если я приду чинить 2 вещи сразу?

    У меня 1 заказ но 2 предмета. Один - ювелирка. А другой - из спортивного инвентаря. А потом мне одну вещь починят. А по второй будет отказ. Как это все трекать?
    Ответ написан
    Комментировать
  • SQL может ли быть несколько миграций первичного ключа?

    mayton2019
    @mayton2019
    Bigdata Engineer
    Нет предела копированию. Делай столько, сколько надо для нужд бизнеса. Только смотри чтоб аномалий не было.
    Ответ написан
    Комментировать
  • Как автоматизировать импорт файлов с данными через HeidiSql?

    mayton2019
    @mayton2019
    Bigdata Engineer
    CLI есть и их много.

    Если это Oracle то для импорта можете использовать SQL*Loader. У него - кучас настроек.
    Если Postgres - то это консоль psql в которой надо делать
    COPY sample_table_name
    FROM 'C:\sampledb\sample_data.csv' 
    DELIMITER ',' 
    CSV HEADER;


    P.S. Почему авторы никогда не указывают тип DBMS (c) ?
    Ответ написан
  • Как сделать запрос в запросе в SQL?

    mayton2019
    @mayton2019
    Bigdata Engineer
    Order by стоит не там. Вообще если хочешь в одном SQL запросе использовать несколько изолированных - то
    попробуй Inline Views (или еще их называют common table expressions). Типа такого

    WITH T AS (SELECT * FROM EMPLOYEE WHERE dept = 'Sales')
    SELECT * FROM T WHERE name = 'Ava';
    Ответ написан
    Комментировать
  • Как менять тип SQL структуры таблицы в RedBeanPHP?

    mayton2019
    @mayton2019
    Bigdata Engineer
    Попробуй
    ALTER TABLE table_name
    MODIFY column_name datatype;

    и вообще надо указывать тип DBMS (это влияет на диалект SQL и на возможности).

    Alter не всегда срабатывает и воообще его нужно применять осторожно.
    То что прокатит в PG может не пройти в Oracle.
    Ответ написан
    Комментировать
  • Как исправить синтаксическую ошибку в команде SQL?

    mayton2019
    @mayton2019
    Bigdata Engineer
    Надо сделать так.

    CREATE DATABASE pav_7281 DEFAULT CHARACTER SET utf8 COLLATE utf8_general_ci


    UPD:
    Ответ написан
  • Как через sequelize-typescript создать связь 1-к-1 с возможностью каскадного удаления?

    mayton2019
    @mayton2019
    Bigdata Engineer
    1:1 - это плохая идея с точки зрения БД. Создайте просто одну таблицу и разделите ее условно на 2 части.
    Это будет работать быстро и эффективно. И никаких JOINS. Несуществующие поля - заменяйте на nulls.

    C sequelize-typescript я не работал. Не знаю как оно там. Но лучше не создавать технических долгов еще на проектировании. Потом вам легче будет жить.
    Ответ написан
    1 комментарий
  • Стоит ли изучать sql, или же сразу заняться изучением ORM?

    mayton2019
    @mayton2019
    Bigdata Engineer
    Стоит ли изучать sql, или же сразу заняться изучением ORM?

    Все люди которые ратуют за использование ORM с годами все равно приходят к очень сильной
    и мотивированной необходимости знать SQL. Этот язык сегодня является латынью баз данных.
    Вы сможете говорить с бизнесом на одном языке если будете в переписке активно использовать
    например язык DDL таблиц. Ваши аргументы будут выглядеть убедительно если в переписке будут
    фрагменты например любой консоли MySQL, psql, SQL*Plus e.t.c. Короче знание SQL - это признак
    джентльмена. Путь в приличное общество.

    И наоборот, вы будете вообще НЕПОНЯТЫ если попробуете показать ORM объект на Node или не дай
    бох на Java/JPA техниках аннотации. Бизнесу эти аннотации неинтересны и неинформативны.

    Да и вам самомму смоделировать любой сложности выборку или отчет будет бытрее в SQL чем в фрейморках
    ООП-отображения.

    Что касаемо перформанса. К сожалению все современные ORM реализуют только самые базовые возможности
    оптимизации запросов. Насколько я знаю Hibernate (по состоянию на 2015 год) так и не умел обращаться
    с Oracle Hints. А любой сложный ентерпрайз начинается там где вы выжимаете из запроса не 100 а 1000%
    возможностей. И здесь вам нужно управлять проприетарными функциями воздействия на оптимизатор.

    Вообще для меня например цикл оптимизации ORM запросов начинается с того что я выбрасываю из
    стека ORM. Заменяю на native. И долго наблюдаю его и оптимизирую. И когда достиг критерия готовности
    то пытаюсь затащить обратно в ORM. Иногда не заходит. Это те случаи когда ORM оказался плох.
    Эти случаи сложны, синьорны. и по каждому из них можно здесь в хабре открывать статью как минимум.

    Но не все так плохо. Существует взгляд на ORM с обратной стороны. Это фреймворки наподобие MyBatis.
    Они в первую очередь решают проблемы БД а уж потом дают опции объектных возможностей. Короче
    Батис - это ОРМ наоборот. Где эволюция системы идет не от кода к БД (как любят хипстеры) а от
    имеющихся вызовов процедур
    и запросов к объектам респонса.
    Ответ написан
    5 комментариев
  • Как перенести EAV на jsonb в postgres?

    mayton2019
    @mayton2019
    Bigdata Engineer
    Если ты говоришь о нормализации - то никак. JSON не предполагает никаких ссылочных связей внутрь документа. Считай что JSON - это денормализованная копия БД. Как с этим жить - большой вопрос. И его надо обсуждать поняв что тебе на самом деле нужно. Потому что конвертация EAV в JSON это какая-то странная очень узкая задача. Может тебе на самом деле это и не надо.
    Ответ написан
  • Какой приоритет у OR?

    mayton2019
    @mayton2019
    Bigdata Engineer
    Если не знаете приоритет - то всегда можно поставить скобки. Это решает проблемы и не несет накладных расходов.
    Просто код становится на 2 символа длиннее.

    SELECT ..... FROM .... WHERE (CODE: `id` = value OR `code` = value) .... other predicates....


    Update:

    Если тебе надо гарантировать что поле не пустое - то добавь еще один предикат IS NOT NULL.
    Ответ написан
    9 комментариев
  • Какая нужна модель для описания каждой конкретной монеты на счету?

    mayton2019
    @mayton2019
    Bigdata Engineer
    Проще всего вести лог транзакций монет по всем пользователям. В сущности User можно оставить только баланс.
    А если кто-то захочет посмотреть какие есть монеты - то можно проверить лог по пользователю и собрать отчет.

    Вобщем надо исходить из предположения что такой запрос будет не очень частым.
    Ответ написан
  • Как вывести строки содержащие кириллицу?

    mayton2019
    @mayton2019
    Bigdata Engineer
    Вот так работает. На MariaDb.

    SELECT * FROM test WHERE n REGEXP concat('[',(_utf16 0x430),'-',(_utf16 0x44f),']');


    Собсно и первый вариант у меня тоже работает. Скорее всего ты сломал кодировку либо при создании
    таблицы (дефолтная была национальная) либо во время insert либо во время select.
    То что показано на экране - не является
    пруфом. Потому-что мы видим кириллицу уже адаптированную для экрана. А чтоб разбираться в проблеме
    надо как-то смотреть через линзу двоичной системы.
    Ответ написан
    Комментировать