2013-09-02 3 views
2

Недавно я обнаружил включенные столбцы в индексах SQL Server. Включены ли столбцы в индекс, занимающие дополнительную память, или они хранятся на диске?Включены столбцы SQL Server 2008

Также может кто-то указать мне на последствия для производительности включения столбцов разных типов данных в виде включенных столбцов в Первичный ключ, который в моем случае обычно находится в?

Спасибо.

ответ

4

Я не совсем понимаю вопрос: «Включены ли столбцы в индекс, занимают дополнительную память или хранятся ли они на диске?» Индексы хранятся на диске (для сохранения) и в памяти (для производительности при использовании).

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

Такая экономия означает, что большая часть индекса может храниться в памяти в ограниченной по объему среде. И что индекс занимает меньше памяти, что позволяет использовать память для других вещей.

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

Место для посещения, чтобы узнать больше о них, - это Microsoft documentation.

0

От here: -

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

1

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

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

5

В SQL Server 2005 или более поздних версиях вы можете расширить функциональность некластеризованных индексов, добавив столбцы без ключа к уровню листа некластеризованного индекса.

Включая столбцы без клавиатуры, вы можете создавать некластеризованные индексы, которые покрывают больше запросов.Это связано с тем, что столбцы без ключа имеют следующие преимущества:

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

• Они не рассматривается Database Engine при расчете числа ключевых столбцов индекса или размера ключа индекса. Вы можете включать столбцы без ключа в некластеризованный индекс, чтобы избежать превышения ограничений текущего размера индекса максимум 16 ключей и максимального размера ключа ключа байтов.

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

Пример:

Create Table Script 
CREATE TABLE [dbo].[Profile](
    [EnrollMentId] [int] IDENTITY(1,1) NOT NULL, 
    [FName] [varchar](50) NULL, 
    [MName] [varchar](50) NULL, 
    [LName] [varchar](50) NULL, 
    [NickName] [varchar](50) NULL, 
    [DOB] [date] NULL, 
    [Qualification] [varchar](50) NULL, 
    [Profession] [varchar](50) NULL, 
    [MaritalStatus] [int] NULL, 
    [CurrentCity] [varchar](50) NULL, 
    [NativePlace] [varchar](50) NULL, 
    [District] [varchar](50) NULL, 
    [State] [varchar](50) NULL, 
    [Country] [varchar](50) NULL, 
    [UIDNO] [int] NOT NULL, 
    [Detail1] [varchar](max) NULL, 
    [Detail2] [varchar](max) NULL, 
    [Detail3] [varchar](max) NULL, 
    [Detail4] [varchar](max) NULL, 
PRIMARY KEY CLUSTERED 
(
    [EnrollMentId] ASC 
)WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) ON [PRIMARY] 
) ON [PRIMARY] TEXTIMAGE_ON [PRIMARY] 

GO 

SET ANSI_PADDING OFF 
GO 

Хранимая процедура сценария

CREATE Proc [dbo].[InsertIntoProfileTable] 
As 
BEGIN 
SET NOCOUNT ON 
Declare @currentRow int 
Declare @Details varchar(Max) 
Declare @dob Date 
set @currentRow =1; 
set @Details ='Let''s think about the book. Every page in the book has the page number. All information in this book is presented sequentially based on this page number. Speaking in the database terms, page number is the clustered index. Now think about the glossary at the end of the book. This is in alphabetical order and allow you to quickly find the page number specific glossary term belongs to. This represents non-clustered index with glossary term as the key column.  Now assuming that every page also shows "chapter" title at the top. If you want to find in what chapter is the glossary term, you have to lookup what page # describes glossary term, next - open corresponding page and see the chapter title on the page. This clearly represents key lookup - when you need to find the data from non-indexed column, you have to find actual data record (clustered index) and look at this column value. Included column helps in terms of performance - think about glossary where each chapter title includes in addition to glossary term. If you need to find out what chapter the glossary term belongs - you don''t need to open actual page - you can get it when you lookup the glossary term.  So included column are like those chapter titles. Non clustered Index (glossary) has addition attribute as part of the non-clustered index. Index is not sorted by included columns - it just additional attributes that helps to speed up the lookup (e.g. you don''t need to open actual page because information is already in the glossary index).' 
while(@currentRow <=200000) 
BEGIN 
insert into dbo.Profile values('FName'+ Cast(@currentRow as varchar), 'MName' + Cast(@currentRow as varchar), 'MName' + Cast(@currentRow as varchar), 'NickName' + Cast(@currentRow as varchar), DATEADD(DAY, ROUND(10000*RAND(),0),'01-01-1980'),NULL, NULL, @currentRow%3, NULL,NULL,NULL,NULL,NULL, [email protected],@Details,@Details,@Details,@Details) 
set @currentRow +=1; 
END 

SET NOCOUNT OFF 
END 

GO 

Используя выше SP вы можете вставить 200000 записей в одно время.

Вы можете видеть, что в столбце «EnrollMentId» имеется кластерный индекс .

Теперь создайте некластерный индекс в столбце «UIDNO».

Script

CREATE NONCLUSTERED INDEX [NonClusteredIndex-20140216-223309] ON [dbo].[Profile] 
(
    [UIDNO] ASC 
)WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, SORT_IN_TEMPDB = OFF, DROP_EXISTING = OFF, ONLINE = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) ON [PRIMARY] 
GO 

Теперь запустите следующий запрос

select UIDNO,FName,DOB, MaritalStatus, Detail1 from dbo.Profile --Takes about 30-50 seconds and return 200,000 results. 

Запрос 2

select UIDNO,FName,DOB, MaritalStatus, Detail1 from dbo.Profile 
where DOB between '01-01-1980' and '01-01-1985' 
--Takes about 10-15 seconds and return 36,479 records. 

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

CREATE NONCLUSTERED INDEX [NonClusteredIndex-20140216-231011] ON [dbo].[Profile] 
(
    [UIDNO] ASC, 
    [FName] ASC, 
    [DOB] ASC, 
    [MaritalStatus] ASC, 
    [Detail1] ASC 
)WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, SORT_IN_TEMPDB = OFF, DROP_EXISTING = OFF, ONLINE = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) ON [PRIMARY] 
GO 

Он будет бросать следующую ошибку Msg 1919, уровень 16, состояние 1, строка 1 в таблице Колонка «detail1» «dbo.Profile» имеет тип, который не подходит для использования в качестве ключевого столбца индекс.

Поскольку мы не можем использовать тип данных varchar (Max) в качестве ключевого столбца.

теперь создать индекс некластерированных с Включенные столбцы, используя следующий сценарий

CREATE NONCLUSTERED INDEX [NonClusteredIndex-20140216-231811] ON [dbo].[Profile] 
(
    [UIDNO] ASC 
) 
INCLUDE ( [FName], 
    [DOB], 
    [MaritalStatus], 
    [Detail1]) WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, SORT_IN_TEMPDB = OFF, DROP_EXISTING = OFF, ONLINE = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) ON [PRIMARY] 
GO 

Теперь запустите следующий запрос

select UIDNO,FName,DOB, MaritalStatus, Detail1 from dbo.Profile --Takes about 20-30 seconds and return 200,000 results. 

Запрос 2

select UIDNO,FName,DOB, MaritalStatus, Detail1 from dbo.Profile 
where DOB between '01-01-1980' and '01-01-1985' 
--Takes about 3-5 seconds and return 36,479 records. 
Смежные вопросы