Create nonclustered index: Create Nonclustered Indexes — SQL Server

Создание некластеризованных индексов в SQL Server

by Maheen Aboobakkar | 7 мая 2022 г.

Создать некластеризованные индексы в SQL Server можно с помощью SQL Server Management Studio или Transact-SQL. Давайте рассмотрим детали.

Bobcares предоставляет решения для любых запросов в рамках наших услуг по администрированию серверов .

Давайте подробнее рассмотрим, как создавать некластеризованные индексы в SQL Server

Создание некластеризованных индексов в SQL Server

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

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

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

Синтаксис
Некластеризованный индекс имеет тот же синтаксис, что и кластеризованный индекс. Просто замените «NONCLUSTERED» на «CLUSTERED». Чтобы создать новый некластеризованный индекс для таблицы, используйте следующий синтаксис.

СОЗДАТЬ НЕКЛАСТЕРНЫЙ ИНДЕКС
ON (столбец)

Создайте некластеризованный индекс с помощью SSMS

  1. Во-первых, запустите SSMS. Создайте подключение к базе данных. Разверните таблицу, для которой вы хотите создать некластеризованный индекс, в обозревателе объектов.
  2. Выберите папку Indexes с помощью контекстного меню. Как показано ниже, выберите «Новый индекс», затем «Некластеризованный индекс».
  3. На странице «Общие» диалогового окна «Новый индекс» в разделе «Имя индекса» дайте имя новому индексу.
  4. Как показано ниже, нажмите кнопку «Добавить» в разделе «Ключевые столбцы индекса».
  5. Установите флажок для столбцов, для которых должен быть создан некластеризованный индекс, в диалоговом окне «Выбрать столбцы из таблицы».
  6. Наконец, сохраните таблицу, нажав «ОК».

Создайте некластеризованный индекс с помощью конструктора таблиц

    1. Разверните базу данных, содержащую таблицу, для которой вы хотите создать некластеризованный индекс в обозревателе объектов.
    2. Затем разверните папку Таблицы.
    3. Выберите Design в контекстном меню таблицы, для которой вы хотите создать некластеризованный индекс.
    4. Выберите «Индексы/ключи» в контекстном меню, когда вы щелкните правой кнопкой мыши столбец, для которого вы хотите создать некластеризованный индекс.
    5. Нажмите «Добавить» в диалоговом окне «Индексы/ключи».
    6. В текстовом поле Выбранный первичный/уникальный ключ или индекс выберите новый индекс.
    7. Выберите Создать как кластеризованный в раскрывающемся списке справа от свойства в сетке.
    8. Нажмите «Закрыть»
    9. Нажмите «Savetable_name» в меню «Файл».

[Ищете решение для другого вопроса? Мы на расстоянии одного клика.]

Заключение

Подводя итог, мы можем создавать некластеризованные индексы в SQL Server с помощью SQL Server Management Studio или Transact-SQL.

Никогда больше не теряйте клиентов из-за низкой скорости сервера! Позвольте нам помочь вам.

Наши специалисты по серверам будут контролировать и обслуживать ваш сервер 24/7, чтобы он оставался молниеносно быстрым и безопасным.

НАЧАТЬ

var google_conversion_label = «owonCMyG5nEQ0aD71QM»;

Поиск:

Похожие сообщения

Категории

Последние | Управление сервером

Создание кластеризованных и некластеризованных индексов в SQL Server

В SQL Server существует два типа индексов; Кластеризованные и некластеризованные индексы. Как кластеризованные, так и некластеризованные индексы имеют одинаковую физическую структуру. Более того, оба они хранятся в SQL Server в виде структуры B-Tree.

Кластерный индекс:

Кластерный список — это особый тип индекса, который перестраивает физическое хранилище записей в таблице. В SQL Server индексы используются для ускорения операций базы данных, что приводит к высокой производительности. Таким образом, таблица может иметь только один кластеризованный индекс, что обычно делается для первичного ключа. Листовые узлы кластеризованного индекса содержат «страниц данных». Таблица может иметь только один кластеризованный индекс.

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

