Кластерный индекс (а не некластеризованные индексы) можно использовать для запросов диапазона. Ты знаешь что это? Горизонтальный обход B-дерева повышает скорость навигации по CI при определении квалифицированных строк во время запросов диапазона.
В более общем смысле, если кэш сервера слишком мал и страницы CI выгружаются, когда любой запрос (не только запросы диапазона) должен получить следующую страницу при переходе вниз или вбок, через CI, он может получить страницу с одним доступом к диску, потому что страницы связаны указателем; то есть. это позволяет избежать перехода на один уровень вверх, чтобы найти следующую страницу). Просто один из многих причин, по которым CI намного быстрее, чем NCI; они гораздо лучше, потому что от них зависит NCI (ваш второй вопрос сегодня).
Диаграмма содержит ошибки (содержит ложную информацию), или, если быть более точным, это описательная, нетехническая диаграмма от нетехнической корпорации:
Промежуточные уровни имеют один указатель на страницу следующего уровня (не несколько указателей).
Конечный уровень - это строка данных. Нет указателей на строки (на промежуточном ИЛИ листовом уровне).
Страницы указателя не похожи на страницы текста и изображений. Каждая страница индекса содержит сотни записей индекса B-Tree.
Корневая страница отличается только тем, что первая запись является единственным корнем индекса; он содержит сотни записей, которые, конечно, второго уровня, и могут быть третьего уровня и т. д.
Существует причина, по которой технические специалисты рисуют и используют технические чертежи: среди прочего, это позволяет избежать недоразумений и путаницы. Никаких вопросов по Диаграмме, которую я сделал для вас ?
Ответ на пост Мартина Смита
а. Я: Кластерный индекс (а не некластеризованные индексы) можно использовать для запросов диапазона
MS: Неправильно: некластеризованные индексы могут отлично использоваться для запросов диапазона, если охватывает некластеризованный индекс.
Похоже, вы понимаете закрытый запрос, но не понимаете запрос диапазона. Пожалуйста, прочтите это. К сожалению, он называется «запрос», но на самом деле это техника производительности, которую предоставляют все поставщики SQL. Допустим, у вас есть настоящая реляционная таблица, что означает составной ключ, например. PK счета (CustomerId, InvoiceNo) [не InvoiceId]. Затем запрос, такой как:
SELECT * FROM Invoice WHERE CustomerId = @CustomerId
будет перемещаться по B-дереву ClusteredIndex один раз , чтобы найти первый счет-фактуру для CustomerId. Затем он будет следовать PageChain из LeafLevel (строки данных), чтобы получить второй и последующий счет-фактуру для CustomerId. Больше нет необходимости использовать B-Tree для запроса. Запрос диапазона заканчивается, когда встречается первый Счет с CustomerId> 1.
Это только возможно с ClusteredIndex, где B-дерево объединено с данными в единой физической структуре.
Это физически невозможно с NonClusteredIndex-plus-Data (который является кучей или ClusteredIndex). Вот почему Range Queries не может поддерживаться для NCI. Даже если у вас был NCI с (CustomerId, InvoiceNo), строки данных не будут в этом порядке; они будут в хронологическом порядке в куче; поэтому запрос, использующий этот NCI, извлечет запись по одной строке на NCI.
б. Я: CI намного быстрее, чем NCI; они намного более улучшены, потому что NCI зависит от них
MS: Структура дерева B кластеризованного индекса ничем не отличается от некластеризованного индекса. CI не улучшены или имеют какую-то другую и превосходную структуру ...
Там нет споров. Вы просто неправильно меня поняли, о скорость , я говорил о таблице в целом (NonClusteredIndices не может существовать самостоятельно). Позвольте мне уточнить: учитывая тот же ключ, ClusteredIndex (который включает в себя данные) всегда намного быстрее, чем NonClusteredIndex-plus-Heap. Навигация, поддержка, создание, удаление из единой структуры хранения данных (CI), очевидно, намного быстрее, чем выполнение той же операции с двумя структурами хранения данных (NCI + Heap).
Физически невозможно сделать две DS быстрее, чем одну DS (при условии, с одним и тем же ключом).
с. Не стоит ответа. Похоже, вы не понимаете, что мои комментарии относятся к неправильным диаграммам. Другими словами, ваши комментарии (и доказательства) также совершенно правильны.