При работе с SQL Server важно понимать концепцию индексов и их влияние на производительность вашей базы данных. В этой статье мы рассмотрим различные аспекты индексов SQL Server и их значимость.
Таблицы кучи против кластеризованных таблиц
Таблица кучи – это таблица, в которой строки данных не хранятся в определенном порядке на каждой странице данных. Она не имеет предопределенного кластеризованного индекса. С другой стороны, кластеризованная таблица имеет предопределенный кластеризованный индекс, который определяет порядок хранения строк на страницах данных и порядок страниц в таблице.
Вы можете определить, является ли таблица таблицей кучи, выполнив запрос к системному объекту sys.partitions. Если значение index_id равно 0, это указывает на то, что таблица является таблицей кучи. Кроме того, вы можете запросить системный объект sys.indexes, чтобы просмотреть подробности индекса таблицы кучи.
Карта распределения индексов (IAM)
SQL Server Engine использует карту распределения индексов (IAM) для отслеживания выделения доступных страниц. IAM служит логическим соединением между страницами данных и позволяет движку эффективно перемещаться по куче.
Проблема перенаправления указателей
При изменении данных в таблице кучи вставляются перенаправляющие указатели, указывающие на новое местоположение перемещенных данных. С течением времени эти перенаправляющие указатели могут вызывать проблемы производительности, так как движку необходимо посещать старое/исходное местоположение для получения конкретных значений. Чтобы преодолеть эту проблему, вы можете использовать команду ALTER TABLE REBUILD для перестроения таблицы кучи.
Индексы SQL Server
Индекс SQL Server – это важный фактор в настройке производительности. Индексы создаются для ускорения операций извлечения данных и обработки запросов, предоставляя быстрый доступ к строкам таблицы без сканирования всей таблицы.
Представьте себе индекс таблицы как индекс книги, который позволяет вам быстро находить информацию внутри книги, а не читать каждую страницу. Индексы SQL Server используют структуру B-дерева, состоящую из узлов индекса, для эффективной навигации по строкам таблицы на основе ключа индекса.
Глубина индекса, плотность и селективность
Глубина индекса относится к количеству уровней от корневого узла индекса до листовых узлов. Глубокий индекс может привести к снижению производительности. Плотность индекса измеряет уникальность данных в таблице, а селективность индекса измеряет количество просканированных строк по сравнению с общим количеством строк. Высокая селективность означает меньшее количество просканированных строк.
Рабочие нагрузки OLTP и OLAP
Базы данных OLTP (Online Transaction Processing) обрабатывают транзакционные системы, где запросы на изменение данных являются обычными. Базы данных OLAP (Online Analytical Processing) используются для систем хранения данных, где запросы на извлечение данных являются распространенными. При создании индексов важно учитывать тип рабочей нагрузки для оптимизации производительности.
Создание индексов на маленьких таблицах
Не рекомендуется создавать индексы на маленьких таблицах, так как это может негативно сказаться на операциях модификации данных. SQL Server Engine может сканировать базовую таблицу быстрее, чем обходить индекс при поиске конкретных данных.
Различные способы создания индекса
Существует несколько способов создания индекса в SQL Server:
- Использование оператора CREATE INDEX T-SQL
- Использование SQL Server Management Studio, щелкнув правой кнопкой мыши на узле Индексы таблицы
- Косвенно, определяя первичный ключ или уникальное ограничение в операторах CREATE TABLE или ALTER TABLE
Создание и перестроение индексов в режиме онлайн
Создание или перестроение индекса в режиме онлайн позволяет продолжать другие процессы извлечения или модификации данных на таблице во время создания или перестройки индекса. Однако онлайн-процесс занимает больше времени, чем офлайн-процесс.
PAD_INDEX против FILLFACTOR
FILLFACTOR устанавливает процент свободного пространства на листовом уровне каждой страницы индекса при создании индекса. PAD_INDEX применяет указанный процент свободного пространства к промежуточным страницам индекса.
Кластеризованные индексы
SQL Server позволяет использовать только один кластеризованный индекс на таблицу, так как данные могут быть отсортированы только по одному критерию порядка. При проектировании кластеризованного индекса рекомендуется выбирать короткие, статические, возрастающие, уникальные, часто используемые и используемые в выражении ORDER BY столбцы.
Избегание GUID и CHARACTER столбцов в качестве ключей кластеризованного индекса
Столбцы GUID и CHARACTER имеют ограничения в качестве ключей кластеризованного индекса. Столбцы GUID имеют больший размер и случайные значения, влияющие на производительность сортировки. Столбцы CHARACTER имеют ограниченную производительность сортировки, большой размер, неувеличивающиеся значения и нестатические значения, которые часто изменяют