Создание базы данных

Для создания базы данных. Щелкните правой кнопкой мыши «Базы данных» в проводнике объектов и выберите параметр «Новая база данных» . Введите имя базы данных и нажмите «ОК». База данных была создана, как показано на рисунке ниже.

Создание таблицы с использованием представления «Дизайн»

Теперь мы создадим таблицу с именем «Сотрудник» с первичным ключом с помощью представления «Дизайн». На рисунке ниже мы видим, что мы назначили в первую очередь поле с именем «ID», и мы не создали никакого индекса в таблице.

Создание таблицы с именем «Сотрудник» с идентификатором в качестве первичного ключа

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

 ПРИМЕНЕНИЕ [испытание]
ИДТИ
УСТАНОВИТЕ ANSI_NULLS ВКЛ.
ИДТИ
УСТАНОВИТЕ QUOTED_IDENTIFIER НА
ИДТИ
CREATE TABLE [dbo].[Сотрудник](
[ID] [int] IDENTITY(1,1) NOT NULL,
[Dep_ID] [число] NULL,
[Имя] [varchar](200) NULL,
[электронная почта] [varchar](250) NULL,
[город] [varchar](250) NULL,
[адрес] [varchar](500) NULL,
ОГРАНИЧЕНИЕ [Primary_Key_ID] ПЕРВИЧНЫЙ КЛЮЧ КЛАСТЕРИЗОВАН
(
[ИД] АСЦ
)С (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) ON [PRIMARY]
) НА [ПЕРВИЧНОМ]
ВПЕРЕД 

Вывод будет следующим.

Создание таблицы с именем «Сотрудник» с идентификатором в качестве первичного ключа

Приведенный выше код создал таблицу с именем «Сотрудник» с полем идентификатора, уникальным идентификатором в качестве первичного ключа. Теперь в этой таблице кластеризованный индекс будет автоматически создан по идентификатору столбца из-за ограничений первичного ключа. Если вы хотите увидеть все индексы в таблице, запустите хранимую процедуру «sp_helpindex». Выполните следующий код, чтобы просмотреть все индексы в таблице с именем 9.0009 «Сотрудник». Эта процедура хранения принимает имя таблицы в качестве входного параметра.

 ЕГЭ-тест
EXECUTE sp_helpindex Employee 

Вывод будет следующим.

«sp_helpindex» покажет все индексы в таблице сотрудников.

Другой способ просмотреть индексы таблиц — перейти к «таблицам» в проводнике объектов. Выберите стол и потратьте его. В папке индексов вы можете увидеть все индексы, относящиеся к этой конкретной таблице, как показано на рисунке ниже.

Просмотр всех индексов в таблице

Поскольку это кластеризованный индекс, логический и физический порядок индекса будет одинаковым. Это означает, что если идентификатор записи равен 3, то она будет храниться в третьей строке таблицы. Точно так же, если пятая запись имеет идентификатор 6, она будет сохранена в 5 -й ячейке таблицы. Чтобы понять порядок записей, вам нужно выполнить следующий скрипт.

 ПРИМЕНЕНИЕ [испытание]
