Прошлая статья «Вопросы для Администраторов» получилась очень удачной и мы решили сделать новую, но на этот раз для Разработчиков 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, а вам нужно быстро продолжить работу?
- Дана таблица:
CREATE TABLE dbo.call ( subscriber_name VARCHAR(64) NOT NULL, event_date DATETIME NOT NULL, event_cnt INT NOT NULL )
Требуется написать запрос, возвращающий для каждого абонента минимальную дату, когда количество событий было максимально, и максимальную дату, когда количество событий было минимально, а также количество событий.
- Как бы вы оптимизировали следующий запрос (показан полный скрипт таблицы; приведите обоснование своего выбора)?
CREATE 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.call WHERE subscriber_name = @a AND event_date > @b AND subtype = @c
- Из таблицы следующей структуры:
CREATE partition FUNCTION pf_monthly(datetime) AS range RIGHT FOR VALUES ( '20120201', '20120301', '20120401', '20120501', '20120601', '20120701', '20120801', '20120901', '20121001', '20121101', '20121201') go CREATE partition scheme ps_monthly AS partition pf_monthly ALL TO ([primary]) go CREATE 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) go CREATE CLUSTERED INDEX ix_purchase_date ON dbo.order_detail(purchase_date) go
Необходимо удалить случайно внесенные данные по клиенту с id 42, за период с мая по июнь (включительно) 2012-го года, что составляет более 80% записей за этот период. В таблице несколько миллиардов записей. Какие есть способы решения данной задачи?
- Система успешно работала полгода, затем неожиданно производительность серьезно деградировала. Каковы возможные проблемы, пути решения?
- Какое отличие(я) между delete from dbo.my_table и truncate table?