Прошлая статья «Вопросы для Администраторов» получилась очень удачной и мы решили сделать новую, но на этот раз для Разработчиков SQL Server. Мы не будем разбирать все ответы, а только расскажем вам что следует изучить и какие бывают вопросы на собеседованиях.
Начнём с базовых вопросов для разработчика
- Агрегатные функции
- Индексы: виды, как организованы, различия
- Уровни изоляции транзакций (спрашивают 9 из 10 раз)
- Типы логических соединений (Inner Join, Left Join, Right Join и тд.)
- Триггеры
- Логический порядок обработки инструкции SELECT
- Null и как с ним работать
- Try/Catch
- Работа с SQL Profiler (старое направление, но многие спрашивают) и Extended Events
- Обобщённое табличное выражение (СTE)
- Как написать динамический SQL (exec, sp_executesql)
- Нормализация и денормализация БД
- Хинты. Чем могут помочь. Риски
- Курсоры.
Так же очень полезно знать
- Типы физических соединений (Merge Join, Hash, Nested Loop. Как работает, чем отличается)
- Оконные функции
- План запроса (Seek, Scan, Spool, Key Lookup и тд.)
- Секционирование. В каких случаях и для чего применяется. Как физически выглядит. Какие при этом бывают индексы
- Временная таблица и табличные переменные
- Понимание механизма распределенных транзакций
- Служба сервис-брокер и основные понятия
- Полнотекстовый поиск
- Виды репликаций, их особенности и сферы применения
- Как работает оптимизатор
- SQLOS. Что такое и как устроено
А теперь перейдём к конкретным вопросам
- Наверняка попросят написать или оптимизировать какой то запрос, спросят как-что лучше спроектировать и почему
- Нужно быстро удалить записи из таблицы. Как это сделать быстро?
- Удаление дубликатов из таблицы (несколько способов)
- Чем отличается count(*) от count(name)?
- Чем отличается decimal от float, для каких задач лучше применять каждый из этих типов?
- Нарастающие итоги
- Задачи типа gaps and islands
- Что делать, если у вас случилось переполнение столбца int, а вам нужно быстро продолжить работу?
- Дана таблица:
123456CREATE TABLE dbo.call(subscriber_name VARCHAR(64) NOT NULL,event_date DATETIME NOT NULL,event_cnt INT NOT NULL)
Требуется написать запрос, возвращающий для каждого абонента минимальную дату, когда количество событий было максимально, и максимальную дату, когда количество событий было минимально, а также количество событий. - Как бы вы оптимизировали следующий запрос (показан полный скрипт таблицы; приведите обоснование своего выбора)?
123456789101112131415CREATE TABLE dbo.call(id INT IDENTITY PRIMARY KEY CLUSTERED,subscriber_name VARCHAR(64) NOT NULL,event_date DATETIME NOT NULL,subtype VARCHAR(32) NOT NULL,type VARCHAR(128) NOT NULL,event_cnt INT NOT NULL)SELECT *FROM dbo.callWHERE subscriber_name = @aAND event_date > @bAND subtype = @c - Из таблицы следующей структуры:
1234567891011121314151617181920212223242526CREATE partition FUNCTION pf_monthly(datetime) AS range RIGHT FOR VALUES ('20120201', '20120301', '20120401', '20120501', '20120601', '20120701','20120801', '20120901', '20121001', '20121101', '20121201')goCREATE partition scheme ps_monthly AS partition pf_monthly ALL TO ([primary])goCREATE TABLE dbo.order_detail(order_id INT NOT NULL,product_id INT NOT NULL,customer_id INT NOT NULL,purchase_date DATETIME NOT NULL,amount MONEY NOT NULL)ON ps_monthly(purchase_date)goCREATE CLUSTERED INDEX ix_purchase_dateON dbo.order_detail(purchase_date)go
Необходимо удалить случайно внесенные данные по клиенту с id 42, за период с мая по июнь (включительно) 2012-го года, что составляет более 80% записей за этот период. В таблице несколько миллиардов записей. Какие есть способы решения данной задачи? - Система успешно работала полгода, затем неожиданно производительность серьезно деградировала. Каковы возможные проблемы, пути решения?
- Какое отличие(я) между delete from dbo.my_table и truncate table?