SQL, базы данных, индексы, ORM и миграции

SQL, базы данных, индексы, ORM и миграции #


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. Создали индекс на поле, делаем запрос на это поле, а индексы не сработали. Такое возможно? #

9. Запрос медленно работает Что делать? #

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. В первой сущности есть поле список второй сущности. Достаем из БД первую сущность и удаляем ее. Что будет с вложенным списком второй сущности #

42. Почему OneToMany Lazy, а ManyToOne Eager #

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. У тебя есть сервис, который что-то выгружает за сутки из таблицы. Представь, что таблица разрослась до десятков миллионов записей. Твой запрос стал работать медленно. Что можно сделать для решения этой проблемы? #