Робота з індексованими уявленнями

Популярною методикою підвищення продуктивності бази даних є створення денормалізованной копії деякогопідмножини даних і збереження її в будь-якому місці для швидкого читання Наприклад, дані, збережені в пяти великих таблицях, можна витягти і зберегти в одній широкій таблиці Мені одного разу довелося виконувати екстремальну денормализация в проекті, замінюючи запит, що містив добрий десяток обєднань, однією таблицею, скорочуючи таким чином час пошуку від декількох хвилин до однієї секунди У цьому проекті все пройшло гладко, так як дані були доступні тільки для читання Коли ж запит виконується щодо робочих даних, денормализация може стати джерелом проблем цілісності даних

Компанія Microsoft запропонувала альтернативу денормалізації фактичних даних Індексовані подання SQL Server насправді є кластеризувати індексами, що зберігають денормалізованное безліч даних (рис 537)

Рис 537 Індексовані подання перекидають міст між двома таблицями, які насправді повинні містити десяток обєднань

Замість створення таблиць для денормалізації обєднань може бути створено уявлення, яка відбирає два первинних ключа з поєднуваних таблиць Кластерізованний індекс, створений на представленні, зберігає допустимі дані з пар первинного та зовнішнього ключів

У той час як звичайне уявлення зберігає інструкцію SQL SELECT і дані не матеріалізуються доти, поки подання не буде викликано, индексированное уявлення зберігає копію даних в кластеризувати індексі Групові індекси обєднують сторінки даних і листя індексу двійкового дерева для зберігання фактичних даних у фізичному порядку індексу Кластерізованний індекс використовує представлення як середу визначення збережених стовпців

У індексованих представлених існує безліч обмежень, зокрема, описані нижче

■ При створенні уявлень і коли які-небудь підключення намагаються модифікувати дані в базових таблицях, повинні бути включені порожні значення ANSI і увязнені в лапки ідентифікатори

■ Індекс повинен бути унікальним і кластеризувати Таким чином, подання має створити унікальний набір рядків без використання ключового слова DISTINCT Це може стати проблемою, оскільки серед ситуацій, в яких необхідна денормализация, багато містять відносини багато до багатьох, що мають тенденцію генерувати дублюються рядка в результуючому наборі даних З цієї причини більшість індексованих уявлень покривають тільки відносини один до багатьох.

Таблиці в поданні мають бути саме таблицями (а не вкладеними уявленнями) локальної бази даних, і посилання на них повинні виконуватися за допомогою двокомпонентного імені (владелец таблиця)

■ Подання має створюватися з параметром WITH SCHEMA BINDING

Оскільки індексовані подання вимагають звязування зі схемою, їх На замітку можна змішувати з перемиканням розділених таблиць і рухливими розділами Для перемикання до розділеної таблиці слід видалити индексированное уявлення, виконати перемикання, після чого знову відтворити индексированное уявлення

Наведемо приклад індексованого подання, використовуваного для денормалізації великих запитів Наступне подання відбирає дані з таблиць Contact і Product бази даних OBXKites:

USE OBXKites

SET ANSI_Nulls ON

SET ANSI_Padding ON

SET ANSI_Warnings ON

SET ArithAbort ON

SET Concat_Null_Yields_Null ON

SET Quoted_Identifier ON

SET Numeric_RoundAbort OFF

GO

CREATE VIEW vContactOrder WITH SCHEMABINDING AS

SELECT cContactID, oOrderlD FROM dboContact as з JOIN dbo [Order] as про

ON cContactID = oContactID

GO

CREATE UNIQUE CLUSTERED INDEX ivContactOrder ON vContactOrder (ContactID, OrderlD)

Індексовані подання та запити

Коли оптимізатор запитів SQL Server створює план виконання запиту, він включає кластерізованний індекс індексованого подання в якості одного з індексів, використовуваного запитом, навіть якщо запит явно не посилається на це подання

Це означає, що кластерізованний індекс індексованого подання може виступати в ролі покриває індексу, що прискорює запити Коли оптимізатор запитів відбирає кластерізованний індекс індексованого уявлення, план виконання запиту відбирає його для сканування (рис 538) Наступний запит відбирає ті ж дані, що і индексированное уявлення:

