"Кластеризованный индекс" и "Порядок по условию"

Есть ли разница между Clustered Index и Order by Clause?

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

Select Id, Name from Table Order by Name

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

ИЗМЕНИТЬ

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

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. Но сейчас это не показано в схеме. Извините, я не знаю почему.

Ответ 1

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

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

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

Ответ 2

Индекс позволяет быстро фильтровать поиск "WHERE CLAUSE", но также имеет дополнительный бонус в том, что данные будут отсортированы.

Пример

Таким образом, данные будут сохранены в таблице.

ID    Name
1     Jack
2     Bob
3     Jill

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

2     Bob
1     Jack
3     Jill

Итак, используя ваш SQL

Select Id, Name from Table Order by Name

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

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

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

Ответ 3

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

Ответ 4

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

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

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

Ответ 5

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

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

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

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

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

В общем, вы добавляете CLUSTERED INDEX по возрастающим значениям (IDENTITY, даты создания и т.д.) или если данные относительно статичны. Для каждой таблицы требуется кластеризованный индекс.