Индекс обеспечивает заказ самостоятельно? - PullRequest
4 голосов
/ 11 апреля 2011

допустим, у меня есть

create table mytable(
 a VARCHAR(200)
 b VARCHAR(200)
 c VARCHAR(200)
)

create index on mytable (b)

, если я выберу

select a, b, c from mytable;

, будет ли он отсортирован по b?

Ответы [ 4 ]

6 голосов
/ 11 апреля 2011

Возможно (более вероятно в случае кластерных индексов, я бы вообразил), но вы не можете полагаться на это или ожидать этого. Если у вас нет order by, предположим, что он не будет заказан.

5 голосов
/ 11 апреля 2011

Вы должны никогда предполагать, что данные, возвращаемые запросом к СУБД, будут в любом конкретном порядке.Единственный способ убедиться, что данные упорядочены, - это явно запросить (как правило, с предложением ORDER BY) для механизма базы данных, чтобы отсортировать и упорядочить данные, возвращаемые запросом.

4 голосов
/ 11 апреля 2011

Нет, потому что вы не используете индекс для b в своем примере запроса.

Это будет использовать сканирование кластерного индекса или сканирование таблицы.

И, как справедливо отмечает Кирен, в SQL нет неявного порядка.Даже если вы использовали индекс в своем запросе, на порядок результатов могут повлиять такие вещи, которые вы практически не можете контролировать, например, внутренние объединения (сопоставление хэшей, объединение слиянием, вложенные циклы), которые использует механизм запросов.* Если вы хотите упорядоченный результат, используйте ORDER BY.

2 голосов
/ 11 апреля 2011

Существует два основных типа индексов: кластеризация и некластеризация.

Индекс кластеризации определяет физический порядок строк в таблице. Вставка в таблицу (или обновление соответствующего поля) заставляет ядро ​​базы данных переупорядочивать данные, чтобы поле с индексом кластеризации в нем было правильно отсортировано. Вот почему в любой таблице может быть только один индекс кластеризации.

Некластеризованные индексы - это копии столбцов, упорядоченные по желанию. Они существуют отдельно, и физический порядок строк с ними не связан. Вот почему может быть столько некластеризованных индексов, сколько вы хотите.

Чаще всего простой выбор в одной таблице возвращает строки в физическом порядке, поэтому неудивительно, что они отсортированы в порядке индекса кластеризации.

Однако это не гарантируется, и вы не должны на это полагаться. Всегда включает предложение ORDER BY, если порядок результирующих наборов имеет значение.

Если вы упорядочиваете по индексу кластеризации, вам не нужно много работать с ядром БД, но ваше намерение ясно.

Если вы упорядочиваете по некластеризованному индексу, для БД будет немного больше работы, но (в зависимости от размера таблицы и типа данных) это будет на порядки быстрее, чем упорядочение по совершенно неиндексированному полю.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...