Робота з індексованими уявленнями
Популярною методикою підвищення продуктивності бази даних є створення денормалізованої копії деякого підмножини даних та збереження її у будь-якому місці для швидкого читання. Наприклад, дані, що зберігаються у п'яти великих таблицях, можна витягти і зберегти в одній широкій таблиці. Мені одного разу довелося виконувати екстремальну денормалізацію у проекті, замінюючи запит, що містив добрий десяток об'єднань, однією таблицею, скорочуючи таким чином час пошуку від кількох хвилин до однієї секунди. У цьому проекті все пройшло гладко, оскільки дані були доступні лише для читання. Коли ж запит виконується щодо робочих даних, денормалізація може бути джерелом проблем цілісності даних.
Компанія Microsoft запропонувала альтернативу денормалізацію фактичних даних. Індексовані уявлення SQL Server насправді є кластеризованими індексами, що зберігають денормалізовану множину даних (рис. 53.7).

Мал. 53.7. Індексовані уявлення перекидають міст між двома таблицями, які насправді мають утримувати десяток об'єднань
Замість створення таблиць для деноралізації об'єднань може бути створено уявлення, що відбирає два первинні ключі з таблиць, що об'єднуються. Кластеризований індекс, створений на поданні, зберігає допустимі дані з пар первинного та зовнішнього ключів.
У той час як звичайне уявлення зберігає інструкцію SQL SELECT і дані не матеріалізуються доти, доки уявлення не буде викликано, індексоване уявлення зберігає копію даних у кластеризованому індексі. Кластеризовані індекси поєднують сторінки даних та листи індексу двійкового дерева для зберігання фактичних даних у фізичному порядку індексу. Кластеризований індекс використовуєподання як середовище визначення стовпців, що зберігаються.
В індексованих уявленнях існує безліч обмежень, зокрема описані нижче.
? При створенні уявлень і коли будь-які підключення намагаються модифікувати дані в базових таблицях, повинні бути включені порожні значення ANSI та ідентифікатори, що укладені в лапки.
? Індекс має бути унікальним та кластеризованим. Таким чином, подання має створити унікальний набір рядків без використання ключового слова DISTINCT. Це може стати проблемою, оскільки серед ситуацій, в яких необхідна денормалізація, багато хто містить відносини “багато до багатьох”, що мають тенденцію генерувати рядки, що дублюються, в результуючому наборі даних. З цієї причини більшість індексованих уявлень покривають лише відносини "один до багатьох".
? Таблиці у поданні повинні бути саме таблицями (а не вкладеними уявленнями) локальної бази даних, і посилання на них повинні виконуватись за допомогою двокомпонентного імені (власник. таблиця).
? Подання має створюватись із параметром WITH SCHEMA BINDING.
Оскільки індексовані уявлення вимагають зв'язування зі схемою, їх на замітку не можна змішувати з перемиканням розділених таблиць і рухомими розділами. Для перемикання до розділеної таблиці слід видалити індексовану виставу, виконати перемикання, після чого знову відтворити індексовану виставу.
Наведемо приклад індексованого уявлення, використовуваного денормалізації великих запитів. Наступне уявлення відбирає дані з таблиць Contact та Product бази даних OBXKites:
SET ANSI_Nulls ON;
SET ANSI_Padding ON;
SET ANSI_Warnings ON;
SET ArithAbort ON;
SETConcat_Null_Yields_Null ON;
SET Quoted_Identifier ON;
SET Numeric_RoundAbort OFF;
CREATE VIEW vContactOrder WITH SCHEMABINDING AS
SELECT c.ContactID, o.OrderlD FROM dbo.Contact as з JOIN dbo.[Order] as про
ON c.ContactID = o.ContactID;
CREATE UNIQUE CLUSTERED INDEX ivContactOrder ON vContactOrder (ContactID, OrderlD);
Індексовані уявлення та запити
Коли оптимізатор запитів SQL Server створює план виконання запиту, він включає кластеризований індекс індексованого подання як один із індексів, що використовується запитом, навіть якщо запит явно не посилається на це подання.
Це означає, що кластеризований індекс індексованого подання може виступати в ролі індексу, що покриває, прискорює запити. Коли оптимізатор запитів відбирає кластеризований індекс індексованого подання, план виконання запиту відбирає його для сканування (рис. 53.8). Наступний запит відбирає ті ж дані, що й індексоване подання:
SELECT Contact.ContactID, OrderlD FROM dbo.Contact JOIN dbo.[Order]
ON Contact.ContactID = [Order].ContactID

Puc. 53.8. План виконання запиту здійснює сканування кластеризованого індексу для безпосереднього отримання даних замість доступу до таблиць бази
У той час як індексовані уявлення по суті залишилися такими ж, як у SQL Server 2000, оптимізатор запитів тепер може використовувати індексовані уявлення в більшій кількості типів запитів.
Звичайне створення індексованих уявлень без повного аналізу їх використання запитами швидше зашкодить продуктивності, ніж покращить її. Оновлені індексовані уявлення приховують у собі серйознузагрозу продуктивності, тому уникайте їх у транзакційних базах даних. Обдумано додавайте їх у бази даних, які використовуються переважно для звітів, аналітичної обробки даних та запитів, ідентифікуючи специфічні об'єднання, що перешкоджають запитам, що часто виконуються, і ювелірно точно вставляючи кластеризовані індекси індексованих уявлень.
Оновлення індексованих уявлень
Як і в будь-якій денормалізованій копії даних, основна складність полягає у підтримці даних у постійно оновленому стані. Те саме стосується і індексованих уявлень. Коли дані базових таблиць оновлюються, індексоване уявлення має перебувати з ними у синхронізації. Цей процес повністю прозорий для користувача і більше відноситься до продуктивності, ніж програмування.
Не кожна база даних має масштабуватися до величезних розмірів, проте для проектів, обсяг яких прагне терабайтів, SQL Server 2005 пропонує ряд ефективних технологій, що дозволяють впоратися з таким зростанням. Проте, навіть ці розширені технології не можуть замінити теорію оптимізації.
Розробка високопродуктивних постачальників доступу до даних
Як приклад розглянемо звіти про кредити. Якщо реальному житті покупки здійснюються з допомогою дебетових чи кредитних карток, то вся ця інформація накопичується у базі даних. Кожна покупка сама по собі не несе в собі багато інформації, проте коли складається кредитний звіт за тривалий період часу, це дозволяє скласти певне уявлення про покупця. За грамотного підходу це може принести тільки користь.
У цьому розділі ми розглянемо деякі концепції доступу до даних. Зокрема, розглянемо моделі,що використовують об'єкти доступу до даних VB.NET (DAO), фабрики та постачальників. У середовищі розробки Microsoft модель DAO є безліччю класів, що реалізують проміжний шар між базою даних і клієнтським додатком. Ця технологія не покладається цілком на методи самої бази даних.
Якщо це можливо, намагайтеся використовувати програмні шаблони. Під шаблоном мається на увазі технологія, яка зазвичай застосовується для вирішення певної задачі. Таке рішення зазвичай включає класи і програмний код, необхідний для їх взаємодії.
У прикладах програмного коду цього розділу обробка винятків проілюстрована з використанням загального класу Exception, що міститься в блоці Catch. На практиці ці винятки будуть прив'язані до типів помилок, які ви хочете опрацювати.
Джерело: Нільсен, Пол. Microsoft SQL Server 2005. Біблія користувача. : Пров. з англ. - М.: ТОВ “І.Д. Вільямс”, 2008. - 1232 с. : іл. - Парал. тит. англ.