Оптимизация таблицы NewOrg
Таблица NewOrd, созданная в задании Заполнение таблицы существующими иерархическими данными, содержит все сведения о сотрудниках и представляет иерархическую структуру с использованием типа данных hierarchyid. Эта задача добавляет новые индексы для поддержки поиска по столбцу hierarchyid.
Кластеризованный индекс
Столбец hierarchyid (OrgNode) является первичным ключом таблицы NewOrg. После создания таблицы в ней содержался кластеризованный индекс PK_NewOrg_OrgNode, обеспечивающий уникальность значений в столбце OrgNode. Кластеризованный индекс также поддерживает поиск по таблице по глубине.
Некластеризованный индекс
Во время этого шага создаются два некластеризованных индекса для поддержки работы обычных видов поиска.
Индексация таблицы NewOrg для обеспечения эффективного поиска
Чтобы обеспечить функционирование запросов, работающих на одном и том же уровне иерархии, следует использовать метод GetLevel для создания вычисляемого столбца, содержащего уровень иерархии. Затем следует создать составной индекс, основанный на уровне и Hierarchyid. Запустите следующий код для создания вычисляемого столбца и индекса преимущественно в ширину:
ALTER TABLE NewOrg ADD H_Level AS OrgNode.GetLevel() ; CREATE UNIQUE INDEX EmpBFInd ON NewOrg(H_Level, OrgNode) ; GO
Создайте уникальный индекс для столбца EmployeeID. Это стандартный единичный уточняющий запрос относительно одного сотрудника по номеру EmployeeID. Запустите следующий код, чтобы создать индекс для столбца EmployeeID:
CREATE UNIQUE INDEX EmpIDs_unq ON NewOrg(EmployeeID) ; GO
Запустите следующий код, чтобы получить данные из таблицы, упорядоченные относительно каждого из этих трех индексов:
SELECT OrgNode.ToString() AS LogicalNode, OrgNode, H_Level, EmployeeID, LoginID FROM NewOrg ORDER BY OrgNode; SELECT OrgNode.ToString() AS LogicalNode, OrgNode, H_Level, EmployeeID, LoginID FROM NewOrg ORDER BY H_Level, OrgNode; SELECT OrgNode.ToString() AS LogicalNode, OrgNode, H_Level, EmployeeID, LoginID FROM NewOrg ORDER BY EmployeeID; GO
Сравните результирующие наборы, чтобы понять порядок хранения для каждого типа индекса. Далее приводятся только первые четыре строки из каждого выходного набора.
Ниже приводится результирующий набор.
Индекс преимущественно в глубину: записи сотрудников хранятся рядом с записью их менеджера.
LogicalNode OrgNode H_Level EmployeeID LoginID
/ 0x 0 1 zarifin
/1/ 0x58 1 2 tplate
/1/1/ 0x5AC0 2 4 schai
/1/1/1/ 0x5AD6 3 9 jwang
/1/1/2/ 0x5ADA 3 10 malexander
/1/2/ 0x5B40 2 5 elang
/1/3/ 0x5BC0 2 6 gsmits
/2/ 0x68 1 3 hjensen
/2/1/ 0x6AC0 2 7 sdavis
/2/2/ 0x6B40 2 8 norint
Индекс с приоритетом значений в столбце EmployeeID: строки хранятся в соответствии с последовательностью значений EmployeeID.
LogicalNode OrgNode H_Level EmployeeID LoginID
/ 0x 0 1 zarifin
/1/ 0x58 1 2 tplate
/2/ 0x68 1 3 hjensen
/1/1/ 0x5AC0 2 4 schai
/1/2/ 0x5B40 2 5 elang
/1/3/ 0x5BC0 2 6 gsmits
/2/1/ 0x6AC0 2 7 sdavis
/2/2/ 0x6B40 2 8 norint
/1/1/1/ 0x5AD6 3 9 jwang
/1/1/2/ 0x5ADA 3 10 malexander
![]() |
---|
Диаграммы, на которых показывается разница между индексом преимущественно в глубину и индексом преимущественно в ширину, см. в разделе Использование типов данных hierarchyid (компонент Database Engine). |
Удаление ненужных столбцов
Столбец ManagerID представляет связь сотрудник-менеджер, которая на данный момент представлена столбцом OrgNode. Если другим приложениям столбец ManagerID не нужен, то, возможно, стоит его удалить с помощью следующей инструкции:
ALTER TABLE NewOrg DROP COLUMN ManagerID ; GO
Столбец EmployeeID также является избыточным. Столбец OrgNode уникально идентифицирует каждого сотрудника. Если другим приложениям столбец EmployeeID не нужен, то, возможно, стоит его удалить с помощью следующей инструкции:
DROP INDEX EmpIDs_unq ON NewOrg ; ALTER TABLE NewOrg DROP COLUMN EmployeeID ; GO
Замена исходной таблицы на новую
Если в исходной таблице содержались дополнительные индексы или ограничения, добавьте их в таблицу NewOrg.
Замените старую таблицу EmployeeDemo новой. Запустите следующий код, чтобы удалить старую таблицу и присвоить новой таблице имя старой:
DROP TABLE EmployeeDemo ; GO sp_rename 'NewOrg', EmployeeDemo ; GO
Запустите следующий код, чтобы изучить окончательную таблицу:
SELECT * FROM EmployeeDemo ;