«Кластерный индекс» и «Заказ по пунктам» - PullRequest
10 голосов
/ 01 июня 2011

Есть ли разница между Кластерный индекс и Порядок по пункту ?

Мне нужно заполнить выпадающий список из мастер-таблицы, и следующий запрос:

Select Id, Name from Table Order by Name

Должен ли я использовать Order by Clause или Clustered Index для вышеуказанной задачи?

EDIT

Ниже приведена схема таблицы

IF NOT EXISTS (SELECT * FROM sys.objects WHERE object_id = OBJECT_ID(N'[dbo].[lookup]') AND type in (N'U'))
BEGIN
CREATE TABLE [dbo].[lookup](
    [Id] [int] IDENTITY(1,1) NOT NULL,
    [Name] [varchar](50) NULL,
 CONSTRAINT [PK_lookup_ID] PRIMARY KEY NONCLUSTERED
(
    [Id] ASC
)WITH (PAD_INDEX  = OFF, IGNORE_DUP_KEY = OFF) ON [PRIMARY]
) ON [PRIMARY]
END
GO

IF NOT EXISTS (SELECT * FROM sys.indexes WHERE object_id = OBJECT_ID(N'[dbo].[lookup]') AND name = N'IX_lookup_Name')
CREATE CLUSTERED INDEX [IX_lookup_Name] ON [dbo].[lookup]
(
    [Name] ASC
)WITH (PAD_INDEX  = OFF, IGNORE_DUP_KEY = OFF) ON [PRIMARY]

У меня также есть кластерный индекс на Name. Но сейчас это не отображается в схеме. Извините, я не знаю почему.

Ответы [ 5 ]

17 голосов
/ 01 июня 2011

яблоки и апельсины.Кластерный индекс является опцией хранения.ORDER BY является опцией запроса.Если вам нужны упорядоченные результаты, единственный способ получить их - * - добавить в запрос предложение ORDER BY.Период.

Индекс может помочь оптимизатору запросов создать более эффективный план и использовать индекс в качестве средства для удовлетворения требования ORDER BY.Но присутствие индекса, кластеризованного или некластеризованного, ни в коем случае не гарантирует гарантированность любого порядка результата.

Так что вам абсолютно необходим ORDER BY в ваших запросах.Вы также можете рассмотреть индекс по столбцу Name, чтобы помочь в этом запросе.Будет ли индекс использоваться или нет, это зависит от многих других факторов.Вы должны прочитать Разработка индексов и Точка перелома .

1 голос
/ 01 июня 2011

Индекс позволяет быстро искать фильтр «ГДЕ КЛАУЗА», но также имеет дополнительный бонус в том, что данные будут отсортированы.

пример

Так будут храниться данные в таблице.

ID    Name
1     Jack
2     Bob
3     Jill

Если вы добавите кластерный индекс по имени (ASC), то так оно и будетсохранено (первичные ключи всегда сохраняются вместе с каждым индексированным для поиска информации)

2     Bob
1     Jack
3     Jill

Таким образом, используя ваш SQL

Select Id, Name from Table Order by Name

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

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

Таким образом, без индекса по имени база данных должна сортировать данные каждый раз при выполнении запроса,С индексом сортировка происходит при вставке или обновлении данных (что немного замедляет обновления). Разница в том, что сортировку нужно выполнять только один раз, а не каждый раз.

0 голосов
/ 01 июня 2011

Мой первый вопрос : Что такое бизнес-сценарий использования?Если ответ «показать строки в порядке имен», то ORDER BY Name.

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

Я также думаю, что вы все равно будете фильтровать данные по имени,так что вы уже будете использовать индекс.

Моя вторая мысль : Вы преждевременно оптимизируете это?Будет ли в таблице тысячи или миллионы строк?Если нет, вы, вероятно, не заметите, существует ли индекс в любом случае.И если у вас есть тысячи строк, насколько хорошо будет работать раскрывающийся список без фильтрации?

Мы можем много гадать, поэтому всегда лучше, если вы профилируете запросы в своей среде.

Как правило, вы ставите КЛАСТЕРНЫЙ ИНДЕКС на увеличивающиеся значения (IDENTITY, даты создания и т. Д.) Или если данные относительно статичны.Не для каждой таблицы требуется кластеризованный индекс.

0 голосов
/ 01 июня 2011

Кластерный индекс и заказ по предложению - это две совершенно разные вещи.Кластерный индекс решает, как сортируются строки в сохраненной таблице.Предложение order by решает, как должны быть упорядочены результаты запроса.

Некластеризованный индекс создает еще одну «теневую таблицу» в хранилище БД, которая упорядочена по индексированным столбцам.Он также содержит первичный ключ, чтобы быстро найти нужную строку в «реальной» таблице.Рекомендуется создавать кластерный индекс по первичному ключу (если нет причин против этого).Любые другие столбцы, которые необходимо проиндексировать, можно обрабатывать в некластеризованных индексах.

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

0 голосов
/ 01 июня 2011

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

...