SELECT ContactContactID, OrderlD FROM dboContact JOIN dbo[Order]

ON ContactContactID = [Order]ContactID

Puc 538 План виконання запиту здійснює сканування кластеризованого індексу для безпосереднього вилучення даних замість доступу до таблиць бази

У той час як індексовані подання до сутності залишилися такими ж, як в SQL Server 2000, оптимізатор запитів тепер може використовувати індексовані подання в більшому числі типів запитів

Звичайне створення індексованих уявлень без повного аналізу їх використання запитами швидше нашкодить продуктивності, ніж поліпшить її Оновлені індексовані подання приховують в собі серйозну загрозу продуктивності, так що уникайте їх в транзакційних базах даних Обдумано додавайте їх у бази даних, що використовуються переважно для звітів, аналітичної обробки даних і запитів, ідентифікуючи специфічні обєднання, що перешкоджають часто виконуваних запитам, і ювелірно точно вставляючи Групові індекси індексованих уявлень

Оновлення індексованих уявлень

Як і в будь денормалізованной копії даних, основна складність полягає в підтримці даних в постійно оновленому стані Те ж відноситься і до індексованих уявленням Коли дані базових таблиць оновлюються, индексированное подання має перебувати з ними в синхронізації Цей процес цілком прозорий для користувача і більше відноситься до області продуктивності, ніж програмування

Резюме

Не кожна база даних повинна масштабироваться до величезних розмірів, проте для проектів, обсяг яких прагне до терабайтам, SQL Server 2005 пропонує ряд ефективних технологій, що дозволяють впоратися з подібним зростанням Проте навіть ці розширені технології не можуть замінити теорію оптимізації

Розробка високопродуктивних постачальників доступу до даних

Сьогодні майже вся інформація зберігається в базах даних і в основному накопичується щодня Ці масиви інформації не мають практично ніякого значення, якщо їх неможливо переглянути з певної точки зору Саме в цьому аспекті інформація набуває реальну цінність Якщо ви надаєте користувачеві деякий образ даних, то можете додати йому смислове значення і навіть передбачити майбутні моделі, напрями і тенденції Коли інформація представляється в деякому смисловому аспекті, користувачі і додатки мають можливість приймати рішення, що впливають на реальні події

Як приклад розглянемо звіти про кредити Якщо в реальному житті покупки здійснюються з використанням дебетових або кредитних карток, то вся ця інформація накопичується в базі даних Кожна покупка сама по собі не несе в собі багато інформації, проте коли складається кредитний звіт за тривалий період часу, це дозволяє скласти певне уявлення про покупця При грамотному підході це може принести тільки користь

У цьому розділі ми розглянемо деякі концепції доступу до даних Зокрема, розглянемо моделі, що використовують обєкти доступу до даних VBNET (DAO), фабрики і постачальників У середовищі розробки Microsoft модель DAO являє собою безліч класів, що реалізують проміжний шар між базою даних і клієнтським додатком Ця технологія не покладається цілком на методи самої бази даних

Коли можливо, намагайтеся використовувати програмні шаблони Під шаблоном мається на увазі технологія, зазвичай застосовується для вирішення певної задачі Таке рішення зазвичай включає в себе класи та програмний код, необхідний для їх взаємодії

У прикладах програмного коду цієї глави обробка виключень проілюстрована з використанням загального класу Exception, що міститься в блоці Catch На практиці ці винятки будуть привязані до типів помилок, які ви хочете обробити

Джерело: Нільсен, Пол Microsoft SQL Server 2005 Біблія користувача : Пер з англ – М: ООО ІД Вільямс , 2008 – 1232 с : Ил – Парал тит англ

Схожі статті:


Сподобалася стаття? Ви можете залишити відгук або підписатися на RSS , щоб автоматично отримувати інформацію про нові статтях.

Коментарів поки що немає.

Ваш отзыв

Поділ на параграфи відбувається автоматично, адреса електронної пошти ніколи не буде опублікований, допустимий HTML: <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <s> <strike> <strong>

*

*