- две функции которые делают нужные преобразования.
Но практически - моя постановка изменилась и сейчас сводится к работе с JSON-arrays которые лежат
в ячейках таблицы. Для них collect/explode мне не подошел. А подошли функции transform и cast.
Часть из них доступны начиная со Spark 3.1.1 и Databricks 9.1.x-LTS Runtime. Поэтому надо модернизироваться срочно.
Обычно там где танцует Go - там рядышком docker/kubernetes. Тоесть не проблема очень быстро поднять тестовую БД, наполнить ее данными и сразу прогнать все тесты по DAO.
Иного способа протестировать DAO я думаю не существут. Смысл DAO - доступаться к внешним источникам данных. Если его мокать - то это уже не тестирование DAO а тестирование логики следующего уровня. Бизнес-логики и прочее.
Данные из таблиц как всегда удаляются через DELETE FROM table ... но если есть ограничения констрейнтов - то надо указать опцию CASCADE.
Вообще в очень сложных и много-уровневых БД необычайно тяжело что-то удалять. Иногда удаление одной строки вызывает долгий процесс проверки зависимостей. Особенно на массовых удалениях.
Поэтому учитывая специфику системы я предлагаю вообще не удалять а просто ставить статус. Например если машина угнана, продана или лежит на свалке или разобрана за зап-части - то нужно соотв. Поменять ей владельца или статус.
Изучать SQL как сферический язык в вакууме - нет особого смысла. Особенно если ты спрашиваешь про хинты. Хинты - это опция конкретной реализации DBMS. У Оракла - свои хинты. У Microsoft - свои. И знания между ними - совершенно не переносимые. И сами хинты кажется не стандартизированы в SQL стандарте. Здесь я могу ошибаться - пускай знающие подскажут.
Вобщем если ты где-то уже работаешь и вы используете конкретную БД - то бери и читай по ней.
Я в своё время тоже искал теоретическую литературу по оптимизации SQL. Нет толком ничего. Есть Ден Тоу. Настройка SQL для профессионалов. Он пытается подогнать под оптимизацию свою теорию. Считает селективности и кардинальности для суб-запросов и рисует "облачки" - диаграммы пытаясь вывести формулу cost. Но это всё не работает. Это разбивается о практику. Ни одна практика Oracle/PG/MSQL/MySQL не подрверждает эффеткивности диаграмм Тоу. Вобщем я зря потратил время на чтение этой книги. И тебе не советую.
Изменял change-sets грязными руками? Этого нельзя делать. То что установлено в репо - маркируется контрольной суммой и нельзя фиксить задним числом. Создаёшь новый changeset который исправляет.
Данный вопрос никак не решается в scope знаний об чистом языке SQL.
Здесь надо смотреть конкретную DBMS (Postgres/MySQL) и смотреть какой она выбрала план.
Более того. Знания о том как сработал Postgres нам не дают никакой подсказки о том как это сработает
в других системах.
Обычно так не делают. Просто БД предоставляет слишком много доступа для ползователя. Тут надо решать вопросы и SQL инжекций и инфобезопасности. А то так любой дурак сделает 'drop database' просто получив в руки браузер.
Тут нечего думать. Смотрите что показывает explain plan и меряйте время отклика.
SQL как язык - это чистая теория. То есть известен результат но неизвестно каким способом конкретная dbms его достигает. Операция explain будет зависеть от выбора dbms (Oracle, Postgres e.t.c) и будет по разному показывать реализацию алгоритма выборки для каждого select.
Спрогнозировать как будет выглядеть план сложно. Даже разные версии Oracle к примеру могут показать разный план на одном тексте запроса.
Нужно помнить о том что между вычитыванием 1-й и 2-й страницы таблица могла быть изменена. И процесс может либо пропустить какую-то строку либо прочитать дубликат. У этой проблемы есть много решений. Почти все они лежат в плоскости транзакций. Но поскольку тема тегирована только SQL - то непонятно с какой dbms мы имеем дело. Реализация режимов транзакций - вещь крайне нестандартизированная.
Тоесть чтобы обсуждать правильный pagination нам нужно понять что по ту сторону application. Oracle? MSSQL? e.t.c.
Если ты разбиваешь 1 запрос на 3 мелких - то тебе нужно оборачивать их транзакцией или доказывать что между запросами не будет посторонних модификаций данных. Иначе 3 запроса не будут эквивалентны первому. Это кстати типичная джуниорская ошибка - неучет ACID.
Тут надо сначала смысл разобрать. Вот как ты себе понимаешь что магазин открылся в 22.00 а закрылся в 5.00 ?
Закрылся в 5.00 утра следующего дня? Работал всего 7 часов. Это один кейс. А другой кейс - если свапнуть время - то получается что работал 15 часов. Выводы? Свапать нельзя никак.
А вот когда смысл проверки мы поймем - тогда можно и код писать. В крайнем случае - хранимую функцию написать.