ПЕРЕЛІК ДИСЦИПЛІН:
  • Адміністративне право
  • Арбітражний процес
  • Архітектура
  • Астрологія
  • Астрономія
  • Банківська справа
  • Безпека життєдіяльності
  • Біографії
  • Біологія
  • Біологія і хімія
  • Ботаніка та сільське гос-во
  • Бухгалтерський облік і аудит
  • Валютні відносини
  • Ветеринарія
  • Військова кафедра
  • Географія
  • Геодезія
  • Геологія
  • Етика
  • Держава і право
  • Цивільне право і процес
  • Діловодство
  • Гроші та кредит
  • Природничі науки
  • Журналістика
  • Екологія
  • Видавнича справа та поліграфія
  • Інвестиції
  • Іноземна мова
  • Інформатика
  • Інформатика, програмування
  • Юрист по наследству
  • Історичні особистості
  • Історія
  • Історія техніки
  • Кибернетика
  • Комунікації і зв'язок
  • Комп'ютерні науки
  • Косметологія
  • Короткий зміст творів
  • Криміналістика
  • Кримінологія
  • Криптология
  • Кулінарія
  • Культура і мистецтво
  • Культурологія
  • Російська література
  • Література і російська мова
  • Логіка
  • Логістика
  • Маркетинг
  • Математика
  • Медицина, здоров'я
  • Медичні науки
  • Міжнародне публічне право
  • Міжнародне приватне право
  • Міжнародні відносини
  • Менеджмент
  • Металургія
  • Москвоведение
  • Мовознавство
  • Музика
  • Муніципальне право
  • Податки, оподаткування
  •  
    Бесплатные рефераты
     

     

     

     

     

     

         
     
    Нові можливості MS SQL Server 2004 "Yukon "
         

     

    Інформатика, програмування

    Нові можливості MS SQL Server 2004 "Yukon"

    Іван Бодягін

    Вступ

    Описати більш-менш докладно всі можливості нової версії Microsoft SQL Server завдання не тривіальна, тому в даній статті запропонований лише невеликий огляд деяких нововведень. А саме подання метаданих, схем, трохи про безпеку, нові можливості при роботі з індексами та нові вбудовані типи даних. Я не ставив перед собою цілі розкопати все в подробицях, оскільки на даний момент доступна лише перший попередня версія сервера і багато чого може змінитися, але основна функціональність, очевидно, залишиться, тому її і має сенс розглянути.

    Метадані та безпека

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

    У попередніх версіях сервера для обслуговування і тонкої настройки, як правило, використовувалися спеціальні системні збережені процедури. Тепер же вся ця функціональність вносяться до T-SQL, за допомогою створення нових DDL операторів або невеликої зміни старих. Від системних ж процедур в майбутніх версіях, судячи з усього, відмовляться. Опції діагностики, збору статистики та перегляду іншої адміністративної інформації, також переходять від системних процедур і DBCC команд до спеціальних системних функцій.

    Безпека

    Як вже говорилося, на даний момент щось конкретне в цій частині сервера розкопати важкувато, оскільки документація практично відсутня. Але, тим не менше, вже зрозуміло, що очікуються серйозні зміни.

    Row level security

    Свого часу Microsoft була заявлена підтримка безпеки на рівні окремих рядків у таблиці, але як це буде виглядати, поки що незрозуміло. У BOL з цього приводу - лише натяки, і немає жодного рядка прикладу або хоча б приблизного опису, а всі спроби зробити щось навмання до успіху не привели.

    Робота з логінами і користувачами

    Збережені процедури для створення користувача і логіна оголошені застарілими й призначені виключно для забезпечення сумісності, на зміну їм прийшли нові DDL оператори - CREATE USER, CREATE LOGIN, ALTER USER і ALTER LOGIN, які надають більше можливостей.

    У Yukon можна застосувати політику логінів операційної системи до логінів SQL-сервера. При цьому для контролю узгодженості політик безпеки ОС і SQL-сервера використовується спеціальне API, що з'явилося в Windows 2003 Server. При створенні або зміні логіна може бути виставлено два прапори, CHECK_EXPIRATION і CHECK_POLICY, які й визначають втручання ОС в політику логінів сервера.

    Значення прапора CHECK_EXPIRATION (за замовчуванням ON) визначає, чи буде відбуватися перевірка старіння пароля. Встановлення цього прапора в "OFF" означає, що перевірка не проводиться, і пароль не старіє.

    Значення прапора CHECK_POLICY (за замовчуванням ON) визначає, чи буде проводитися перевірка стійкості пароля з використанням локальної політики ОС. Установка цього прапора в "OFF" означає, що локальна політика ОС не використовується, і діє внутрішня політика СУБД.

    Є також параметр HASHED, що означає, що пароль, вказаний при створенні або зміні логіна, вже зашифрований, і параметр MUST_CHANGE, що означає, що при першому зверненні користувача з цим логіном буде затребуваний новий пароль.

    Якщо прапор CHECK_POLICY встановлений в «OFF», то й CHECK_EXPIRATION так само повинен бути встановлений в «OFF». Якщо вказано параметр MUST_CHANGE, то прапор CHECK_EXPIRATION повинен бути встановлений в «ON», а, отже, і CHECK_POLICY також повинен бути «ON».

    Природно, всі ці настройки можна застосовувати лише до локальним користувачам SQL-сервера.

    Наприклад, якщо спробувати створити логін Vasya з простим і нехитрим паролем:        

    CREATE   LOGIN Vasya WITH PASSWORD = 'password'     

    то нічого не вийде, оскільки за замовчуванням прапор CHECK_POLICY встановлений в «ON», ОС перевіряє пароль на стійкість і можна спостерігати помилку 15118, приблизно такого змісту:        

    Password   validation failed. The password does not meet policy requirements because it   is not complex enough.     

    Однак якщо перевірку політики безпеки ОС відключити, то створення логіна Vasya з простим і нехитрим паролем пройде цілком успішно:        

    CREATE   LOGIN Vasya WITH PASSWORD = 'password', CHECK_POLICY = OFF     

    Схеми

    За стандартом ANSI SQL під поняттям схема (schema) розуміється набір об'єктів БД, що належить одному власнику (principal) і утворює одне простір імен (namespace). Іншими словами схема - це набір об'єктів БД, які не можуть мати однакові імена.

    У попередніх версіях SQL-сервера схема була безпосередньо пов'язана з власником об'єкта. Фактично між цими двома поняттями для користувача не було різниці. Кожен користувач був власником схеми, і ім'я цієї схеми збігалося з користувачем. Спеціальна команда створення схеми - CREATE SCHEMA, строго кажучи, схему не створювала, а дозволяла створити об'єкт і роздати на нього права одним оператором, полегшуючи тим самим життя адміністраторам.

    Подібне спрощення приводить до деяких проблем. Повне ім'я об'єкта в MS SQL Server формально складається з чотирьох частин: <ім'я сервера>. <ім'я бази>. <ім'я схеми>. <ім'я об'єкта>, але оскільки в попередніх версіях відмінностей між ім'ям користувача і ім'ям схеми не робилося, то фактично ім'я користувача використовувалося замість імені схеми. Припустимо, є якийсь набір об'єктів, що належить користувачеві Vasya, повне ім'я кожного об'єкта буде приблизно таким:        

    avalon.employee.vasya.account     

    Таким чином, якщо в якийсь трагічний момент користувача Vasya звільнять, то для його видалення з бази треба або видалити всі об'єкти, що належать йому, або передати їх у володіння іншому користувачеві. Якщо передати ці об'єкти у володіння комусь іншому, наприклад користувачу Masha, то зміниться і повне ім'я об'єкта:        

    avalon.employee.masha.account     

    Це вимагає внесення змін до клієнтське програми та подальшого тестування - приємного в цьому мало.

    У новій версії Microsoft SQL Server ці два поняття (схема та її власник) відокремлені один від одного, і поміняти власника схеми можна без зміни повного імені об'єкта. Очевидно, що приклад з Васею і Машею кілька надуманий, але, тим не менше, подібний розподіл дозволить більш вільно і логічно групувати об'єкти в БД по просторах імен, серйозно підвищуючи зручність розробки.

    Більше того, з цією ж метою введено нове поняття синоніма. Синонім створюється за допомогою нового оператора CREATE SYNONYM і є альтернативним ім'я об'єкта БД. Об'єкт, на який посилається синонім, називається «базовим об'єктом» (base object), і з цим базовим об'єктом синонім пов'язаний тільки по імені. Таким чином, клієнтський додаток, що використовує синоніми, захищене від зміни імен об'єктів. Крім того, синонім, що складається з одного слова, зручніше використовувати, ніж повне ім'я об'єкта, що складається з двох, трьох або чотирьох частин. Наприклад, створення синонім для Employee в базі AdventureWorks для використання з Northwind виглядає приблизно так:        

    USE   Northwind   

    GO      

    CREATE   SYNONYM MyEmployee FOR AdventureWorks.dbo.Employee     

    Сам синонім належить схемою, таким чином, не можна створити два однакових синоніма в одній схемі.

    Синоніми можуть бути створені для наступних об'єктів: збережених процедур, скалярних і табличних функцій, CLR-процедур і функцій (також скалярних і табличних), розширених збережених процедур, процедур реплікації, таблиць, включаючи тимчасові, локальні і глобальні, а так само уявлень.

    Введено також поняття «схеми за умовчанням» (default schema). Ця схема вказується при створенні користувача або логіна, і якщо користувач шукає об'єкт без зазначення певної схеми, то в першу чергу об'єкт шукається у схемі за замовчуванням. Якщо ж при створенні користувача схема по умовчанням не була вказана, то використовується схема DBO. При створенні користувача можна також вказати неіснуючу схему і створити її пізніше.

    Метадані

    Спосіб доступу до метаданих змінився кардинально. Тепер до них можна добратися через спеціальні подання каталозі (Catalog Views), які, по суті, є реляційних інтерфейсом метаданих. Ці уявлення дозволяють переглядати метадані, які містяться в кожній базі сервера, і практично цілком замінили собою системні таблиці та системні уявлення, які використовувалися для роботи з метаданими в попередніх версіях.

    Кожна БД має спеціальну схему sys, де і розташовані нові системні уявлення. Самі метадані безпосередньо недоступні нікому. Усі системні таблиці, що використовувалися раніше, тепер є уявленнями і залишені тільки для зворотної сумісності. Використовувати їх не рекомендується, як з міркувань продуктивності, так і в силу того, що підтримка цих уявлень в майбутньому не гарантується. Природно, і інформацію про нову функціональності ці уявлення не відображають.

    Наприклад, всі об'єкти раніше були доступні через системну таблицю sysobjects, а тепер ця інформація переїхала до подання sys.objects. Sysobject тепер - теж уявлення, яке робить вибірку з sys.objects. Але оскільки частина інформації у форматі sysobjects відобразити неможливо, то навіть вибірка всіх даних з sys.object і sysobjects поверне різне кількість записів.

    Системні процедури також переписані з використанням нових системних уявлень.

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

    Наприклад, якщо створити простеньку процедуру в тестовій базі:        

    CREATE   PROCEDURE tst_sel AS   

    SELECT   * FROM employee   

    GO     

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

    SELECT   * FROM sys.procedures WHERE name = 'tst_sel'     

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

    GRANT   EXECUTE ON tst_sel TO vasya     

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

    SELECT   definition FROM sys.sql_modules WHERE name = 'tst_sel'     

    не поверне жодного запису. У той же час, якщо його виконати з підключення, в якому процедура створювалася, то її код цілком можна переглянути.

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

    Щоб уникнути цих проблем, а також для більшої гнучкості при налаштуванні прав перегляду метаданих, в Yukon додано нове право - VIEW DEFINITION. Це право перекриває правила, що описані вище. Якщо надати користувачеві Vasya право VIEW DEFINITION на об'єкт, то йому будуть доступні для перегляду всі метадані цього об'єкту, не зважаючи на інші права, якщо ж це право явно заборонити, то ніякі метадані подивитися вже буде не можна, знов-таки не дивлячись на інші права.

    Права VIEW DEFINITION можуть бути застосовані до об'єктів, розташованим на різних рівнях ієрархії сервера.        

    - На рівні бази даних   

    GRANT VIEW DEFINITION TO [WITH GRANT OPTION];      

    - На рівні схеми   

    GRANT VIEW DEFINITION ON SCHEMA:: TO      

    [WITH GRANT OPTION];      

    - На рівні певного   об'єкта схеми   

    GRANT VIEW DEFINITION ON TO   

    [WITH GRANT   OPTION];      

    - тут   

    :: = | | PUBLIC   

    :: = | |    |   

    | ...     

    Таким чином, якщо зараз дозволити користувачеві Vasya VIEW DEFINITION на рівні бази:        

    GRANT   VIEW DEFINITION TO Vasya     

    то йому буде доступний для перегляду текст тестової процедури, як і всіх інших метаданих, що мають відношення до тестової базі. Якщо ж явно заборонити йому роботу з метаданими в базі:        

    DENY   VIEW DEFINITION TO Vasya     

    то мало того, що під цим логіном не можна буде переглянути ні запис про наявність процедури, ні, тим більше, її текст - взагалі ніякі метадані не будуть доступні. Наприклад, спроба подивитися, що за об'єкти в принципі є в базі, дасть дуже цікавий результат.        

    SELECT * FROM sysobjects   

    - або   

    SELECT * FROM sys.objects     

    Жоден з цих запитів не поверне жодного запису.

    Повернути первісний стан речей можна, видаливши це правило.        

    REVOKE   VIEW DEFINITION TO Vasya     

    Самі по собі метадані можуть бути організовані в деяку ієрархію. Наприклад, подання tables успадкована від objects, це означає, що крім стовпців, що містять інформацію, що відноситься виключно до таблиць, tables містить також всі стовпці, що входять до objects.

    Індекси

    Індекси - це внутрішній механізм сервера, що дозволяє кардинально підвищити швидкість виконання запитів, і без них продуктивність реляційних БД була б гнітюче низька. У новій версії Mcrosoft SQL Server розробники не обійшли увагою настільки відповідальну ділянку, і в механіку індексування були внесені, деякі вдосконалення. Природно, змінився трохи і синтаксис команди створення індексу, тепер він виглядає так:        

    CREATE   [UNIQUE] [CLUSTERED | NONCLUSTERED] INDEX index_name   

    ON [(database_name. [Schema_name]. |   schema_name. )]   

    (table_or_view_name) (column [ASC | DESC   ] [, ... N])   

    [INCLUDE (column_name [, ... n])]   

    [WITH ( [   , ... n])]   

    [ON (partition_scheme_name (column_name   [,... n]) | filegroup_name   

    | default   )]     

    А додаткові налаштування такі:        

    :: =   

    (PAD_INDEX = (ON | OFF)   

    | FILLFACTOR = fillfactor   

    | SORT_IN_TEMPDB = (ON | OFF)   

    | IGNORE_DUP_KEY = (ON | OFF)   

    | STATISTICS_NORECOMPUTE = (ON | OFF)   

    | DROP_EXISTING = (ON | OFF)   

    | ONLINE = (ON | OFF)   

    | ALLOW_ROW_LOCKS = (ON | OFF)   

    | ALLOW_PAGE_LOCKS = (ON | OFF)   

    | MAXDOP =   number_of_processors)     

    Перш за все варто звернути увагу на те, що змінився синтаксис вказівки додаткових налаштувань. Тепер рекомендується параметри ON або OFF вказувати в обов'язковому порядку, а старий синтаксис, без ON/OFF, підтримується лише з міркувань забезпечення сумісності. У майбутніх версіях від його підтримки обіцяють відмовитися. При цьому нові команди підтримують тільки синтаксис з ON/OFF. Так само неприпустимо змішувати два різних синтаксису в одному операторі, наприклад спроба створення індексу з опціями WITH (DROP_EXISTING, ONLINE = ON) - викличе помилку.

    Ряд налаштувань індексу, які раніше ставилися з допомогою спеціальної збереженої процедури, тепер можна вказати безпосередньо, при створенні або зміні індексу. ALLOW_ROW_LOCKS дозволяє або забороняє блокування індексу на рівні рядків, а ALLOW_PAGE_LOCKS - на рівні сторінок даних.

    MAXDOP

    MAXDOP (max degree of parallelism) - максимальне кількість процесорів, які використовуються при побудові плану виконання запиту. У попередніх версіях задати цей параметр безпосередньо під час роботи з індексами було не можна - використовувалися налаштування для всієї системи, що задаються через системну збережену процедуру sp_configure. Тепер же цей параметр можна вказати окремо для кожного індексу. Тут мається на увазі кількість процесорів, яке буде використовуватися безпосередньо при створенні або зміні індексу, а не при подальшій роботі з ним. Що називається, «дрібничка, а приємно»;)

    Index include

    У команді створення індексу потрібна опція "INCLUDE". Він дозволяє задіяти нову, досить корисну функціональність, але для того, щоб показати, що це таке, краще почати трохи здалеку.

    У Microsoft SQL Server індекс являє собою B + tree, вузли якого складаються з ключових полів, а в листках (вузлах самого останнього рівня) містяться посилання на записи таблиці.

    Індекс може бути двох типів, кластерний (clustered) і НЕ кластерний.

    Кластерний індекс відрізняється від некластерного тим, що в листках цього індексу містяться не посилання на записи в таблиці, а самі запису.Таким чином, за наявності кластерного індексу записи в таблиці шикуються в порядку ключів такого індексу (строго кажучи це не зовсім так, але в першому наближенні вірно). За очевидних причин кластерний індекс може бути тільки одна на таблицю. Ідентифікація конкретної запису в таблиці також знаходиться в прямій залежності від наявності кластерного індексу. Якщо кластерного індексу немає, то запис знаходиться за унікальним ідентифікатором запису - RID, який однозначно визначає її становище у файлі даних. Якщо ж кластерний індекс у таблиці присутня, то фізичне місце цього запису не постійно, а, отже, використовувати RID не дуже практично, оскільки його довелося б оновлювати у всіх індексах при кожній зміні. Тому запис ідентифікується по ключу кластерного індексу.

    Припустимо, необхідно вибрати поле однієї із записів у таблиці з якого-небудь умові. У цьому випадку, в залежності від наявності індексів, сервер може надійти кількома способами.

    Поле, яке треба вибрати, збігається з полем, по якому потрібно здійснити пошук, і по цьому полю побудований індекс.        

    SELECT   LastName FROM employees WHERE LastName = 'Callahan'     

    План такого запиту простий і невигадливий:        

    | - Index   Seek (OBJECT: ([Employees]. [LastName]),   

      SEEK: ([Employees]. [LastName] = Convert ([@ 1])) ORDERED FORWARD)     

    Потрібне значення просто знаходиться за індексом.

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

    SELECT   LastName FROM Employees WHERE EmployeeID = 8     

    План такого запиту також не відрізняється зайвою складністю:        

    | - Clustered   Index Seek (OBJECT: ([Employees]. [PK_Employees]),   

      SEEK: ([Employees]. [EmployeeID] = Convert ([@ 1])) ORDERED FORWARD)     

    Все закономірно - йде пошук по кластерного індексу, а потім вилучається потрібне поле з цього індексу.

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

    SELECT   LastName FROM Employees WHERE PostalCode = '98105 '     

    Ось тут вже серверу доводиться здійснювати додаткові рухи тіла, і план запиту трохи ускладнюється:        

    | - Bookmark   Lookup (BOOKMARK: ([Bmk1000]), OBJECT: ([Employees ]))   

    | - Index   Seek (OBJECT: ([Employees]. [PostalCode]),   

      SEEK: ([Employees]. [PostalCode] = Convert ([@ 1])) ORDERED FORWARD)     

    Спочатку за індексом знаходиться потрібна запис, а точніше, не запис, а посилання на запис. При цьому значення поля, яке насправді треба дістати з таблиці, як і раніше немає, так як поле пошуку не є за потрібне полем, як це було в першому випадку. На даний момент на сервер, як уже говорилося, є тільки посилання, і щоб отримати потрібне поле, треба виконати ще одну операцію - bookmark lookup. Вартість цієї операції в деяких випадках може бути дуже високою, наприклад, в цьому запиті вона складає половину всієї його вартості (49%). У випадку з кластерним індексом такого не відбувається, тому що в листі кластерного індексу міститься вся запис, а значить, нічого шукати вже не треба.        

    ПРИМІТКА   

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

    У силу того, що вартість додаткової операції з вилученню полів, що не входять до індексу, може бути досить висока, то іноді припадає від неї позбавлятися. У попередніх версіях Microsoft SQL Server був, фактично, тільки один спосіб позбутися від дорогого bookmark lookup. Для цього будувався складовою (композитний) індекс, першим полем або полями якого були поля, які входять в умову пошуку, а потім йшли поля, які необхідно було витягти. Оскільки в цьому випадку всі потрібні значення вже містяться в ключі індексу, то потреба в додаткових операціях відпадає. Але при подібному підході виростає розмір ключів індексу, через це збільшується розмір бази і знижується ефективність індексних операцій. До того ж, максимальний розмір ключа індексу не може перевищувати 900 байт, і вилізти за ці кордону досить просто.

    Для вирішення цієї проблеми в Yukon була додана нова функціональність. Тепер індекси можуть містити додані поля (include). Суть цього нововведення полягає в тому, що в індекс можуть бути додані НЕ ключові поля, при цьому пошук по них не здійснюється, але якщо вони знадобляться у запиті, то додаткових зусиль по їх вилученню робити не доводиться.

    Синтаксис досить простий, при створенні або зміні індексу додається додатковий параметр:        

    INCLUDE (field [, field ...])     

    Тут field - список неключових полів таблиці, які повинні бути додані в індекс.

    При цьому сам індекс складається тільки з значень ключових полів, але в Лістьєва вузли, і тільки в Лістьєва, додається копія полів, зазначених у INCLUDE. Таким чином, пошук залишається таким же ефективним, і відсутні всі обмеження на розмір полів, вказаних в якості включаються, аж до того, що там можуть знаходитися навіть LOB. При цьому індекс займає менше місця в порівнянні зі звичайним, складовим, що застосовувалися раніше в подібних випадках. І хоча, на перший погляд, економія місця за рахунок нелістьевих вузлів здається незначною - це досить серйозний плюс, у силу того, що одне з властивостей дерев полягає в прямій залежності від ефективності пошуку розміру ключа. Чим менше розмір ключа, тим ефективніше пошук.

    Якщо створити ще один індекс в таблиці з попереднього прикладу (по полю PostalCode), але додати туди як включається поля LastName, а потім знову зробити вибірку LastName за певним значенням PostalCode:        

    CREATE   INDEX IXPostalCode_inc ON Employees (PostalCode) INCLUDE (LastName)   

    GO      

    SELECT   LastName FROM Employees WHERE PostalCode = '98105 '     

    то план запиту знову стане простим і простим, а вартість - такою ж низькою, як і при використанні складеного індексу.        

    | - Index   Seek (OBJECT: ([Employees]. [IXPostalCode_inc]),   

    SEEK: ([Employees]. [PostalCode] = @ 1)   ORDERED FORWARD)     

    При цьому для пошуку використовується тільки що створений індекс IXPostalCode_inc. Якщо зараз спробувати витягти інше поле тієї ж запису за тим же критерієм PostalCode, то буде використовуватися звичайний індекс, і знову буде потрібно bookmark lookup.

    Подивившись індекси, побудовані по полях таблиці Employees за допомогою добре відомої збереженої процедури sp_helpindex, можна помітити, що звичайний індекс (по PostalCode), і тільки що побудований індекс (з включаються полями) нічим один від одного не відрізняються.        

    index_name         

    index_description         

    index_keys             

    IXPostalCode_inc         

    nonclustered located on   PRIMARY         

    PostalCode             

    PostalCode         

    nonclustered located on   PRIMARY         

    PostalCode     

    Більше того, навіть за допомогою застарілої системної таблиці sysindexes (що не дивно), і нової sys.indexes (що дивно) неможливо знайти відмінності. І лише викликавши спеціальну функцію, що дає розширену інформацію про індекси - fn_indexinfo (...), можна помітити, що індекс IXPostalCode_inc займає більше місця.        

    IndexName         

    IndexType         

    Rows         

    MinimumRecordSize         

    MaximumRecordSize         

    AverageRecordSize             

    PostalCode         

    Nonclustered Index         

    9         

    22         

    26         

    23.777             

    IXPostalCode_inc         

    Nonclustered Index         

    9         

    36         

    46         

    40     

    Як вже говорилося, як включаються полів можуть виступати поля будь-яких типів даних, але, з очевидних причин, кластерний індекс додавати не ключові поля не можна. Це просто не має сенсу, тому що якщо проводити аналогію, то в кластерному індексі вся запис є не ключовим полем. Очевидно також, що вставка записів при наявності такого індексу буде дорожче, оскільки необхідно робити копію включається поля в Лістьєва вузли індексу. Однак корисних властивостей у даного нововведення, безумовно більше, ніж недоліків і, судячи з усього, воно виявиться досить корисним.

    ONLINE

    Якщо в попередніх версіях Microsoft SQL Server DDL-операції з індексами викликали блокування всієї таблиці, то тепер індекси можуть бути створені, змінені і вилучені без блокування інших операцій з даними (online). Наприклад, якщо один користувач перебудовує кластерний індекс, то інші можуть продовжувати змінювати і читати дані, за якими це індекс перебудовується. Ця функціональність може виявитися дуже корисною додатків, які працюють за принципом 24x7, зменшуючи час недоступності системи через адміністративного обслуговування.

    Опція ONLINE може бути встановлена для наступних команд:

    CREATE INDEX

    ALTER INDEX

    DROP INDEX

    ALTER TABLE (при видаленні або зміну UNIQUE або PRIMARY KEY обмежень (constraints))

    Щоб мати можливість працювати з даними під час виконання DDL операцій з індексами, побудованими за цими даними, використовуються наступні тимчасові структури:

    «вихідна структура» (source) - це оригінальна таблиця або кластерний індекс.

    «вихідний індекс» (preexisting indexes) - будь-який індекс, побудований за даними джерела. Ця структура доступна паралельним процесів при вибірці, вставці, зміну і видалення даних, у тому числі для пакетних операцій (bulk) та перевірки обмежень контролю цілісності (referential integrity constraints). Вихідний індекс може бути обраний оптимізатором або навіть явно вказаний у запиті.

    «кінцева структура» (target) - це новий індекс або набір індексів, що створюється або перебудовується. Всі запити до початкової структурі, що змінюють дані, автоматично застосовуються сервером і до кінцевої структурі. Ця структура не використовується для пошуку значень до тих пір, поки операція зміни або створення нового індексу не буде зафіксована, всередині сервера вона позначається "тільки для запису" (write only).

    «тимчасовий індекс» (temporary mapping index) - ця структура створюється тільки при виконанні online-операцій з кластерними індексами. Вона використовується для визначення записів, які треба видалити з нового індексу, коли під час роботи з ним видаляються або змінюються дані в вихідної таблиці. Цей некластерний індекс створюється на тому ж кроці, що і новий кластерний індекс, і всі зміни вихідних даних також застосовуються і до тимчасовому індексу.

    Наприклад, якщо відбувається ONLINE-операція по перестроювання кластерного індексу та чотирьох некластерних, асоційованих з ним, то існує одна вихідна структура (оригінальний кластерний індекс), п'ять попередніх індексів (чотири некластерних і один кластерний) і один кінцева структура (кінцевий кластерний індекс). У разі перестроювання кластерного індексу, некластерние, асоційовані з ним, не перебудовуються.

    Під час виконання індексних операцій на вихідної таблиці утримується блокування IS (Intent Share), також, на деяких стадіях, на короткий час накладаються блокування S (Share) і Sch-M (Schema Modification).

    Процес виконання не блокують операцій з індексами може бути розділений на три фази: підготовка, модифікація і завершення.        

    Фаза         

    Опис         

    Блокування вихідних даних             

    Підготовка         

    Підготовка метаданих для   нової структури. Паралельні операції запису даних блокуються на короткий   час. Створюється нова структура і позначається як write-only.         

    S (Shared) на таблицю. IS (Intent Shared) на таблицю. INDEX_BUILD_INTERNAL_RESOURCE.             

    МодіфікаціяОсновная фаза         

    Дані скануються,   сортуються, перебудовуються і вставляються в нову структуру пакетними   операціями (bulk insert). Паралельні операції вставки, зміни та видалення   застосовуватися і до вихідних структурам, і до створюються. Вибірка відбувається з   використанням вихідних структур.         

    IS (Intent Shared) на таблицю. INDEX_BUILD_INTERNAL_RESOURCE             

    Завершення         

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

    IS (Intent Shared) на таблицю. INDEX_BUILD_INTERNAL_RESOURCE.   S (Shared) на таблицю після додавання некластерного індексу. SCH-M (Schema   Modification) на таблицю після зміни будь-якого індексу.     

    Операції з індексом очікують завершення всіх незафіксованих транзакцій, перш ніж накласти колективну (S) блокування або блокування зміни метаданих (Sch-m).

    Блокування INDEX_BUILD_INTERNAL_RESOURCE запобігає паралельні DDL-операції над вихідною таблицею під час роботи з індексами. Звичайна користувальницька активність при цьому не блокується.

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

    ПРИМІТКА   

    У доступній на даний момент версії   Yukon робота з індексами не може бути здійснена не блокує режимі,   якщо у вихідній таблиці містяться поля типу великих об'єктів (Large Objects   - LOB) - text, ntext, image, varchar (max), nvarchar (max), varbinary (max) і   xml. Однак в кінцевій версії це може змінитися.     

    Роботі з індексами в не блокує режимі властиві такі особливості:

    Вихідна таблиця не може бути змінена, відсутній або очищена (truncate) під час виконання операцій з індексами.

    Вказівка опції ONLNE ON або OFF при зміні кластерного індексу, само собою, поширюється, і на всі некластерние індекси, якщо їх також знадобиться перебудувати під час виконання операції. Наприклад, пересозданіе кластерного індексу з опціями CREATE INDEX WITH DROP_EXISTING, ONLINE = ON, викличе пересозданіе всіх асоційованих некластерних індексів у не блокує режимі.

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

    Робота з індексом ONLINE при паралельному виконанні звичайних користувацьких операцій може привести до взаімоблокіровке (deadlock). Незважаючи на те, що система зазвичай вибирає для користувача транзакцію в як "жертви", в деяких випадках може бути скасована операція індексування.

    Виконувати дещо не блокують операцій з індексами паралельно можна тільки якщо це створення некластерних індексів або перестроювання індексу. У всіх інших випадках паралельні DDL-операції з індексами на одній таблиці заборонені.

    При роботі з індексами в offline-та online-режимах витрата дискового простору приблизно однаковий, за винятком тих випадків, коли необхідно створити тимчасовий індекс при видаленні або створення кластерного індексу.

    Очевидно, що робота з індексами в не блокує режимі виконується довше, і при цьому витрачається набагато більше системних ресурсів, особливо CPU.

    Підводячи підсумок, можна сказати, що дана функціональність викликає досить суперечливі відчуття. З одного боку, штука ця, безумовно, корисна, але з іншого - занадто багато обмежень і підводних каменів. Втім, Microsoft обіцяє серйозно поліпшити це нововведення вже до наступної попередньою версією Yukon; збільшити продуктивність, зменшити навантаження на систему і зняти ряд непринципових обмежень.

    Обслуговування

    У рамках невеликий ідеологічної переробки, всі службові процедури збору статистики виносяться в окремі функції, а обслуговування і зміни - в основні T-SQL оператори, що, в-общем, логічніше і зручніше. Не оминула участь ця й індекси.

    Перебудова індексів

    Перебудову індексів тепер рекомендується робити не з допомогою системної команди DBCC DBREINDEX, а за допомогою вказівки відповідної опції в команді ALTER INDEX. Наприклад, перебудова всіх індексів у таблиці Product тепер виглядає так:        

    ALTER   INDEX ALL ON Product REBUILD     

    Дефрагментація індексів

    Дефрагментація також внесена окремою опцією в команду ALTER INDEX, замість DBCC INDEXDEFRAG. Суть команди від цього не змінилася, це як і раніше дефрагментація Лістьєва вузлів індексів, практично не навантажують систему і не заважає іншими операціями. Команда дефрагментації всіх індексів на тій же Product, як і слід було чекати по синтаксису, мало чим відрізняється від команди перебудови:        

    ALTER   INDEX ALL ON Product REORGANIZE     

    Інформація та статистика

    Службову інформацію про індекс тепер можна зібрати не через sp_helpindex, DBCC SHOWCONTIG або безпосередньо службові таблиці, а через дві функції fn_indexinfo і fn_virtualindexstats, які надають набагато більше інформації.

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

    кількість рівнів індексу

    ступінь фрагментації індексу

    кількість сторінок, займаних індексом

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

    кількість Лістьєва вузлів індексу

    кількість вузлів застарілих версій, готових до видалення

    кількість версійність вузлів, утримуваних зацікавленими транзакціями

    максимальний, мінімальний та середній розмір вузлів у індексі

    Наприклад, запит, який повертає всі індекси в базі з фрагментацією більше 30%, виглядає приблизно так:        

    SELECT   TableName, IndexName, AvgFragmentation, RegionsFragmented,   AvgRegionsFragmented   

    FROM   sys.fn_indexinfo (NULL, '*', DEFAULT, 'DETAILED')   

    WHERE AvgFragmentation> 30     

    fn_virtualindexstats дозволяє отримати повну статистику щодо операцій введення/виводу (I/O), по таблицях і індексах. Вона дозволяє відслідковувати час, що проводиться для користувача транзакціями в очікуванні доступу до даних для читання або запису, і відстежити об'єкти, які викликають найбільшу активність. Статистична інформація зберігається до тих пір, поки дані знаходяться в кеші. Слід пам'ятати, що будь-DDL-оператор кеш очищає. Функція ця буде дуже корисна при пошуку вузьких місць в БД, і оптимізації навантаження.

    Нові вбудовані типи даних

    Насправді не тільки додалися нові типи, але й трохи змінилися властивості старих типів даних. Наприклад, як і раніше, довжина одного запису обмежена вісьма кілобайтами (розміром сторінки даних), і оголосити поле довше цих 8k неможливо (якщо це, звичайно, не LOB). Але цілком можливо оголошення двох полів, сумарним розміром переважаючих це обмеження. Але якщо в попередніх версіях помістити в ці поля дані, за розміром переважаючі 8k, то все, що виходить за цей розмір, буде втрачене. Тепер же дані не загубиться. Як тільки сумарна довжина полів виходить за розмір сторінки даних, резервується нова сторінка, в яку поміщається залишок, не влезшій в основну сторінку. А в старій сторінці даних резервується невеликий шматочок розміром 24 байта, в якому розміщується посилання на тій зарезервовану сторінку.

    Таким чином, швидкість роботи, само собою, страждає, але дані при цьому не втрачаються. Тобто з'явилася ще одна можливість неохайним розробникам звинуватити MSSQL в уповільненні роботи на рівному місці. :)

    «max»-типи

    У новій версії серйозно перероблена робота з LOB (Large Objects) - об'єктами великого обсягу. Раніше для рабо

         

     
         
    Реферат Банк
     
    Рефераты
     
    Бесплатные рефераты
     

     

     

     

     

     

     

     
     
     
      Все права защищены. Reff.net.ua - українські реферати ! DMCA.com Protection Status