0 added
0 removed
Original
2026-01-01
Modified
2026-03-10
1
<ul><li><a>Что такое индексы в sql server</a></li>
1
<ul><li><a>Что такое индексы в sql server</a></li>
2
<li><a>Об индексах и кучах</a></li>
2
<li><a>Об индексах и кучах</a></li>
3
<li><a>Структура</a></li>
3
<li><a>Структура</a></li>
4
<li><a>Типы индексов</a><ul><li><a>Кластерный индекс</a></li>
4
<li><a>Типы индексов</a><ul><li><a>Кластерный индекс</a></li>
5
<li><a>Некластерный индекс</a></li>
5
<li><a>Некластерный индекс</a></li>
6
</ul></li>
6
</ul></li>
7
<li><a>Специальные типы индексов</a><ul><li><a>Фильтруемый</a></li>
7
<li><a>Специальные типы индексов</a><ul><li><a>Фильтруемый</a></li>
8
<li><a>Составной</a></li>
8
<li><a>Составной</a></li>
9
<li><a>Уникальный</a></li>
9
<li><a>Уникальный</a></li>
10
<li><a>Колоночный</a></li>
10
<li><a>Колоночный</a></li>
11
<li><a>Пространственный</a></li>
11
<li><a>Пространственный</a></li>
12
<li><a>Полнотекстовый</a></li>
12
<li><a>Полнотекстовый</a></li>
13
<li><a>Покрывающий</a></li>
13
<li><a>Покрывающий</a></li>
14
<li><a>XML-индекс</a></li>
14
<li><a>XML-индекс</a></li>
15
<li><a>Индексы, используемые в оптимизированных таблицах</a></li>
15
<li><a>Индексы, используемые в оптимизированных таблицах</a></li>
16
<li><a>Создание и проектирование индексов в ms sql server</a></li>
16
<li><a>Создание и проектирование индексов в ms sql server</a></li>
17
</ul></li>
17
</ul></li>
18
<li><a>Базы данных</a></li>
18
<li><a>Базы данных</a></li>
19
<li><a>Запросы к базе данных</a></li>
19
<li><a>Запросы к базе данных</a></li>
20
<li><a>Способы создания индексов</a><ul><li><a>Как создать кластеризованный индекс</a></li>
20
<li><a>Способы создания индексов</a><ul><li><a>Как создать кластеризованный индекс</a></li>
21
<li><a>Как создать некластеризованный индекс</a></li>
21
<li><a>Как создать некластеризованный индекс</a></li>
22
<li><a>Создание Nonclustered index с включенными столбцами</a></li>
22
<li><a>Создание Nonclustered index с включенными столбцами</a></li>
23
</ul></li>
23
</ul></li>
24
<li><a>Удаление индекса</a><ul><li><a>Как выполнить изменение значений коэффициента, который установлен по умолчанию</a></li>
24
<li><a>Удаление индекса</a><ul><li><a>Как выполнить изменение значений коэффициента, который установлен по умолчанию</a></li>
25
<li><a>Особенности индексов и условий предложения WHERE</a></li>
25
<li><a>Особенности индексов и условий предложения WHERE</a></li>
26
</ul></li>
26
</ul></li>
27
<li><a>Оптимизация индексов</a><ul><li><a>Реорганизация индекса</a></li>
27
<li><a>Оптимизация индексов</a><ul><li><a>Реорганизация индекса</a></li>
28
<li><a>Перестроение индекса</a></li>
28
<li><a>Перестроение индекса</a></li>
29
</ul></li>
29
</ul></li>
30
</ul><p>Предлагаем расширить знания об индексах в MS SQL Server. Получите полное представление о них, преимуществах использования, структуре. Узнаете, как создавать индексы, оптимизировать и удалять. Все самое полезное читайте в одной статье.</p>
30
</ul><p>Предлагаем расширить знания об индексах в MS SQL Server. Получите полное представление о них, преимуществах использования, структуре. Узнаете, как создавать индексы, оптимизировать и удалять. Все самое полезное читайте в одной статье.</p>
31
<h2>Что такое индексы в sql server</h2>
31
<h2>Что такое индексы в sql server</h2>
32
<p>Разберемся в понятии индексов (indexes) - это особые таблицы, используемые поисковыми системами для поиска данных. Их активное использование играет важнейшую роль в повышении производительности sql серверов.</p>
32
<p>Разберемся в понятии индексов (indexes) - это особые таблицы, используемые поисковыми системами для поиска данных. Их активное использование играет важнейшую роль в повышении производительности sql серверов.</p>
33
<p>Словно указатель в грамотно составленной книге, индекс помогает быстро получить доступ к строкам требуемых данных в таблице, соответствующих запросу. Таким образом, их использование позволяет ускорить выполнение требуемого запроса. </p>
33
<p>Словно указатель в грамотно составленной книге, индекс помогает быстро получить доступ к строкам требуемых данных в таблице, соответствующих запросу. Таким образом, их использование позволяет ускорить выполнение требуемого запроса. </p>
34
<p>К примеру, для получения всех страниц в книге, касающихся выбранной тематики, сначала нужно обратиться к перечню тем, а затем выбрать нужные страницы. Для этого следует создать индекс по выбранной теме. На ее основе и будут выбираться ссылки на страницы книги по затронутой теме. Используя значения, заданные первичным ключом, sql server найдет нужный индекс и с его помощью быстро выберет все строки с необходимыми данными. Если не использовать индекс, то для поиска информации будет произведено сканирование каждой строки таблицы. Это значительно понизит производительность и увеличит время поиска.</p>
34
<p>К примеру, для получения всех страниц в книге, касающихся выбранной тематики, сначала нужно обратиться к перечню тем, а затем выбрать нужные страницы. Для этого следует создать индекс по выбранной теме. На ее основе и будут выбираться ссылки на страницы книги по затронутой теме. Используя значения, заданные первичным ключом, sql server найдет нужный индекс и с его помощью быстро выберет все строки с необходимыми данными. Если не использовать индекс, то для поиска информации будет произведено сканирование каждой строки таблицы. Это значительно понизит производительность и увеличит время поиска.</p>
35
<p>Благодаря индексу процесс поиска данных сокращается за счет их упорядочивания как физического, так и логического. Таким образом, он выглядит как набор ссылок на данные, которые упорядочены по выбранному столбцу таблицы. Такой столбец называется индексированным. Индексы находятся в таблице и по сути выступают полезными внутренними механизмами системы sql-сервера, которые помогают сделать доступ к данным наиболее оптимальным.</p>
35
<p>Благодаря индексу процесс поиска данных сокращается за счет их упорядочивания как физического, так и логического. Таким образом, он выглядит как набор ссылок на данные, которые упорядочены по выбранному столбцу таблицы. Такой столбец называется индексированным. Индексы находятся в таблице и по сути выступают полезными внутренними механизмами системы sql-сервера, которые помогают сделать доступ к данным наиболее оптимальным.</p>
36
<p>Создать стандартный индекс можно на всех столбцах данных, кроме:</p>
36
<p>Создать стандартный индекс можно на всех столбцах данных, кроме:</p>
37
<ul><li>столбцов, которые используются для хранения данных объектов, имеющих большие размеры, (LOB): TEXT, IMAGE, VARCHAR (MAX);</li>
37
<ul><li>столбцов, которые используются для хранения данных объектов, имеющих большие размеры, (LOB): TEXT, IMAGE, VARCHAR (MAX);</li>
38
<li>представленных в XML. Для работы с данными, представлены в таком формате используются xml-index, которые отличаются от стандартных. О них рассказано ниже.</li>
38
<li>представленных в XML. Для работы с данными, представлены в таком формате используются xml-index, которые отличаются от стандартных. О них рассказано ниже.</li>
39
</ul><h2>Об индексах и кучах</h2>
39
</ul><h2>Об индексах и кучах</h2>
40
<p>Как только таблица создана и в ней еще нет индексов, она выглядит как куча данных (Heap). В ней все записи хранятся хаотично, без определенного порядка. Потому их и называют "кучами".</p>
40
<p>Как только таблица создана и в ней еще нет индексов, она выглядит как куча данных (Heap). В ней все записи хранятся хаотично, без определенного порядка. Потому их и называют "кучами".</p>
41
<p>Если в таблице необходимо найти определенные данные, sql server просканирует ее (Table scan). Пока в таблице не заданы индексы, поддерживающие ограничения (UNIQUE CONSTRAINT, UNIQUE INDEX или PRIMARY KEY), сервер прочитает все табличные записи (с первой до последней) и выберет те, которые удовлетворяют условиям поиска.</p>
41
<p>Если в таблице необходимо найти определенные данные, sql server просканирует ее (Table scan). Пока в таблице не заданы индексы, поддерживающие ограничения (UNIQUE CONSTRAINT, UNIQUE INDEX или PRIMARY KEY), сервер прочитает все табличные записи (с первой до последней) и выберет те, которые удовлетворяют условиям поиска.</p>
42
<p>Это демонстрирует базовые функции indexes:</p>
42
<p>Это демонстрирует базовые функции indexes:</p>
43
<ul><li>повышение скорости поиска информации и производительности запросов;</li>
43
<ul><li>повышение скорости поиска информации и производительности запросов;</li>
44
<li>сохранение целостности данных через обеспечение уникальности строк таблицы.</li>
44
<li>сохранение целостности данных через обеспечение уникальности строк таблицы.</li>
45
</ul><p>Но не всегда индекс помогает ускорить поиск информации. Для таблиц небольших размеров обычный перебор данных может оказаться намного эффективнее выборки данных по индексам.</p>
45
</ul><p>Но не всегда индекс помогает ускорить поиск информации. Для таблиц небольших размеров обычный перебор данных может оказаться намного эффективнее выборки данных по индексам.</p>
46
<p>Indexes имеют и недостатки:</p>
46
<p>Indexes имеют и недостатки:</p>
47
<ul><li>требуется много места на дисковом пространстве и в оперативной памяти. Чем длиннее ключ, тем большего размера индекс и место для его хранения;</li>
47
<ul><li>требуется много места на дисковом пространстве и в оперативной памяти. Чем длиннее ключ, тем большего размера индекс и место для его хранения;</li>
48
<li>замедляется производительность системы (медленнее выполняются операции вставок, обновления либо удаления записей).</li>
48
<li>замедляется производительность системы (медленнее выполняются операции вставок, обновления либо удаления записей).</li>
49
</ul><p>Но современные методы их создания позволяют не только снижать негативный эффект для вышеперечисленных операций, но и увеличивать скорость выполнения.</p>
49
</ul><p>Но современные методы их создания позволяют не только снижать негативный эффект для вышеперечисленных операций, но и увеличивать скорость выполнения.</p>
50
<h2>Структура</h2>
50
<h2>Структура</h2>
51
<p>Все индексы имеют одинаковую структуру (structure). Они состоят из:</p>
51
<p>Все индексы имеют одинаковую структуру (structure). Они состоят из:</p>
52
<ul><li>наборов страниц;</li>
52
<ul><li>наборов страниц;</li>
53
<li>узлов, имеющих древовидную структуру, иерархическую по природе.</li>
53
<li>узлов, имеющих древовидную структуру, иерархическую по природе.</li>
54
</ul><p>Все они хранятся в виде сбалансированных B-деревьев (B-tree). Начало такого дерева расположено в корневом узле (находящимся на вершине иерархии) и по сути является "входной дверью". Этот узел имеет одну страницу, в которой содержатся указатели на ключи последующих уровней.</p>
54
</ul><p>Все они хранятся в виде сбалансированных B-деревьев (B-tree). Начало такого дерева расположено в корневом узле (находящимся на вершине иерархии) и по сути является "входной дверью". Этот узел имеет одну страницу, в которой содержатся указатели на ключи последующих уровней.</p>
55
<p>В нижней части иерархии расположены листья дерева (являющиеся конечными узлами). Длины веток одинаковы.</p>
55
<p>В нижней части иерархии расположены листья дерева (являющиеся конечными узлами). Длины веток одинаковы.</p>
56
<p>В таком дереве сбалансирована каждая ветка. Благодаря внутреннему механизму при любых изменениях в таблице дерево снова становится сбалансированным.</p>
56
<p>В таком дереве сбалансирована каждая ветка. Благодаря внутреннему механизму при любых изменениях в таблице дерево снова становится сбалансированным.</p>
57
<p>При формировании запроса к индексированному столбцу подсистема начинает процесс поиска с верхнего узла к нижним, проходя промежуточные и обрабатывая их. На каждом уровне располагается все более развернутая информация о запрашиваемых данных. Как только достигается нижний уровень листьев (leaf level) поиск прекращается, т.к. подсистема запросов находит необходимое значение.</p>
57
<p>При формировании запроса к индексированному столбцу подсистема начинает процесс поиска с верхнего узла к нижним, проходя промежуточные и обрабатывая их. На каждом уровне располагается все более развернутая информация о запрашиваемых данных. Как только достигается нижний уровень листьев (leaf level) поиск прекращается, т.к. подсистема запросов находит необходимое значение.</p>
58
<h2>Типы индексов</h2>
58
<h2>Типы индексов</h2>
59
<p>В Microsoft SQL Server используются следующие индексы: кластерные и некластерные. Рассмотрим их подробнее.</p>
59
<p>В Microsoft SQL Server используются следующие индексы: кластерные и некластерные. Рассмотрим их подробнее.</p>
60
<h3>Кластерный индекс</h3>
60
<h3>Кластерный индекс</h3>
61
<p>Основная его задача - сохранение табличных данных в виде, отсортированном по значению ключа. Таблице или представлению может быть присущ лишь единственный кластеризованный индекс (Clustered index), потому что табличные данные могут отсортировываться в едином возможном порядке - либо возрастания, либо убывания. По возможности, у каждой таблицы должен быть Clustered index.</p>
61
<p>Основная его задача - сохранение табличных данных в виде, отсортированном по значению ключа. Таблице или представлению может быть присущ лишь единственный кластеризованный индекс (Clustered index), потому что табличные данные могут отсортировываться в едином возможном порядке - либо возрастания, либо убывания. По возможности, у каждой таблицы должен быть Clustered index.</p>
62
<p>Табличные данные будут храниться отсортированными лишь в том случае, когда таблица имеет кластеризованный индекс. Строки табличных данных Clustered index хранит в уровнях листьев.</p>
62
<p>Табличные данные будут храниться отсортированными лишь в том случае, когда таблица имеет кластеризованный индекс. Строки табличных данных Clustered index хранит в уровнях листьев.</p>
63
<p>Если у таблицы нет Clustered index, в момент формирования ограничений PRIMARY KEY и UNIQUE, он формируется автоматически. Когда для таблиц/ куч созданы Nonclustered indexes, то в процессе создания Clustered index все некластеризованные должны быть перестроены.</p>
63
<p>Если у таблицы нет Clustered index, в момент формирования ограничений PRIMARY KEY и UNIQUE, он формируется автоматически. Когда для таблиц/ куч созданы Nonclustered indexes, то в процессе создания Clustered index все некластеризованные должны быть перестроены.</p>
64
<p>Содержание листьев зависит от того, индекс кластерный или некластерный. Они могут содержать как табличные данные, так и ссылки, указывающие на строки с ними.</p>
64
<p>Содержание листьев зависит от того, индекс кластерный или некластерный. Они могут содержать как табличные данные, так и ссылки, указывающие на строки с ними.</p>
65
<h3>Некластерный индекс</h3>
65
<h3>Некластерный индекс</h3>
66
<p>Некластеризованными (Nonclustered) называют такие индексы, которые содержат:</p>
66
<p>Некластеризованными (Nonclustered) называют такие индексы, которые содержат:</p>
67
<ul><li>значения ключей - ключевые столбцы, по которым они определены;</li>
67
<ul><li>значения ключей - ключевые столбцы, по которым они определены;</li>
68
<li>указатели на строки в таблице, содержащие реальные данные (значения ключа).</li>
68
<li>указатели на строки в таблице, содержащие реальные данные (значения ключа).</li>
69
</ul><p>Чтобы обнаружить и получить запрашиваемые данные, для системы подзапросов потребуется совершение дополнительных операций. Содержимое указателей на запрашиваемые данные полностью зависит от того, как они хранятся.</p>
69
</ul><p>Чтобы обнаружить и получить запрашиваемые данные, для системы подзапросов потребуется совершение дополнительных операций. Содержимое указателей на запрашиваемые данные полностью зависит от того, как они хранятся.</p>
70
<p>Он может указывать на:</p>
70
<p>Он может указывать на:</p>
71
<ul><li>кучу и тем самым приводить к идентификатору строки с искомыми данными;</li>
71
<ul><li>кучу и тем самым приводить к идентификатору строки с искомыми данными;</li>
72
<li>таблицу с Clustered index, указывая, что именно он используется что для поиска действительных данных.</li>
72
<li>таблицу с Clustered index, указывая, что именно он используется что для поиска действительных данных.</li>
73
</ul><p>Nonclustered indexes могут быть расширены дополнительными столбцами (included column). А значит, листья будут сохранять значения индексированных и дополнительных неиндексированных столбцов. Это свойство дает возможность обойти определенные ограничения, возложенные на индекс. Данный подход позволяет включать неиндексируемые столбцы либо обходить ограничения на длину индекса.</p>
73
</ul><p>Nonclustered indexes могут быть расширены дополнительными столбцами (included column). А значит, листья будут сохранять значения индексированных и дополнительных неиндексированных столбцов. Это свойство дает возможность обойти определенные ограничения, возложенные на индекс. Данный подход позволяет включать неиндексируемые столбцы либо обходить ограничения на длину индекса.</p>
74
<p>Главные свойства Nonclustered indexes:</p>
74
<p>Главные свойства Nonclustered indexes:</p>
75
<ul><li>их нельзя отсортировать;</li>
75
<ul><li>их нельзя отсортировать;</li>
76
<li>на таблицу или представление можно сформировать свыше одного (до 999) некластеризованных индексов. Но не стоит создавать максимальное количество Nonclustered indexes. Нужно помнить, что они способны как повысить, так и понизить производительность.</li>
76
<li>на таблицу или представление можно сформировать свыше одного (до 999) некластеризованных индексов. Но не стоит создавать максимальное количество Nonclustered indexes. Нужно помнить, что они способны как повысить, так и понизить производительность.</li>
77
</ul><p>Nonclustered indexes могут создаваться на любых таблицах, в том числе и имеющих кластерный индекс.</p>
77
</ul><p>Nonclustered indexes могут создаваться на любых таблицах, в том числе и имеющих кластерный индекс.</p>
78
<h2>Специальные типы индексов</h2>
78
<h2>Специальные типы индексов</h2>
79
<p>Существует большое число специальных индексов, которые могут быть как кластерными, так и некластерными. Рассмотрим некоторые из них.</p>
79
<p>Существует большое число специальных индексов, которые могут быть как кластерными, так и некластерными. Рассмотрим некоторые из них.</p>
80
<h3>Фильтруемый</h3>
80
<h3>Фильтруемый</h3>
81
<p>Фильтруемым (Filtered) индексом называют оптимизированный Nonclustered index, в котором задействован предикат фильтра для индексации части строк в таблице.</p>
81
<p>Фильтруемым (Filtered) индексом называют оптимизированный Nonclustered index, в котором задействован предикат фильтра для индексации части строк в таблице.</p>
82
<p>Тщательно спроектированный Filtered index способен:</p>
82
<p>Тщательно спроектированный Filtered index способен:</p>
83
<ul><li>увеличить производительность;</li>
83
<ul><li>увеличить производительность;</li>
84
<li>уменьшить затраты на обслуживание и хранение индексов.</li>
84
<li>уменьшить затраты на обслуживание и хранение индексов.</li>
85
</ul><h3>Составной</h3>
85
</ul><h3>Составной</h3>
86
<p>Составным называют индекс, который:</p>
86
<p>Составным называют индекс, который:</p>
87
<ul><li>может включать более одного (до 16) столбцов, выступающих ключевыми значениями;</li>
87
<ul><li>может включать более одного (до 16) столбцов, выступающих ключевыми значениями;</li>
88
<li>ограничивается общей длиной (не превышающей 900 байт);</li>
88
<li>ограничивается общей длиной (не превышающей 900 байт);</li>
89
<li>содержит поля, которые принадлежат единой таблице.</li>
89
<li>содержит поля, которые принадлежат единой таблице.</li>
90
</ul><p>Простые индексы, в отличие от составных, создаются лишь по единственному столбцу.</p>
90
</ul><p>Простые индексы, в отличие от составных, создаются лишь по единственному столбцу.</p>
91
<p>Создание составных индексов целесообразно, когда:</p>
91
<p>Создание составных индексов целесообразно, когда:</p>
92
<ul><li>для поискового запроса ключами выступают два и более столбцов;</li>
92
<ul><li>для поискового запроса ключами выступают два и более столбцов;</li>
93
<li>в поисковом запросе используются все поля составного индекса. Поисковый запрос, в котором не задействованы все поля, вероятнее всего, использоваться не будет.</li>
93
<li>в поисковом запросе используются все поля составного индекса. Поисковый запрос, в котором не задействованы все поля, вероятнее всего, использоваться не будет.</li>
94
</ul><p>Отличным примером может служить телефонный справочник. Он сформирован по фамилии и имени, т.к. много людей имеют одинаковую фамилию. Следовательно, логично будет создать индекс одновременно и по фамилии, и по имени.</p>
94
</ul><p>Отличным примером может служить телефонный справочник. Он сформирован по фамилии и имени, т.к. много людей имеют одинаковую фамилию. Следовательно, логично будет создать индекс одновременно и по фамилии, и по имени.</p>
95
<p>Отметим, что наивысший приоритет в процессе сортировки принадлежит первым колонкам, описываемым в CREATE INDEX. Потому, в числе первых должны указываться колонки уникальные. Чтобы индекс был задействован при выборке данных в таблице, сам запрос обязательно должен ссылаться именно на колонку, указанную первой.</p>
95
<p>Отметим, что наивысший приоритет в процессе сортировки принадлежит первым колонкам, описываемым в CREATE INDEX. Потому, в числе первых должны указываться колонки уникальные. Чтобы индекс был задействован при выборке данных в таблице, сам запрос обязательно должен ссылаться именно на колонку, указанную первой.</p>
96
<p>Использование составных индексов поможет увеличить производительность за счет того, что для выполнения поиска данных сервер будет сканировать только его, что поможет снизить в таблице число индексов.</p>
96
<p>Использование составных индексов поможет увеличить производительность за счет того, что для выполнения поиска данных сервер будет сканировать только его, что поможет снизить в таблице число индексов.</p>
97
<p>Query Optimizer использует их в зависимости от структуры запроса.</p>
97
<p>Query Optimizer использует их в зависимости от структуры запроса.</p>
98
<h3>Уникальный</h3>
98
<h3>Уникальный</h3>
99
<p>Уникальным (Unique) называют индекс, обеспечивающий уникальное значение всех строк по определенному ключу и гарантирующий, что в ключе индекса не будет значений одинаковых, повторяющихся. Для составного ключа понятие уникальности касается всех index columns, но не распространяется на каждый столбец в отдельности.</p>
99
<p>Уникальным (Unique) называют индекс, обеспечивающий уникальное значение всех строк по определенному ключу и гарантирующий, что в ключе индекса не будет значений одинаковых, повторяющихся. Для составного ключа понятие уникальности касается всех index columns, но не распространяется на каждый столбец в отдельности.</p>
100
<p>Если в таблице формируется Unique index одновременно по ряду столбцов, это означает, что абсолютно каждая вариация значений в ключе будет уникальной.</p>
100
<p>Если в таблице формируется Unique index одновременно по ряду столбцов, это означает, что абсолютно каждая вариация значений в ключе будет уникальной.</p>
101
<p>SQL сервером создается автоматически Unique index для ключевых столбцов при формировании ограничений UNIQUE либо PRIMARY KEY. Но он формируется лишь при выполнении условия отсутствия дублей в ключевых столбцах таблицы.</p>
101
<p>SQL сервером создается автоматически Unique index для ключевых столбцов при формировании ограничений UNIQUE либо PRIMARY KEY. Но он формируется лишь при выполнении условия отсутствия дублей в ключевых столбцах таблицы.</p>
102
<p>Уникальный индекс создается автоматом при определении ограничений столбца:</p>
102
<p>Уникальный индекс создается автоматом при определении ограничений столбца:</p>
103
<ul><li>первичным ключом (на один столбец либо сразу на несколько), при условии, что кластерный индекс ранее не создавался. В том случае, когда он все-таки уже создан, сервер создаст уникальный некластерный индекс по первичному ключу;</li>
103
<ul><li>первичным ключом (на один столбец либо сразу на несколько), при условии, что кластерный индекс ранее не создавался. В том случае, когда он все-таки уже создан, сервер создаст уникальный некластерный индекс по первичному ключу;</li>
104
<li>ограничением на уникальность значений - сервером создается Unique Nonclustered index. Когда кластерный индекс не был сформирован заранее, есть возможность создания именно Unique Clustered index.</li>
104
<li>ограничением на уникальность значений - сервером создается Unique Nonclustered index. Когда кластерный индекс не был сформирован заранее, есть возможность создания именно Unique Clustered index.</li>
105
</ul><h3>Колоночный</h3>
105
</ul><h3>Колоночный</h3>
106
<p>Колоночным (Columnstore) называют индекс, в котором данные хранятся в столбцах. Использование Columnstore indexes наиболее целесообразно применять для крупных хранилищ, т.к. они помогут:</p>
106
<p>Колоночным (Columnstore) называют индекс, в котором данные хранятся в столбцах. Использование Columnstore indexes наиболее целесообразно применять для крупных хранилищ, т.к. они помогут:</p>
107
<ul><li>производительность запросов увеличить в несколько раз;</li>
107
<ul><li>производительность запросов увеличить в несколько раз;</li>
108
<li>размеры данных уменьшить (благодаря их сжатию).</li>
108
<li>размеры данных уменьшить (благодаря их сжатию).</li>
109
</ul><h3>Пространственный</h3>
109
</ul><h3>Пространственный</h3>
110
<p>Пространственным (Spatial) называют тип расширенного индекса, позволяющего индексировать столбцы с пространственными данными (представленные в типах Geography или Geometry). Spatial index позволяет наилучшим образом использовать определенные операции запросов относительно пространственных столбцов и может создаваться только для них.</p>
110
<p>Пространственным (Spatial) называют тип расширенного индекса, позволяющего индексировать столбцы с пространственными данными (представленные в типах Geography или Geometry). Spatial index позволяет наилучшим образом использовать определенные операции запросов относительно пространственных столбцов и может создаваться только для них.</p>
111
<p>Основное условие создания пространственного индекса - наличие PRIMARY KEY для таблиц.</p>
111
<p>Основное условие создания пространственного индекса - наличие PRIMARY KEY для таблиц.</p>
112
<h3>Полнотекстовый</h3>
112
<h3>Полнотекстовый</h3>
113
<p>Полнотекстовые (Full-text) индексы применяются для повышения эффективности поиска определенных слов в строках, где данные представлены в символах.</p>
113
<p>Полнотекстовые (Full-text) индексы применяются для повышения эффективности поиска определенных слов в строках, где данные представлены в символах.</p>
114
<p>Действия по созданию и обслуживанию Full-text indexes называются "заполнениями". Встречаются заполнения:</p>
114
<p>Действия по созданию и обслуживанию Full-text indexes называются "заполнениями". Встречаются заполнения:</p>
115
<ul><li>полное - осуществляется SQL сервером после создания нового Full-text index. Размер таблицы влияет на затребованный объем ресурсов. При увеличении размера на операцию требуются ресурсы большего размера. Потому предусмотрена возможность откладывания этого процесса;</li>
115
<ul><li>полное - осуществляется SQL сервером после создания нового Full-text index. Размер таблицы влияет на затребованный объем ресурсов. При увеличении размера на операцию требуются ресурсы большего размера. Потому предусмотрена возможность откладывания этого процесса;</li>
116
<li>основанное на отслеживании изменений - применяется для того, чтобы обслуживать Full-text index после полного заполнения (первоначального).</li>
116
<li>основанное на отслеживании изменений - применяется для того, чтобы обслуживать Full-text index после полного заполнения (первоначального).</li>
117
</ul><h3>Покрывающий</h3>
117
</ul><h3>Покрывающий</h3>
118
<p>Покрывающим (Covering) называют индекс, позволяющий на конкретный запрос получать запрашиваемую информацию в полном объеме с листьев индекса, не обращаясь к записям таблицы. А значит, в Covering index хранится достаточный объем данных для полноценного ответа на запрос. Потому нет необходимости обращаться к таблице.</p>
118
<p>Покрывающим (Covering) называют индекс, позволяющий на конкретный запрос получать запрашиваемую информацию в полном объеме с листьев индекса, не обращаясь к записям таблицы. А значит, в Covering index хранится достаточный объем данных для полноценного ответа на запрос. Потому нет необходимости обращаться к таблице.</p>
119
<p>Благодаря тому, что ответ можно получить без использования таблицы, покрывающие индексы быстрее остальных. Однако, они становятся достаточно большими, потому злоупотреблять ими не стоит.</p>
119
<p>Благодаря тому, что ответ можно получить без использования таблицы, покрывающие индексы быстрее остальных. Однако, они становятся достаточно большими, потому злоупотреблять ими не стоит.</p>
120
<h3>XML-индекс</h3>
120
<h3>XML-индекс</h3>
121
<p>XML - специфический тип индекса, предназначенный для работы с данными в столбцах таблицы, представленными в соответствующем формате. Он делает более эффективной обработку поисковых запросов к ним.</p>
121
<p>XML - специфический тип индекса, предназначенный для работы с данными в столбцах таблицы, представленными в соответствующем формате. Он делает более эффективной обработку поисковых запросов к ним.</p>
122
<p>Встречаются XML-indexes:</p>
122
<p>Встречаются XML-indexes:</p>
123
<ul><li>первичные - индексируют, хранят в столбцах XML теги, пути, значения. Целесообразно создавать, когда таблица по первичному ключу имеет кластерный индекс;</li>
123
<ul><li>первичные - индексируют, хранят в столбцах XML теги, пути, значения. Целесообразно создавать, когда таблица по первичному ключу имеет кластерный индекс;</li>
124
<li>вторичные - создаются лишь для таблиц с первичным XML-index. Применяются для увеличения производительности системы по определенному типу обращения к XML-столбцам. Встречаются типы XML-indexes: PATH, VALUE, PROPERTY.</li>
124
<li>вторичные - создаются лишь для таблиц с первичным XML-index. Применяются для увеличения производительности системы по определенному типу обращения к XML-столбцам. Встречаются типы XML-indexes: PATH, VALUE, PROPERTY.</li>
125
</ul><h3>Индексы, используемые в оптимизированных таблицах</h3>
125
</ul><h3>Индексы, используемые в оптимизированных таблицах</h3>
126
<p>Активно используются специальные индексы для таблиц данных:</p>
126
<p>Активно используются специальные индексы для таблиц данных:</p>
127
<ul><li>оптимизированные для памяти (In-Memory OLTP). К таковым относятся Хэш индексы (Hash);</li>
127
<ul><li>оптимизированные для памяти (In-Memory OLTP). К таковым относятся Хэш индексы (Hash);</li>
128
<li>Nonclustered indexes, которые специально создаются для сканирования (как упорядоченного, так и диапазонного) и оптимизируются для памяти.</li>
128
<li>Nonclustered indexes, которые специально создаются для сканирования (как упорядоченного, так и диапазонного) и оптимизируются для памяти.</li>
129
</ul><h3>Создание и проектирование индексов в ms sql server</h3>
129
</ul><h3>Создание и проектирование индексов в ms sql server</h3>
130
<p>Польза индексов очевидна, потому и проектироваться они должны крайне аккуратно. Созданные тщательным образом способны улучшить производительность, а непрофессионально - понизить.</p>
130
<p>Польза индексов очевидна, потому и проектироваться они должны крайне аккуратно. Созданные тщательным образом способны улучшить производительность, а непрофессионально - понизить.</p>
131
<p>Индексы занимают достаточно много дискового места, потому не имеет смысла создавать их больше, чем нужно. Более того, при каждом обновлении строк, автоматически обновляются и индексы. Это в свою очередь может потребовать увеличения ресурсов и грозить снижением производительности.</p>
131
<p>Индексы занимают достаточно много дискового места, потому не имеет смысла создавать их больше, чем нужно. Более того, при каждом обновлении строк, автоматически обновляются и индексы. Это в свою очередь может потребовать увеличения ресурсов и грозить снижением производительности.</p>
132
<p>Очень важно при проектировании соблюдать ряд требований как к базам данных, так и к запросам направленным к ним.</p>
132
<p>Очень важно при проектировании соблюдать ряд требований как к базам данных, так и к запросам направленным к ним.</p>
133
<h2>Базы данных</h2>
133
<h2>Базы данных</h2>
134
<p>Как сказано выше, производительность системы напрямую зависит от индексов. При поступлении запроса они могут увеличивать ее, обеспечивая быстрый поиск данных либо снижать, т.к. при каждой операции с данными будут изменяться и они, дабы отражать действия, производимые над данными. И не важно, что происходит с ними - добавление, удаление или обновление.</p>
134
<p>Как сказано выше, производительность системы напрямую зависит от индексов. При поступлении запроса они могут увеличивать ее, обеспечивая быстрый поиск данных либо снижать, т.к. при каждой операции с данными будут изменяться и они, дабы отражать действия, производимые над данными. И не важно, что происходит с ними - добавление, удаление или обновление.</p>
135
<p>Потому, при разработке плана стратегии по индексированию, необходимо придерживаться советов специалистов:</p>
135
<p>Потому, при разработке плана стратегии по индексированию, необходимо придерживаться советов специалистов:</p>
136
<ol><li>Если предполагается частое обновление данных в таблице, то для нее нужно применять минимум индексов.</li>
136
<ol><li>Если предполагается частое обновление данных в таблице, то для нее нужно применять минимум индексов.</li>
137
<li>Для таблицы со значительным количеством данных, которые предположительно будут редко изменяться, можно использовать то число индексов, которое улучшит производительность запросов. Но для таблиц небольшого объема не всегда целесообразно вообще их использовать. Такой поиск может выполняться дольше, чем обычное сканирование таблицы.</li>
137
<li>Для таблицы со значительным количеством данных, которые предположительно будут редко изменяться, можно использовать то число индексов, которое улучшит производительность запросов. Но для таблиц небольшого объема не всегда целесообразно вообще их использовать. Такой поиск может выполняться дольше, чем обычное сканирование таблицы.</li>
138
<li>Для Clustered indexes используйте самые короткие поля, которые только допустимы. Лучше всего их применять на столбцах с уникальными значениями и в которых не допускается использование NULL. По этой причине чаще всего PRIMARY KEY выступает в роли Clustered index.</li>
138
<li>Для Clustered indexes используйте самые короткие поля, которые только допустимы. Лучше всего их применять на столбцах с уникальными значениями и в которых не допускается использование NULL. По этой причине чаще всего PRIMARY KEY выступает в роли Clustered index.</li>
139
<li>Производительность индекса напрямую зависит от того, насколько уникальны значения в столбце. Она снижается с увеличением дублей если в столбце и растет с уменьшением. Потому, при каждой возможности следует использовать уникальный индекс.</li>
139
<li>Производительность индекса напрямую зависит от того, насколько уникальны значения в столбце. Она снижается с увеличением дублей если в столбце и растет с уменьшением. Потому, при каждой возможности следует использовать уникальный индекс.</li>
140
<li>Если используется составной индекс, то в нем нужно учитывать порядок столбцов. Первыми идут те, в которых в выражениях используется WHERE. За ними - столбцы с наивысшими показателями уникальных значений. Остальные выстраиваются по мере понижения этого показателя.</li>
140
<li>Если используется составной индекс, то в нем нужно учитывать порядок столбцов. Первыми идут те, в которых в выражениях используется WHERE. За ними - столбцы с наивысшими показателями уникальных значений. Остальные выстраиваются по мере понижения этого показателя.</li>
141
<li>Допускается использование индекса на вычисляемых столбцах таблицы, но лишь при условии соблюдения определенных требований (для вычисления значений такого столбца могут использоваться только детерминистические выражения, т.е. результат для определенного набора входящих параметров всегда должен быть одинаковым).</li>
141
<li>Допускается использование индекса на вычисляемых столбцах таблицы, но лишь при условии соблюдения определенных требований (для вычисления значений такого столбца могут использоваться только детерминистические выражения, т.е. результат для определенного набора входящих параметров всегда должен быть одинаковым).</li>
142
</ol><h2>Запросы к базе данных</h2>
142
</ol><h2>Запросы к базе данных</h2>
143
<p>При проектировании вторым важным пунктом является понимание и учет того, какие выполняются запросы к базе данных. Необходимо учитывать частоту изменения данных, а также требуется соблюдение определенных принципов:</p>
143
<p>При проектировании вторым важным пунктом является понимание и учет того, какие выполняются запросы к базе данных. Необходимо учитывать частоту изменения данных, а также требуется соблюдение определенных принципов:</p>
144
<ul><li>Предпочтительнее, чтобы один запрос содержал наибольшее число строк, нежели разбивать их на соответствующее число отдельных запросов.</li>
144
<ul><li>Предпочтительнее, чтобы один запрос содержал наибольшее число строк, нежели разбивать их на соответствующее число отдельных запросов.</li>
145
<li>На столбцах, используемых в запросах с WHERE чаще всего, предпочтительнее создавать Nonclustered index в качестве условия поиска и соединения в JOIN.</li>
145
<li>На столбцах, используемых в запросах с WHERE чаще всего, предпочтительнее создавать Nonclustered index в качестве условия поиска и соединения в JOIN.</li>
146
<li>Следует воспользоваться возможностями индексирования столбцов, используемых в поисковых запросах на соответствие конкретным значениям.</li>
146
<li>Следует воспользоваться возможностями индексирования столбцов, используемых в поисковых запросах на соответствие конкретным значениям.</li>
147
</ul><h2>Способы создания индексов</h2>
147
</ul><h2>Способы создания индексов</h2>
148
<p>Предусмотрено создание индексов ms sql server с помощью двух инструментов. В этом помогут:</p>
148
<p>Предусмотрено создание индексов ms sql server с помощью двух инструментов. В этом помогут:</p>
149
<ul><li>SSMS (MSSQL Management Studio);</li>
149
<ul><li>SSMS (MSSQL Management Studio);</li>
150
<li>специальный язык Transact-SQL (T-SQL, поддерживающий Paging Queries).</li>
150
<li>специальный язык Transact-SQL (T-SQL, поддерживающий Paging Queries).</li>
151
</ul><h3>Как создать кластеризованный индекс</h3>
151
</ul><h3>Как создать кластеризованный индекс</h3>
152
<p>Как отмечалось выше, создание кластеризованного индекса sql сервером происходит автоматически, когда определенный столбец выбирается в качестве первичного ключа (PRIMARY KEY). Когда такого не происходит, следует создать кластерный индекс своими руками.</p>
152
<p>Как отмечалось выше, создание кластеризованного индекса sql сервером происходит автоматически, когда определенный столбец выбирается в качестве первичного ключа (PRIMARY KEY). Когда такого не происходит, следует создать кластерный индекс своими руками.</p>
153
<p>Чтобы создать Clustered index воспользуемся Management Studio. Для этого следует:</p>
153
<p>Чтобы создать Clustered index воспользуемся Management Studio. Для этого следует:</p>
154
<ol><li>Открыть SSMS.</li>
154
<ol><li>Открыть SSMS.</li>
155
<li>Воспользовавшись обозревателем выбрать соответствующую таблицу.</li>
155
<li>Воспользовавшись обозревателем выбрать соответствующую таблицу.</li>
156
<li>Остановившись на пункте "Индексы" кликнуть мышкой.</li>
156
<li>Остановившись на пункте "Индексы" кликнуть мышкой.</li>
157
<li>Выбрать "Создать индекс" и соответствующий тип (выбираем "Кластеризованный").</li>
157
<li>Выбрать "Создать индекс" и соответствующий тип (выбираем "Кластеризованный").</li>
158
<li>В новом окне появится форма "Новый индекс". Здесь потребуется вписать наименование нового создаваемого индекса (в рамках одной таблицы требуется, чтобы оно было уникальным). Поставить галочку, что он уникальный.</li>
158
<li>В новом окне появится форма "Новый индекс". Здесь потребуется вписать наименование нового создаваемого индекса (в рамках одной таблицы требуется, чтобы оно было уникальным). Поставить галочку, что он уникальный.</li>
159
<li>Выбрать столбец, который будет являться ключом индекса. Он ляжет в основу создаваемого Clustered index. Провести сортировку строк табличных данных кнопкой "Добавить".</li>
159
<li>Выбрать столбец, который будет являться ключом индекса. Он ляжет в основу создаваемого Clustered index. Провести сортировку строк табличных данных кнопкой "Добавить".</li>
160
<li>После ввода всех необходимых параметров кликнуть "ОК".</li>
160
<li>После ввода всех необходимых параметров кликнуть "ОК".</li>
161
</ol><p>Результатом действий станет кластерный индекс.</p>
161
</ol><p>Результатом действий станет кластерный индекс.</p>
162
<p>Он может быть создан и с помощью инструкций Transact-SQL CREATRE INDEX.</p>
162
<p>Он может быть создан и с помощью инструкций Transact-SQL CREATRE INDEX.</p>
163
<h3>Как создать некластеризованный индекс</h3>
163
<h3>Как создать некластеризованный индекс</h3>
164
<p>Для создания Nonclustered index можно воспользоваться Management Studio либо инструкциями T-SQL. </p>
164
<p>Для создания Nonclustered index можно воспользоваться Management Studio либо инструкциями T-SQL. </p>
165
<h3>Создание Nonclustered index с включенными столбцами</h3>
165
<h3>Создание Nonclustered index с включенными столбцами</h3>
166
<p>Коснемся вопроса, как создать Nonclustered index с условием, что в индекс включены столбцы, которые не являются ключевыми. Такой индекс принято использовать в тех случаях, когда индекс создается под конкретный запрос. К примеру, чтобы индексом покрывался запрос полностью, т.е. включал все столбцы. Вследствие того, что запрос покрыт, увеличивается производительность. Это становится возможным благодаря тому, что оптимизатор запросов может получить все значения столбцов в индексе без обращения к табличным данным. Это ведет к уменьшению числа операций ввода-вывода на диске.</p>
166
<p>Коснемся вопроса, как создать Nonclustered index с условием, что в индекс включены столбцы, которые не являются ключевыми. Такой индекс принято использовать в тех случаях, когда индекс создается под конкретный запрос. К примеру, чтобы индексом покрывался запрос полностью, т.е. включал все столбцы. Вследствие того, что запрос покрыт, увеличивается производительность. Это становится возможным благодаря тому, что оптимизатор запросов может получить все значения столбцов в индексе без обращения к табличным данным. Это ведет к уменьшению числа операций ввода-вывода на диске.</p>
167
<p>Однако стоит учитывать, что с включением в индекс неключевых столбцов размер его увеличивается. А значит, для его хранения понадобится больше дискового пространства. Это также может снизить производительность операций INSERT, UPDATE, DELETE и MERGE в базовой таблице данных.</p>
167
<p>Однако стоит учитывать, что с включением в индекс неключевых столбцов размер его увеличивается. А значит, для его хранения понадобится больше дискового пространства. Это также может снизить производительность операций INSERT, UPDATE, DELETE и MERGE в базовой таблице данных.</p>
168
<p>Для его создания также воспользуемся Management Studio:</p>
168
<p>Для его создания также воспользуемся Management Studio:</p>
169
<ol><li>Открыть SSMS.</li>
169
<ol><li>Открыть SSMS.</li>
170
<li>Воспользовавшись обозревателем выбрать требуемую таблицу и щелкнуть мышкой по пункту "Индексы".</li>
170
<li>Воспользовавшись обозревателем выбрать требуемую таблицу и щелкнуть мышкой по пункту "Индексы".</li>
171
<li>Выбрать "Создать индекс", а затем "Некластеризованный" (не ставить галочку на уникальности).</li>
171
<li>Выбрать "Создать индекс", а затем "Некластеризованный" (не ставить галочку на уникальности).</li>
172
<li>В открывшейся форме "Новый индекс" вписать наименование нового индекса, добавить один или несколько ключевых столбцов, воспользовавшись кнопкой "Добавить".</li>
172
<li>В открывшейся форме "Новый индекс" вписать наименование нового индекса, добавить один или несколько ключевых столбцов, воспользовавшись кнопкой "Добавить".</li>
173
<li>Перейти во вкладку "Включено столбцы". Добавить все столбцы, которые должны быть включены в индекс, воспользовавшись кнопкой "Добавить".</li>
173
<li>Перейти во вкладку "Включено столбцы". Добавить все столбцы, которые должны быть включены в индекс, воспользовавшись кнопкой "Добавить".</li>
174
<li>Когда введены все нужные параметры кликнуть "ОК".</li>
174
<li>Когда введены все нужные параметры кликнуть "ОК".</li>
175
</ol><p>Все готово!</p>
175
</ol><p>Все готово!</p>
176
<p>При необходимости, можно легко создать фильтруемый Nonclustered index. Для этого следует воспользоваться T-SQL и в операторе CREATE NONCLUSTERED INDEX в WHERE указать условие фильтрации. Так можно отфильтровать практически любые данные, не важные в запросах.</p>
176
<p>При необходимости, можно легко создать фильтруемый Nonclustered index. Для этого следует воспользоваться T-SQL и в операторе CREATE NONCLUSTERED INDEX в WHERE указать условие фильтрации. Так можно отфильтровать практически любые данные, не важные в запросах.</p>
177
<h2>Удаление индекса</h2>
177
<h2>Удаление индекса</h2>
178
<p>Пришло время узнать о том, какими способами могут удаляться индексы. Для начала воспользуемся Management Studio. Для этого необходимо:</p>
178
<p>Пришло время узнать о том, какими способами могут удаляться индексы. Для начала воспользуемся Management Studio. Для этого необходимо:</p>
179
<ol><li>Открыть SSMS.</li>
179
<ol><li>Открыть SSMS.</li>
180
<li>Выбрать индекс, подлежащий удалению.</li>
180
<li>Выбрать индекс, подлежащий удалению.</li>
181
<li>Щелкнуть мышкой по нему и из списка выбрать "Удалить".</li>
181
<li>Щелкнуть мышкой по нему и из списка выбрать "Удалить".</li>
182
<li>Выполненное действие подтвердить нажатием "ОК".</li>
182
<li>Выполненное действие подтвердить нажатием "ОК".</li>
183
</ol><p>Удаление индексов выполняется и с помощью инструкций T-SQL DROP INDEX (DROP INDEX IX_NonClustered ON TestTable). Однако ею нельзя воспользоваться для удаления тех индексов, которые создавались через формирование ограничений PRIMARY KEY и UNIQUE. Чтобы удалить их, следует воспользоваться инструкцией ALTER TABLE с предложением DROP CONSTRAINT.</p>
183
</ol><p>Удаление индексов выполняется и с помощью инструкций T-SQL DROP INDEX (DROP INDEX IX_NonClustered ON TestTable). Однако ею нельзя воспользоваться для удаления тех индексов, которые создавались через формирование ограничений PRIMARY KEY и UNIQUE. Чтобы удалить их, следует воспользоваться инструкцией ALTER TABLE с предложением DROP CONSTRAINT.</p>
184
<h3>Как выполнить изменение значений коэффициента, который установлен по умолчанию</h3>
184
<h3>Как выполнить изменение значений коэффициента, который установлен по умолчанию</h3>
185
<p>Чтобы внести изменения в значения коэффициента, которые установлены по умолчанию, следует воспользоваться:</p>
185
<p>Чтобы внести изменения в значения коэффициента, которые установлены по умолчанию, следует воспользоваться:</p>
186
<ul><li>SSMS;</li>
186
<ul><li>SSMS;</li>
187
<li>инструкцией T-SQL, выполнив запуск системной сохраненной процедуры;</li>
187
<li>инструкцией T-SQL, выполнив запуск системной сохраненной процедуры;</li>
188
<li> sp configure.</li>
188
<li> sp configure.</li>
189
</ul><h3>Особенности индексов и условий предложения WHERE</h3>
189
</ul><h3>Особенности индексов и условий предложения WHERE</h3>
190
<p>Если предложение WHERE инструкции SELECT содержит условие поиска данных с одним столбцом, то необходимо для него создать индекс. Это условие очень важно при высокой селективности (selectivity) условия.</p>
190
<p>Если предложение WHERE инструкции SELECT содержит условие поиска данных с одним столбцом, то необходимо для него создать индекс. Это условие очень важно при высокой селективности (selectivity) условия.</p>
191
<p>Но он будет абсолютно бесполезным при постоянном уровне селективности от 80% и выше. Простое сканирование табличных данных потребует меньше времени.</p>
191
<p>Но он будет абсолютно бесполезным при постоянном уровне селективности от 80% и выше. Простое сканирование табличных данных потребует меньше времени.</p>
192
<p>Если в часто применяемом запросе условие поиска включает оператор AND, то лучше всего - создать составной индекс, включив в него сразу все табличные столбцы, которые указывались в предложении WHERE инструкции SELECT.</p>
192
<p>Если в часто применяемом запросе условие поиска включает оператор AND, то лучше всего - создать составной индекс, включив в него сразу все табличные столбцы, которые указывались в предложении WHERE инструкции SELECT.</p>
193
<h2>Оптимизация индексов</h2>
193
<h2>Оптимизация индексов</h2>
194
<p>После выполнения любых действий с табличными данными sql сервером в тот же момент производятся соответствующие правки в индексах. Спустя некоторое время все подобные исправления могут спровоцировать фрагментацию данных. В результате, их может разбросать по всей базе.</p>
194
<p>После выполнения любых действий с табличными данными sql сервером в тот же момент производятся соответствующие правки в индексах. Спустя некоторое время все подобные исправления могут спровоцировать фрагментацию данных. В результате, их может разбросать по всей базе.</p>
195
<p>Подобная фрагментация данных может стать причиной понижения производительности. Потому крайне важно время от времени проводить дефрагментацию. К подобным операциям по обслуживанию индексов относят реорганизацию и перестроение индексов.</p>
195
<p>Подобная фрагментация данных может стать причиной понижения производительности. Потому крайне важно время от времени проводить дефрагментацию. К подобным операциям по обслуживанию индексов относят реорганизацию и перестроение индексов.</p>
196
<p>Чтобы понять, какую именно операцию требуется провести - реорганизацию или перестроение, следует выяснить степень фрагментации данных. Она поможет понять, какой способ дефрагментации будет наиболее эффективным и что выбрать.</p>
196
<p>Чтобы понять, какую именно операцию требуется провести - реорганизацию или перестроение, следует выяснить степень фрагментации данных. Она поможет понять, какой способ дефрагментации будет наиболее эффективным и что выбрать.</p>
197
<p>Чтобы выяснить уровень фрагментации следует воспользоваться системной табличной функцией sys.dm_db_index_physical_stats. Для определения уровня фрагментации всего перечня таблиц для выбранной базы, можете воспользоваться следующим запросом:</p>
197
<p>Чтобы выяснить уровень фрагментации следует воспользоваться системной табличной функцией sys.dm_db_index_physical_stats. Для определения уровня фрагментации всего перечня таблиц для выбранной базы, можете воспользоваться следующим запросом:</p>
198
<p>SELECT OBJECT_NAME(T1.object_id) AS NameTable,</p>
198
<p>SELECT OBJECT_NAME(T1.object_id) AS NameTable,</p>
199
<p> T1.index_id AS IndexId,</p>
199
<p> T1.index_id AS IndexId,</p>
200
<p> T2.name AS IndexName,</p>
200
<p> T2.name AS IndexName,</p>
201
<p> T1.avg_fragmentation_in_percent AS Fragmentation</p>
201
<p> T1.avg_fragmentation_in_percent AS Fragmentation</p>
202
<p> FROM sys.dm_db_index_physical_stats (DB_ID(), NULL, NULL, NULL, NULL) AS T1</p>
202
<p> FROM sys.dm_db_index_physical_stats (DB_ID(), NULL, NULL, NULL, NULL) AS T1</p>
203
<p> LEFT JOIN sys.indexes AS T2 ON T1.object_id = T2.object_id AND T1.index_id = T2.index_id</p>
203
<p> LEFT JOIN sys.indexes AS T2 ON T1.object_id = T2.object_id AND T1.index_id = T2.index_id</p>
204
<p>Согласно рекомендациям Microsoft, последующие действия будут зависеть от уровня фрагментации:</p>
204
<p>Согласно рекомендациям Microsoft, последующие действия будут зависеть от уровня фрагментации:</p>
205
<ul><li>меньше 5% - о дефрагментации следует пока забыть;</li>
205
<ul><li>меньше 5% - о дефрагментации следует пока забыть;</li>
206
<li>от 5 до 30% - требуется выполнить реорганизацию индекса. Это потребует минимального количества ресурсов системы и ее можно провести без долговременной блокировки;</li>
206
<li>от 5 до 30% - требуется выполнить реорганизацию индекса. Это потребует минимального количества ресурсов системы и ее можно провести без долговременной блокировки;</li>
207
<li>свыше 30% - следует выполнить перестроение индекса. При значительном уровне фрагментации это наиболее эффективно.</li>
207
<li>свыше 30% - следует выполнить перестроение индекса. При значительном уровне фрагментации это наиболее эффективно.</li>
208
</ul><h3>Реорганизация индекса</h3>
208
</ul><h3>Реорганизация индекса</h3>
209
<p>Реорганизацией называют процесс устранения фрагментации индекса. В его ходе происходит дефрагментация конечного уровня кластерных и некластерных индексов по таблицам и представлениям. Говоря простым языком - выполняется простое переупорядочивание страниц. В основе переупорядочивания лежит логический порядок конечных узлов (выполняете слева направо).</p>
209
<p>Реорганизацией называют процесс устранения фрагментации индекса. В его ходе происходит дефрагментация конечного уровня кластерных и некластерных индексов по таблицам и представлениям. Говоря простым языком - выполняется простое переупорядочивание страниц. В основе переупорядочивания лежит логический порядок конечных узлов (выполняете слева направо).</p>
210
<p>Если хотите провести реорганизацию - воспользуйтесь:</p>
210
<p>Если хотите провести реорганизацию - воспользуйтесь:</p>
211
<ul><li>MSSQL Management Studio. На выбранном индексе следует щелкнуть мышкой, из списка выбрать и нажать "Реорганизовать";</li>
211
<ul><li>MSSQL Management Studio. На выбранном индексе следует щелкнуть мышкой, из списка выбрать и нажать "Реорганизовать";</li>
212
<li>соответствующими инструкциями T-SQL.</li>
212
<li>соответствующими инструкциями T-SQL.</li>
213
</ul><h3>Перестроение индекса</h3>
213
</ul><h3>Перестроение индекса</h3>
214
<p>Перестроением называется операция по устранению фрагментации индекса. Он заключается в устранении старого и формировании нового.</p>
214
<p>Перестроением называется операция по устранению фрагментации индекса. Он заключается в устранении старого и формировании нового.</p>
215
<p>Перестроение индекс выполняется несколькими способами. В этом поможет:</p>
215
<p>Перестроение индекс выполняется несколькими способами. В этом поможет:</p>
216
<ul><li>Management Studio. Для этого необходимо выбрать нужный индекс, мышкой кликнуть по нему и выбрать "Перестроить";</li>
216
<ul><li>Management Studio. Для этого необходимо выбрать нужный индекс, мышкой кликнуть по нему и выбрать "Перестроить";</li>
217
<li>инструкция ALTER INDEX ix с предложением REBUILD, которая по сути является заменой инструкции DBCC DBREINDEX. Ею пользуются, когда возникла потребность в масштабной операции;</li>
217
<li>инструкция ALTER INDEX ix с предложением REBUILD, которая по сути является заменой инструкции DBCC DBREINDEX. Ею пользуются, когда возникла потребность в масштабной операции;</li>
218
<li>инструкция CREATE NONCLUSTERED INDEX (CREATE INDEX) с предложением DROP_EXISTING. Подходит, чтобы перестроить индекс и изменить его определения (удалить либо добавить ключевые столбцы).</li>
218
<li>инструкция CREATE NONCLUSTERED INDEX (CREATE INDEX) с предложением DROP_EXISTING. Подходит, чтобы перестроить индекс и изменить его определения (удалить либо добавить ключевые столбцы).</li>
219
</ul><p>Это вся полезная информация по индексам в Microsoft SQL Server. Изучайте их, а если возникнут вопросы - задавайте. Удачи в изучении и применении indexes ms sql.</p>
219
</ul><p>Это вся полезная информация по индексам в Microsoft SQL Server. Изучайте их, а если возникнут вопросы - задавайте. Удачи в изучении и применении indexes ms sql.</p>
220
<a></a><p>Также приглашаем на <a>специальный курс по MS SQL в Otus</a>.</p>
220
<a></a><p>Также приглашаем на <a>специальный курс по MS SQL в Otus</a>.</p>
221
221