1. На счету пользователя 1000 р. Первая транзакция: читает 1000 на счету, пытается снять 1000. Вторая транзакция тоже читает 1000, хочет снять еще 500 р. По результату уходим в минус. Как обойти ситуацию? -Если хотим решить ситуацию, но оставить уровень транзакции READ COMMITED?
#
2. На уровне Repeatable Read или Serializable транзакция начинает обновлять запись, но сама транзакция еще не завершается. Могут ли две транзакции друг друга заблокировать? Как называется, как с ней быть? - deadlock
#
3. По бизнес-логике нужно часто делать запросы по точному совпадению фамилии доставать пользователей. Ты хочешь повесить индекс на это поле для повышения перформанса. Какой тип индекса лучше подойдет? - А хеш-индекс подойдет? - Если поле не фамилия, а номер счета, но не primary key? - Если поле updated_at timestamp, хочу посмотреть все данные, которые были обновлены за последний час, либо за вчерашний день, какой индекс лучше подойдет? - BTree, потому что отсортированное дерево
#
4. Как резделять данные по шардам, если есть 4 инстанса, мы берем данные из uuid. А потом захотим добавить 5 инстанс, придется переложить заново? - Альтернатива координатору для распределения по шардам (если координатор упадет, потеряем данные ко всему)
#
5. Liquibase. Как действовать если не знаем, какая БД в проде. Боимся, что что-то произойдет при накатке. Хотим сделать себе возможность откатить изменения
#
6. Есть таблица, 2 поля: айди и количество лайков. Как бы ты сделал увеличение счетчиков лайков на 1?
#
7. Какой-то запрос читает данные, в это время другой изменяет данные в бд. Какие данные к нам прийдут?
#
8. Создали индекс на поле, делаем запрос на это поле, а индексы не сработали. Такое возможно?
#
10. Есть атрибут state, на нем есть индекс. Подхватится ли индекс при запросе с проверкой state на Null?
#
11. Из таблицы удаляем автора. К автору прицеплено 10 книг. К кому будут прицеплены эти книги? Что будет с id автора?
#
12. Почему нельзя сделать две БД на запись и на чтение?
#
13. Как из запроса с группировкой выбрать одну группу? Например, чтобы сумма была больше чего-то?
#
14. Большая таблица на миллион записей. Обеспечить быстрый доступ к данным. В таблицу много пишем. Как совместить?
#
15. Как удалять быстро и много данных из БД? Удаление по дням. Как можно реализовать?
#
16. Как ограничить размер выборки? Запрос должен вытащить n записей. Как реализовать?
#
17. Есть таблица с данными. 10 полей. Есть выбор сделать 10 индексов по одному полю или один индекс по десяти. Как лучше?
#
18. Представь, что у нас много компаний сидят на одной БД и у нас в каждой таблице есть колонка с кодом компании. Любой WHERE начинается с наименования компании. Означает ли это что нужно повесить индекс на колонку с компаниями?
#
19. Есть два апдейта. Есть пользователь и баланс на счете. Первый апдейт снимает с него 50 рублей. Второй апдейт снимает 50 рублей. Они выполняются одновременно или последовательно? Есть ли какие то механизмы управления?
#
20. У нас есть очень длинная транзакция с большим количеством селектов. В конце один апдейт. Что сделать, чтобы заблокировать данные на этапе когда я их селекчу.
#
21. Что будет если мы делаем селект в одну таблицу, но у таблицы есть много ссылок на другие таблицы. Один ко многим. Что делать, чтобы объединить таблицы и был только одни запрос
#
22. Представь, что ты проектируешь таблицу. Как ты в самом начале накидываешь индексы?
#
23. Уровень изоляции Repeatable read. Две транзакции работают. Будет Lock на чтение, на запись или на то и на другое?
#
24. Твой запрос перестал работать через некоторое время. Твои действия?
#
25. Есть таблица с данными. Кредитные заявки. Есть некий кредитный статус. 3 штуки. New, in progres, close. Нам нужно написать миграцию, которая будет доставать заявку по статусу и их мигрировать. Миграция подразумевает изменение статусов. Какие проблемы могут появиться и как их решать? Рассматриваем один поток. Данных очень много и нельзя все вытаскивать скопом.
#
26. Таблица пользователей и таблица машин. Связь один-ко-многим. Где здесь N+1 запрос?
#
27. Две простые сущности: сотрудник и телефон. О сотруднике данных мало: ФИО одной строкой. О телефоне данных мало: номер одной строкой. Сотрудник имеет много номеров, один номер принадлежит только одному сотруднику. Как организовать в БД?
#
28. Есть сущность и связанная к ней сущность. Нужно вытащить список родительских сущностей. Что произойдет в рамках запроса, если ленивая загрузка включена? Как называется эта проблема?
#
29. В БД есть справочные таблицы, которые никогда не меняются. Есть Spring MVC приложение. Нужно много ходить в эти таблицы, много запросов к БД. Как разрулить ситуацию со стороны Hibernate?
#
30. Запускаем поток 1. В этом потоке сделаю 5 раз выборку из базу по одному и тому же id. Если включить запросы в БД, что мы увидим?
#
31. Если написать дефортный OneToMany? Выберу из базы и закрою транзакцию и попробую сериализовать. Что будет?
#
32. Есть транзакция, которая состоит из 10 различных комманд. Предположим, что все вычислили правильно, уровень изоляции постален верно. Концепция ACID гарантирует на 100% что проблем не возникнет?
#
33. Когда делаем JOIN указываем по каким параметрам связываем таблицы. Чаще всего используем оператор ON. Какие еще операторы можно использовать?
#
34. Нужно делать поиск по большому количеству колонок. Не хочу делать индексы. Что можно придумать?
#
35. Есть формочка поиска в интернет магазине и надо строить динамический sql запросы в зависимости от параметров с формы. Как мы можем по запросу формировать динамические sql запросы?
#
36. Берем постгре консоль, где можно выполнять запросы. Нужно вывести первую страницу, которая содержит пять элементов. Как должен выглять запрос?
#
37. Находимся на первой страничке интернет магазина. Вывелось пять элементов. Переходим на вторую страницу, но в момент перехода добавляется еще пять элементов. Получается, что при переходе с первой страницы на вторую мы увидем информацию с первой страницы. Как решить?
#
38. Приложение супер оптимизировано, но мы уперлись в производительность в БД. Как это можно решить?
#
39. Есть индекс по нескольким полям X, Y, Z. Уcловия Y1, Z2. X - не указан. Будет ли профилировщик использовать этот индекс?
#
40. Создали Entity, неправильно переопределили hashCode(), он всегда возвращает рандомное число. Чем это опасно?
#
41. Есть две сущности. Связь One to Many. В первой сущности есть поле список второй сущности. Достаем из БД первую сущность и удаляем ее. Что будет с вложенным списком второй сущности
#
43. В БД много записей. Как настроишь отображение большого количества данных между бэком и фронтом?
#
44. Описываешь структуру сотрудника предприятия. У сотрудника есть начальник и подчиненные. Как реализовать такую структуру?
#
45. Делаешь рабочий проект. Как понять тебе нужна ORM или JDBC?
#
46. Как с помощью LEFT и RIGHT JOIN получить выборку аналогичную FULL JOIN
#
47. Можно в проде создать новое поле на работающей базе?
#
48. Как в SQL посчитать уникальные значения по нескольким полям? Без использования DISTINCT, потому что поле высчитывается, например
#
49. Где отследить миграцию, которую сделали с помощью liquibase для Postgres? Как в liquibase настраивается лог миграции?
#
50. Есть таблица. После каких значений id выборка может подтормаживать? (к примеру если 10 Id то норм, а весли десять миллионов то начинает лагать)
#
51. Микросервисная среда, много микросервисов работают. Мы обращаемся к одному сервису, а он тормозит. Год назад он отвечал за 2 сек, а сейчас за 20 сек. Какие варианты есть, чтобы понять, что происходит?
#
52. Интернет магазин и клиент ищет товар. Все характеристики товаров разложены по разным таблицам. Клиент выбирает один или два параметра. Как ты будешь формировать запрос?
#
53. Нужно хранить в БД сущности определенное количество времени, по месяцу. Как бы реализовал эту логику?
#
54. На бэке есть таблица с пользователями, где много полей (фио, телефон, тд). На фронте эта таблица выводится списком. У пользователя есть фильтр по всем полям пользователя. В запросе на бэк все фильтры передаются в объекте вместе с запросом. На бэке нужно посмотреть на выбранные фильтры и сделать SQL запрос. Динамическая фильтрация. Как сделать в рамках Spring?
#
55. Есть метод getUsers(), он возвращает все, что есть в таблице. Бизнес просит добавить пагинацию и фильтрацию по 100 колонкам. Фильтрация по каждой колонке может быть, а может не быть. Как решить задачу в Java?
#
56. Hibernate. Есть таблицы users, roles. В сущности user прописана коллекция roles ManyToMany, мы проставили @Lazy. Пришла задача сделать эндпоинт, где смогу вытащить user-а со всеми его roles. Менять @Lazy на @Eager мы не можем. Что делать?
#
57. DB. Table: employee(id, name, email). Column email is unique. But we only have SELECT query: SELECT * FROM employee WHERE id = ? Should we put index on email column? If we put index on column email, would we change smth for this query?
#
58. Хочу посчитать среднее значение по таблицам, но не хочу выводить среднее значение меньше 10. Как это будет выглядить в запросе?
#
59. Что используешь, если нужно в колонке установить значение 1, если было 5, установить значение 2, если было 10, иначе оставить прежнее?
#
60. Есть БД с крупными записями. Мы хотим читать эти записи и работать с большим объемом этих записей. Иногда падаем при чтении этих записей. Как решить с помощью Hibernate, Spring Data JPA? Какие подходы использовать?
#
61. БД, большой объем. Есть таблица весом 1 Тб. В момент обращения к таблице на диске происходят проблемы со стороны БД. Что делать, чтобы снизить нагрузку на таблицу? В таблице жирные записи. К таблице очень часто обращаются. В момент фильтраций, сортировки таблица на диске отжирает очень большое пространство
#
62. Первая транзакция стала менять строку, вторая транзакция встала в блокировку, так как ждет первую. Первая меняет условия для второй транзакции. Первая транзакция коммитется. Вторая транзакция выполнится?
#
63. Когда вылетает исключение, что не может удалить из БД какое то значение. Из-за чего такое бывает?
#
64. У нас есть B-Tree индекс по varchar столбцу. Мы делаем запрос “LIKE ? небольшой кусок текста ?”. Индекс будет работать? Какие есть варианты чтобы использовался индекс?
#
65. У нас оптимистическая блокировка, мы вытащили запись. У нее есть какая-то версия. Мы в моменте, когда нам нужно обновить эту запись в БД. Как сделать так, чтобы наш апдейт случился только тогда, когда версии совпадают? Если нет, то выкинуть ошибку.
#
66. В соцсети, которую пишем люди часто ищут пользователей по возрасту. WHERE age > 30 AND age < 40. В Postgres можем посмотреть служебную таблицу с данными о медленных запросах slow queries. И там много запросов с таким фильтром. Как побороть эту проблему?
#
67. Есть таблица, в ней есть столбцы. В какой-то момент в одном из столбцов потребовалось изменить тип данных. Предположим, что вместо целочисленного нужен строковый. Как будешь реализовывать?
#
68. У тебя есть селективная ручка, вы провели анализ и поняли, что проблема с перформансом. Как бы ты решал эту проблему? Мы пошли копать, денормализовали базу. Посмотрели в EXPLAIN ANALYZE, видим, что индексы есть, но мы туда не идем. Может ли такое быть? Дальше пошли копать. Индексы есть, система разрослась. Проблемы с перформансом есть. Что еще можем сделать?
#
69. По-умолчанию используется B-Tree дерево, в котором скорость поиска логарифмическое. А мы в начале собеса говорили, что есть структуры данных, где константный поиск. Почему HashMap не используют по-умолчанию?
#
70. Нужны специфичные операции: проверить, что у jsonb на верхнем уровне существует определенный ключ. Какой индекс использовать?
#
71. Таблица заказов. Три столбца: id заказа, статус заказа boolean и описание заказа. Хотим вытащить все незавершенные заказы. На какие столбцы будем вешать составной индекс?
#
72. Важно, в каком порядке указывать столбцы в составном индексе? Что меняется, если порядок столбцов меняется?
#
73. Если я создал составной индекс на колонки a и b, потом в запросе ссылаюсь только на b столбец в WHERE, будет ли использоваться составной индекс?
#
74. В JPA-репозитории есть какая-то сущность. У него есть id. На уровне БД это Primary Key. Мы пытаемся сохранить другую сущность с идентичным id. С помощью JPA-репозитория делаем save(). Что произойдет? Будет ли исключение?
#
75. Пишу класс JPA, который описывает Entity. В классе есть id. Достаточно ли брать hashcode() только от id? Или лучше использовать все поля?
#
76. В БД есть таблица с людьми. И нам нужно зачитать всех людей, которые родились после определенной даты. Какую технологию бы выбрали и как реализовали бы в коде?
#
77. Нужно спроектировать БД, где много операций вставки и изменения, мало операций чтения. Что удобнее использовать: нормализованные или денормализованные таблицы? Почему?
#
78. БД где есть сотрудники и история операций (действий) сотрудников. Как выглядит денормализованная и нормализованная форма такой БД? Сколько таблиц? Если денормализованная БД, как много действий одного сотрудника записать? Если нужно поменять историю действий сотрудника? Для чего делается денормализация? В случае денормализации нам нужно, чтобы у каждого сотрудника была только одна строка, вместе с историей. Как сделать? Нужна выжимка всех действий сотрудника в одну строчку
#
79. Есть таблица банковской БД. Две колонки: номер счета, значение на счету (сколько денег). Множество клиентов пытаются проводить много операций: кладут деньги на счет, снимают деньги со счета. Какие проблемы в БД могут быть? Почему? Какой уровень изоляции транзакций вы бы применили?
#
80. Есть маленькая таблица на 10 записей, у нее есть индекс. Будет ли анализатор использовать индекс? Почему? На основании чего анализатор посчитает, что Full Scan быстрее, чем Index Scan?
#
81. В Postgres была таблица на 1000 записей. Я удалил 1000 записей. У меня места на диске стало больше или меньше?
#
82. Объект находится в Persistence Context. Ты вытащил его с помощью findById(). И ты поменял что-то в объекте. В какой момент изменения будут сливаться в БД? Если знаешь, расскажи архитектуру Hibernate более детально
#
83. Используем JPA репозитории. Ты вытаскиваешь из одного репозитория, объект из БД с помощью findById() и делаешь в объекте изменения. Следующей командой с помощью findById() достаешь вторую сущность из второго репозитория. Что будет происходить с первой сущностью, которую ты уже изменил? Пример: есть два репозитория: repo1, repo2. Сначала entity1 = repo1.findById(id1); entity1.setMyValue(n); Потом entity2 = repo2.findById(id2); Какие запросы к БД будут сгенерированы под капотом?
#
84. Many-to-many связь. Есть сущность книга, есть сущность автор. Между ними связь many-to-many. Книга содержит коллекцию авторов, а автор содержит коллекцию книг. Какие типы Collections использовать? Что делать с equals() и hashCode(), если ты реализуешь эту ситуацию и используешь Set для коллекций авторов, коллекций книг? И здесь же ситуация с LazyInitializationException
#
85. Postgres. Есть система, которая занимается обработкой чего-то. Есть табличка, в ней ОЧЕНЬ много записей. У каждой записи есть статус. Модель изменения статуса линейная: “новая”, “в обработке”, “завершено”. Как оптимально быстро получить список еще незавершенных задач (которые не в статусе “завершено”)? Какие здесь есть проблемы? Как их решить? Как будешь реализовывать атомарность изменений при дублировании?
#
86. Есть сущность status. В Java это enum. Какой тип задашь полю status в таблице БД при проектировании? Почему?
#
87. На проде таблица с 1 Тб данных логов. Надо удалить все данные в этой таблице. Как сделаешь?
#
88. Нужно удалить из таблицы все данные, которые старше 3 мес. И теперь каждый месяц нужно удалять данные, которые старше 3 мес. Как?
#
89. В Hibernate в параметрах стоит lazy. Я делаю обращение к коллекции, идет еще один запрос в БД. Почему я словлю ошибку?
#
90. JPA или Hibernate. Есть сущность Заказы. У нее есть связь 1-to-many Товары для Заказа. Я хочу сделать эндпоинт, который достает большой список с Заказами и показывает их сразу с Товарами. Я делаю репозиторий и делаю findAll() по Заказам. Все ли хорошо? Какая проблема есть? Что поправить?
#
91. JPA, Hiber. Есть Заказы и я хочу по-всякому их фильтровать. На фронте есть фильтры: по имени, по заказчику, по сумме. Должен быть 1 эндпоинт. Как решить?
#
92. Как заставить Hibernate проделать оптимистическую блокировку?
#
93. БД, параллельный доступ к данным. Есть таблица, в ней строка, в которой поле isExecuted. Мы должны вычитать таски и написать лог. У нас есть 10 pod-ов, которые смотрят на эту таблицу по шедуллеру и каждые 10 сек делают SELECT. От коллеги разраба ты видишь pull request нативного запроса: SELECT * FROM table WHERE isExecuted=0. Что об этом думаешь? Какие проблемы могут быть? Если используешь ShedLock, создается прокси-таблица. И мы понимаем, что задач дофига. На проме должно работать за 1 сек большая пачка запросов. Очень интенсивная параллельная работа с таблицей. И с ShedLock теряем горизонтальную масштабируемость, завязаны на узкое горлышко в 1 pod. Что еще предложишь для масштабирования?
#
94. На UI есть таблица с пагинацией, сортировкой, фильтрацией. Мы реализовали всю логику. Это очень большой объем данных, идет на миллионы строк. Отображаем по 20 строк. Генерируется запрос SELECT … FROM … WHERE … LIMIT 20 OFFSET … Какие проблемы видишь в LIMIT, OFFSET конструкции? Spring нам сгенерировал, вроде работает норм. Если OFFSET 100000 LIMIT 10 ? Что будет сделано 100000 раз?Мы говорим базе: иди на 100000 строчку и возьми 10 значений. Как БД перемещается на строчку 100000? На чем индекс построен здесь? Как мы можем проиндексировать номера строк?
#
95. Как Postgres работает с данными в таблице: если мы UPDATE поле, то Postgres прямо идет в таблицу и меняет поле? Или что-то хитрее происходит?
#
96. Если чтений одной и той же записи на порядки больше, чем вставок, и БД говорит, что слишком много чтений, не вывозит, какие варианты разгрузить БД есть?
#
97. Есть таблица всего с одной ячейкой, в которой записано значение 1. Есть транзакция, в которой сначала Read, потом Update +1 значение в таблице, и Commit транзакции. Приложение многопоточное. Вторая транзакция начинается по времени где-то между Read и Update первой транзакции. Вторая транзакция делает Read где-то после Update и Commit первой транзакции. Вторая транзакция делает Update+1, после Commit первой транзакции (см рисунок в видео). Когда закоммитится вторая транзакция, какое число получится в ячейке таблицы в конце?
#
98. Есть таблица, есть поле. Две транзакции. Уровень Repeatable read. Одна транзакция запросила, другая поменяла, в рамках первой транзакции запросили снова и получили тоже самое - не поменянное.
#
99. Уровень Repeatable read. Есть поле и две транзакции. Транзакции одновременно стартанули. В рамках одной транзакции добавляется +10. Одна транзакция завершилась раньше, другая позже. Какое будет итоговое значение?
#
100. У нас может индекс создаваться по несколькими полям, если я сделаю индекс по полям “а” и “b” BTREE индекс и сделаю запрос по полю “а”, отработает индекс или нет?
#
101. Liquibase. You created a changeset? It can be executed from dev stage. But then you find a typo in a column name. How would you fix it?
#
102. Я вызываю список, в нем настроено 1-to-many, есть проблемы с вытягиванием этих Entit-ей. Какие проблемы? Как их можно решать?
#
103. Таблицы users и addresses. Сделал FETCH JOIN, и тогда user-ы размножатся на количество address-ов у этого user-а. Как FETCH JOIN происходит? FETCH JOIN потом соединяет user-ов c addres-ами. А если у меня много 1-to-many? Кроме связи user с address, есть еще связь user с заказом. И я напишу два FETCH JOIN, есть ли в этом подводные камни?
#
104. Postgres заблокирует строчки двух таблиц (Person и City). Есть идеи, как указать Postgres, что нужно заблокировать только строчку в Person таблице?
#
105. У меня сущность, которая имеет два атрибута, и оба они списки. Может ли Entity Graph сразу две коллекции загрузить?
#
106. SQL, пагинация. Как написать такой один SQL запрос для пагинации, чтобы общее количество записей тоже вернулось? SELECT * FROM table … LIMIT OFFSET. А что еще туда добавить?
#
107. У тебя есть сервис, который что-то выгружает за сутки из таблицы. Представь, что таблица разрослась до десятков миллионов записей. Твой запрос стал работать медленно. Что можно сделать для решения этой проблемы?
#