Хабр Курсы для всех
РЕКЛАМА
Практикум, Хекслет, SkyPro, авторские курсы — собрали всех и попросили скидки. Осталось выбрать!
In some cases, a surrogate primary key can be an even better choice because, in addition to being unique, the values are small and added sequentially, making the nonclustered indexes that reference those values more efficient as well.
В некоторых случаях лучшим выбором будет суррогатный первичный ключ, обладающий не только признаком уникальности, но и малым размеров, а значения которого увеличиваются последовательно, что делает некластеризованные индексы, основанные на этом значении более эффективными.
2) архитектура приложения, когда кластерный ключ не соответствует первичному ключу таблицы, крайне сложна для разработчиков. Ни один ORM, например, не поддерживает такую архитектуру.Не совсем так. ORM ничего не знает про кластерные индексы, поскольку работает уровнем выше. Но при этом запросы от ORM зачастую используют именно первичный ключ — а потому делать кластерный индекс отличным от первичного ключа попросту неоптимально.
В итоге uniqueidentifier в качестве первичного и кластерного ключа для многих это «нормальный» выбор, так как позволяет снизить риски архитектуры и не сильно уронить быстродействие.
Все правильно написано (почти).
Сомнительно выглядит выделенный текст — последовательно увеличивающиеся значения полезны тем, что не приводят к расщеплению страниц, как они влияют на эффективность некластерных индексов непонятно.
Не написано только, что кластерный ключ вовсе не обязан быть первичным ключом таблицы
Если подсистема запросов должна найти данные без преимуществ некластеризованного индекса, то она сделает полное сканирование таблицы для нахождения нужных ей строк. ...Что это за абстрактные «преимущества»? Любой индекс дает преимущества только если подходит для запроса. К примеру, если у нас индекс по Id — а мы делаем выборку по какому-нибудь Date — то индекс ничем не поможет. Более того, именно этот запрос кластеризованный индекс по Id даже замедлит.
К примеру, если коэффициент выставлен в значение 90, то при росте индекс займет на странице 90%, а затем перейдет на следующую страницу.
Если индексы настолько замечательны, то почему бы просто не создать их на каждый столбец?
это приведёт к тому, что индексу может потребоваться реорганизация, затрагивающая все связанные индексы и операции, в результате будет повсеместное падение производительности.
INSERT, главного врага всех индексовПочему он главный враг? Главный враг — update на индексируемые столбцы (понятно что так делать не стоит и наверняка делается не так часто, как обыкновенный insert).
Не пойму разницу между CREATE NONCLUSTERED INDEX ix_orderid ON dbo.Sales(OrderID) INCLUDE (OrderDate) и Sales(OrderID,OrderDate): дерево строится только по OrderID и в нём как данные ещё хранятся OrderDate (типа как в кластерном ключе), ну и соответственно ссылка на всю строку. Т.е. на размере индекса мы не выигрываем, при обновлении OrderDate мы так же должны обновить его и в индексе. В чём его выигрышность?Выигрыш — в количестве записей в индексных (внутренних) вершинах. Больше записей в вершине — меньше высота дерева — быстрее доступ.
Почему он главный враг? Главный враг — update на индексируемые столбцы (понятно что так делать не стоит и наверняка делается не так часто, как обыкновенный insert).Вот потому insert и главный враг, что чаще выполняется.
при обновлении OrderDate мы так же должны обновить его и в индексе. В чём его выигрышность?в конкретном этом примере, вполне реальном, ясно, что поле OrderDate не будет обновляться с вероятность 99,(9)%.
Кластеризованный индекс хранит реальные строки данных в листьях индекса
(комментарий был удален)
14 вопросов об индексах в SQL Server, которые вы стеснялись задать