ИДТИ
УСТАНОВИТЕ IDENTITY_INSERT [dbo].[Сотрудник] ON
INSERT [dbo].[Employee] ([ID], [Dep_ID], [Name], [email], [город], [адрес]) ЗНАЧЕНИЯ (8, 6, N'Humbaerto Acevedo', N'humbaerto.acevedo @gmail.com', Н'СЕНТ-ПОЛ', N'895 E 7th St Saint Paul Mn 551063852')
ВСТАВЬТЕ [dbo].[Сотрудник] ([ID], [Dep_ID], [Имя], [электронная почта], [город], [адрес]) ЗНАЧЕНИЯ (9, 6, N'Humbaerto Acevedo', N'humbaerto.acevedo @gmail.com', N'SAINT PAUL', N'895 E 7th St Saint Paul Mn 551063852')
ВСТАВЬТЕ [dbo].[Сотрудник] ([ID], [Dep_ID], [Имя], [электронная почта], [город], [адрес]) ЗНАЧЕНИЯ (10, 7, Н'Пилар Акерман', Н'пилар. акерман @gmail.com', N'ATLANTA', N'5813 Eastern Ave Hyattsville Md 207822201')
ВСТАВЬТЕ [dbo].[Сотрудник] ([ID], [Dep_ID], [Имя], [электронная почта], [город], [адрес]) ЗНАЧЕНИЯ (11, 1, Н'Ааронбой Гутьеррес', Н'аронбой.гутьеррес @gmail.com', N'HILLSBORO', N'5840 Ne Cornell Rd Hillsboro или 97124')
ВСТАВЬТЕ [dbo].[Сотрудник] ([ID], [Dep_ID], [Имя], [электронная почта], [город], [адрес]) ЗНАЧЕНИЯ (12, 2, Н'Аабди Магсуди', Н'абди_магсуди@gmail .com', N'BRENTWOOD', N'987400 Медицинский центр Небраски, Омаха Ne 681987400')
ВСТАВЬТЕ [dbo].[Сотрудник] ([ID], [Dep_ID], [Имя], [электронная почта], [город], [адрес]) ЗНАЧЕНИЯ (13, 3, Н'Абхарана, Сахни', Н'абхарана. [email protected]', N'HYATTSVILLE', N'2 Barlo Circle Suite A Dillsburg Pa 170191')
ВСТАВЬТЕ [dbo].[Сотрудник] ([ID], [Dep_ID], [Имя], [электронная почта], [город], [адрес]) ЗНАЧЕНИЯ (14, 3, Н'Абхарана, Сахни', Н'абхарана. [email protected]', N'HYATTSVILLE', N'2 Barlo Circle Suite A Dillsburg Pa 170191')
ВСТАВЬТЕ [dbo].[Сотрудник] ([ID], [Dep_ID], [Имя], [электронная почта], [город], [адрес]) ЗНАЧЕНИЯ (1, 1, Н'Ааронбой Гутьеррес', Н'аронбой. гутьеррес @gmail.com', N'HILLSBORO', N'5840 Ne Cornell Rd Hillsboro или 97124')
ВСТАВЬТЕ [dbo].[Сотрудник] ([ID], [Dep_ID], [Имя], [электронная почта], [город], [адрес]) ЗНАЧЕНИЯ (2, 2, Н'Аабди Магсуди', Н'абди_магсуди@gmail .com', N'BRENTWOOD', N'987400 Медицинский центр Небраски, Омаха Ne 681987400')
ВСТАВЬТЕ [dbo].[Сотрудник] ([ID], [Dep_ID], [Имя], [электронная почта], [город], [адрес]) ЗНАЧЕНИЯ (3, 3, Н'Абхарана, Сахни', Н'абхарана. [email protected]', N'HYATTSVILLE', N'2 Barlo Circle Suite A Dillsburg Pa 170191')
ВСТАВЬТЕ [dbo].[Сотрудник] ([ID], [Dep_ID], [Имя], [электронная почта], [город], [адрес]) ЗНАЧЕНИЯ (4, 3, Н'Абхарана, Сахни', Н'абхарана. [email protected]', N'HYATTSVILLE', N'2 Barlo Circle Suite A Dillsburg Pa 170191')
ВСТАВЬТЕ [dbo].[Сотрудник] ([ID], [Dep_ID], [Имя], [электронная почта], [город], [адрес]) ЗНАЧЕНИЯ (5, 4, N'Aabish Mughal', N'[email protected] .com', N'OMAHA', N'2975 Crouse Lane Burlington Nc 272150000')
ВСТАВЬТЕ [dbo].[Сотрудник] ([ID], [Dep_ID], [Имя], [электронная почта], [город], [адрес]) ЗНАЧЕНИЯ (6, 5, Н'Аабрам Хауэлл', Н'аронбой. гутьеррес @gmail.com', N'DILLSBURG', N'868 York Ave Atlanta Ga 303102750')
ВСТАВЬТЕ [dbo].[Сотрудник] ([ID], [Dep_ID], [Имя], [электронная почта], [город], [адрес]) ЗНАЧЕНИЯ (7, 5, Н'Аабрам Хауэлл', Н'аронбой.гутьеррес @gmail.com', N'DILLSBURG', N'868 York Ave Atlanta Ga 303102750')
ВСТАВЬТЕ [dbo].[Сотрудник] ([ID], [Dep_ID], [Имя], [электронная почта], [город], [адрес]) ЗНАЧЕНИЯ (15, 4, N'Aabish Mughal', N'[email protected] .com', N'OMAHA', N'2975 Crouse Lane Burlington Nc 272150000')
ВСТАВЬТЕ [dbo].[Сотрудник] ([ID], [Dep_ID], [Имя], [электронная почта], [город], [адрес]) ЗНАЧЕНИЯ (16, 5, Н'Аабрам Хауэлл', Н'аронбой.гутьеррес @gmail.com', N'DILLSBURG', N'868 York Ave Atlanta Ga 303102750')
ВСТАВЬТЕ [dbo].[Сотрудник] ([ID], [Dep_ID], [Имя], [электронная почта], [город], [адрес]) ЗНАЧЕНИЯ (17, 5, Н'Аабрам Хауэлл', Н'аронбой.гутьеррес @gmail.com', N'DILLSBURG', N'868 York Ave Atlanta Ga 303102750')
ВСТАВЬТЕ [dbo].[Сотрудник] ([ID], [Dep_ID], [Имя], [электронная почта], [город], [адрес]) ЗНАЧЕНИЯ (18, 6, N'Humbaerto Acevedo', N'humbaerto. acevedo @gmail.com', Н'СЕНТ-ПОЛ', N'895 E 7th St Saint Paul Mn 551063852')
ВСТАВЬТЕ [dbo].[Сотрудник] ([ID], [Dep_ID], [Имя], [электронная почта], [город], [адрес]) ЗНАЧЕНИЯ (19, 6, N'Humbaerto Acevedo', N'humbaerto.acevedo @gmail.com', N'SAINT PAUL', N'895 E 7th St Saint Paul Mn 551063852')
ВСТАВЬТЕ [dbo].[Сотрудник] ([ID], [Dep_ID], [Имя], [электронная почта], [город], [адрес]) ЗНАЧЕНИЯ (20, 7, Н'Пилар Акерман', Н'пилар.акерман @gmail.com', N'ATLANTA', N'5813 Eastern Ave Hyattsville Md 207822201')
SET IDENTITY_INSERT [dbo].[Employee] OFF 

