Z1 писал(а) 28. Ноября 2008 :: 16:57:потому что по композитному ключу мы находим все одинаковые
записи склад,товар и можем их быстро получить через кластерный индекс
а идя по простому одинарному индексу записи мы должы будем
просканировать все записи с заданным этим первым индексом.
Видимо, все-таки нужно поговорить на эту тему
Вот для примера ситуация:
- имеем таблицу с полями Склад, Фирма, Товар. Нужно определиться каким образом организовать индекс(ы) и его(их) тип.
Часто видел ситуацию, когда народ расставляет поля в индексе в порядке: Фирма + Склад + Товар (в случае регистра и измерений, соответственно). С одной стороны есть логика: вдруг нужно будет будет получать остатки по Фирме, а иной раз даже еще
и по Складу. В большинстве случаев количество Фирм и Складов значительно меньше количества Товарных позиций.
На наборе данных (Фирма - Склад - Товар) с фильтром по Фирма1 + Склад1:
Фирма1 - Склад1 - Товар1
Фирма1 - Склад1 - Товар2
Фирма1 - Склад1 - Товар3
...
Фирма1 - Склад1 - ТоварN
Фирма1 - Склад2 - Товар1
Фирма1 - Склад2 - Товар2
Фирма1 - Склад2 - Товар3
...
Фирма1 - Склад2 - ТоварN
...
поведение ms-sql сервера будет таким:
Оптимизатор видит, что индекс такой Фирма + Склад + Товар, а условие выборки такое Фирма + Склад и строит план, скорее всего, Index Seek. Т.е. наше условие накладывается на индекс полностью. В служебных табличках сервер хранит плотность/распределенность (Statistics) данных в индексе и соответственно знает с какого места(!) нужно начинать перебор индекса (тут, вообще-то, помогает структура хранения индекса - B-tree и IAM). Мы получаем данные просто пройдя индекс и, взяв данные из самого индекса (для случая некластерного индекса).
Как мы знаем, в некластерном индексе организована определенная структура хранения. На листьях (leaf nodes) дерева хранятся данные индекса (т.е. это данные тех полей, которые указаны в индексе, в соответствии со способом сортировки), если же этих данных для выборки недостаточно, то серверу нужно будет спуститься по логической структуре дерева до самих данных (data leaf), которые храняться в куче (heap) через идентификатор (row locator). И если с B-tree все ясно, там поиск нужных значений производится крайне быстро, то в куче мы попадаем в "кучу". Т.е. тут нужно проводить тупой перебор (для начала пройтись по дереву по индексу, а чего нехватает - перебором кучи) - это очень злые Закладки (Bookmarks), довольно-таки тяжелая операция.