Какие виды индексов существуют
Что проверяют
Понимаете ли вы, как устроены индексы в базе под вашим приложением (в мире .NET это чаще SQL Server или PostgreSQL), и умеете ли описать их через EF Core. Следом спрашивают про разницу кластерного и некластерного индекса и про первичный ключ типа Guid.
Как отвечать
Основные виды на примере SQL Server:
- кластерный: сама таблица, упорядоченная по ключу. Он один на таблицу, первичный ключ по умолчанию создаёт именно его, таблица без него называется кучей;
- некластерный: отдельное B-дерево, листья которого ссылаются на строку через ключ кластерного индекса. Если нужных колонок в нём нет, в плане появляется
Key Lookup; - покрывающий: некластерный с
INCLUDE, запрос обслуживается целиком из индекса; - фильтрованный: с условием
WHERE, аналог частичного индекса PostgreSQL; - уникальный: гарантия целостности;
- columnstore: колоночное хранение для аналитики и больших агрегатов;
- полнотекстовый, пространственный, XML: под свои типы данных.
В EF Core индекс объявляют атрибутом [Index(nameof(Email), IsUnique = true)] или в OnModelCreating через HasIndex(u => u.Email).IsUnique(), дальше HasFilter(...) и IncludeProperties(...) у провайдеров SQL Server и Npgsql. SQL от EF показывает ToQueryString(), а использование индекса видно в фактическом плане.
Если имеют в виду сам C#, упомяните индексаторы this[int i] и тип Index с ^1 для доступа с конца.
Где спотыкаются
Делают кластерным ключом случайный Guid. Вставки идут в случайные страницы, индекс фрагментируется. Нужны последовательные значения: NEWSEQUENTIALID() или генератор, который EF Core для SQL Server включает по умолчанию. Guid.CreateVersion7() здесь не спасает: SQL Server сравнивает uniqueidentifier с последних байтов, и порядок по времени теряется.
Считают, что некластерный индекс хранит строку целиком. Без INCLUDE каждая найденная строка стоит ещё одного поиска по кластерному индексу, и на тысячах строк оптимизатор предпочтёт скан.
Вешают отдельный индекс на каждое поле из Where в LINQ. Запись замедляется, а запросу с условием по двум колонкам нужен один составной индекс с правильным порядком колонок.