Хотя записи хранятся в столбце «Id» в случайном порядке значений. Но из-за кластеризованного индекса в столбце id. Записи физически хранятся в порядке возрастания значений в столбце id. Чтобы убедиться в этом, нам нужно выполнить следующий код.

 Выберите * из test.dbo.Employee 

Вывод будет следующим.

Выбор всех записей из таблицы Сотрудник. Записи отображаются в порядке возрастания столбца идентификатора

. На приведенном выше рисунке видно, что записи были получены в порядке возрастания значений в столбце идентификатора.

Пользовательский кластерный индекс

Вы также можете создать пользовательский кластерный индекс. Поскольку мы можем создать только один кластеризованный индекс, нам нужно удалить предыдущий. Чтобы удалить индекс, выполните следующий код.

 ИСПОЛЬЗОВАНИЕ [испытание]
ИДТИ
ALTER TABLE [dbo].[Employee] DROP CONSTRAINT [Primary_Key_ID] WITH ( ONLINE = OFF )
GO 

Вывод будет следующим.

Удаление уже созданного индекса на таблицу

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

 ПРИМЕНЕНИЕ [испытание]
ИДТИ
СОЗДАТЬ КЛАСТЕРНЫЙ ИНДЕКС [ClusteredIndex-20191128-173307] ON [dbo].[Сотрудник]
(
[ИД] АСЦ,
[Dep_ID] ASC
)С (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, SORT_IN_TEMPDB = OFF, DROP_EXISTING = OFF, ONLINE = OFF,
ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) ON [ПЕРВИЧНЫЙ]
ВПЕРЕД 

Результат будет следующим:

Создание пользовательского индекса для таблицы с именем Employee

Мы создали пользовательский кластеризованный индекс для ID и Dep_ID. Это отсортирует строки по идентификатору, а затем по Dep_Id. Чтобы просмотреть это, выполните следующий код. Результат будет в порядке возрастания ID, а затем по Dep_id.

 ВЫБЕРИТЕ [ID], [Dep_ID], [Имя], [электронная почта], [город], [адрес] FROM [test].[dbo].[Employee] 

Вывод будет следующим.

Пользовательский кластеризованный индекс сортирует строки по Id, а затем по Dep_Id в соответствии с его определением.

Некластеризованный индекс — это особый тип индекса, в котором логический порядок индекса не соответствует физическому порядку строк, хранящихся на диске. Листовой узел некластеризованного индекса не содержит страниц данных, а содержит информацию о строках индекса. Таблица может иметь до 249 индексов. По умолчанию ограничение уникального ключа создает некластеризованный индекс. В операции чтения некластеризованные индексы выполняются медленнее, чем кластеризованные индексы. Некластеризованный индекс имеет копию данных из индексированных столбцов, хранящуюся в порядке вместе со ссылками на фактические строки данных; указатели на кластеризованный список, если таковые имеются. Поэтому рекомендуется выбирать только те столбцы, которые используются в индексе, вместо использования *. Таким образом, данные могут быть получены непосредственно из дублирующегося индекса. В противном случае кластеризованный индекс также используется для выбора оставшихся столбцов, если он создан.

Синтаксис, используемый для создания некластеризованного индекса, подобен кластеризованному индексу. Однако ключевое слово «НЕКЛАСТЕРНЫЙ» используется вместо «КЛАСТЕРНЫЙ» в случае некластеризованного индекса. Выполните следующий сценарий, чтобы создать некластеризованный индекс.

 ПРИМЕНЕНИЕ [испытание]
ИДТИ
ВКЛЮЧИТЕ ANSI_PADDING
ИДТИ
СОЗДАТЬ НЕКЛАСТЕРНЫЙ ИНДЕКС [NonClusteredIndex-20191129-104230] ON [dbo].[Сотрудник]
(
[Имя] АСК
)С (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, SORT_IN_TEMPDB = OFF, DROP_EXISTING = OFF, ONLINE = OFF,
ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) ON [ПЕРВИЧНЫЙ]
ВПЕРЕД 

Вывод будет следующим.

Создание некластеризованного индекса для таблицы с именем «Сотрудник».

Записи таблицы сортируются по кластерному индексу, если он был создан. Этот новый некластеризованный индекс будет сортировать таблицу в соответствии с ее определением и будет храниться по отдельному физическому адресу. Приведенный выше скрипт создаст индекс в столбце «ИМЯ» таблицы «Сотрудник». Этот индекс будет сортировать таблицу в порядке возрастания столбца «Имя». Как мы уже говорили ранее, данные таблицы и индекс будут храниться в разных местах. Теперь выполните следующий сценарий, чтобы просмотреть влияние нового некластеризованного индекса.

 выберите Имя из Сотрудника 

Вывод будет следующим.

По определению некластеризованного индекса в таблице «Сотрудник», он будет сортировать столбец «Имя» в порядке возрастания при выборе имени из таблицы.

На рисунке выше видно, что столбец «Имя» таблицы «Сотрудник» показан в порядке возрастания. столбца name, хотя мы не упомянули предложение «Order by ASC» с предложением select. Это связано с некластеризованным индексом в столбце «Имя», созданным в таблице «Сотрудник». Теперь, если запрос написан для получения имени, электронной почты, города и адреса конкретного человека. База данных сначала будет искать это конкретное имя в индексе, а затем извлекать соответствующие данные, что сократит время выборки запроса, особенно когда данные огромны.

 выберите Имя, адрес электронной почты, город, адрес из поля Сотрудник, где имя='Aaaronboy Gutierrez' 

Заключение

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