Главная страница
Навигация по странице:

  • Программное обеспечение

  • 14.2. РАБОТА № 1. Анализ файловой структуры баз данных Цель работы

  • Задачи: – изучить пользовательский интерфейс программной среды SQL-Server Management Studio ; – исследовать файловую структуру системной базы данных « Model»

  • Задание 1. Анализ файловой структуры базы данных «Model» 1.1. Активизируйте системную БД « Model

  • Задание 2. Создание пользовательских баз данных

  • Задание 3. Модификация файловой структуры баз данных

  • 14.3. РАБОТА № 2. Анализ алгоритмов резервирования памяти Цель работы

  • Задание 1. Анализ системного каталога пользовательской

  • Задание 2. Исследование алгоритма резервирования памяти в базах данных с простой файловой структурой

  • NAME ROWS RESERVED DATA INDEX_SIZE UNUSED MyTable_1 1 – – – – NAME ROWS RESERVED

  • Задание 3. Исследование алгоритма распределения памяти в базах данных со сложной файловой структурой

  • Задание 4. Исследование структуры файловой страницы типа DATA

  • 14.4. РАБОТА № 3. Исследование индексных структур данных Цель работы

  • Задание 1. Анализ структуры индексных страниц для неуникального некластеризованного индекса

  • Задание 2. Анализ структуры индексных страниц для кластеризованного индекса

  • Задание 3. Анализ структуры индексных страниц некластеризованного индекса при условии наличия кластеризованного индекса

  • Задание 4. Анализ структуры индексных страниц некластеризованного индекса с включенным столбцом

  • Листинг 4.31 Создание индекса c включенным столбцом 4.3. Повторно выполните задание 3.3. 14.5. РАБОТА № 4. Анализ процедурных планов SQL-запросов

  • Задание 1. Анализ процедурных планов реализации однотабличных SQL-запросов

  • Задание 2. Анализ процедурных планов выполнения SQL-запросов с соединениями таблиц

  • Задание 3. Анализ процедурных планов выполнения SQL-запросов с группировкой строк

  • ЧАСТЬ 5. ИНФОРМАЦИОННАЯ БЕЗОПАСНОСТЬ БАЗ ДАННЫХ

  • Волк В.К. Базы данных. Практикум по проектированию, программированию и администрированию баз данных, включающий примеры и практические задания для самостоятельного выполнения


    Скачать 3.17 Mb.
    НазваниеПрактикум по проектированию, программированию и администрированию баз данных, включающий примеры и практические задания для самостоятельного выполнения
    АнкорВолк В.К. Базы данных
    Дата16.11.2022
    Размер3.17 Mb.
    Формат файлаpdf
    Имя файлаVolk_Bazy-dannyh-proektirovanie-programmirovanie-upravlenie-i-ad.pdf
    ТипПрактикум
    #791285
    страница14 из 18
    1   ...   10   11   12   13   14   15   16   17   18
    ГЛАВА 14. ПРАКТИКУМ
    ПО АДМИНИСТРИРОВАНИЮ
    14.1. Общие методические указания
    Структура и содержание. Практикум содержит четыре практические ра- боты, отражающие следующие аспекты администрирования:
    – управление физической моделью базы данных (работы № 1 и 2);
    – управление индексными структурами данных (работа № 3);
    – анализ процедурных планов выполнения SQL-запросов (работа № 4).
    Каждая работа содержит несколько взаимосвязанных заданий, выполне- ние которых направлено на решение поставленных в работе задач и требует освоения и применения соответствующих инструментальных средств админи- стрирования баз данных.
    Программное обеспечение. Все работы выполняются в системе SQL-Ser- ver Management Studio, версия сервера баз данных — не старше 2008R2.
    Отчет по работе должен содержать:
    − цели и задачи, описание методики проведения работы, используемых структур данных и инструментальных программных средств;
    − иллюстративный материал (листинги программных компонентов, выво- димые на экран результаты их работы, графический материал и пр.);
    − анализ полученных результатов с собственными выводами;
    − ответы на контрольные вопросы (при их наличии).
    Защита. Работа выполняется индивидуально, защита работы проводится в форме собеседования по материалу представленного отчета. В процессе за- щиты оценивается полнота и качество выполнения практических заданий, гра- мотность использования инструментальных средств, правильность и обосно- ванность выводов по результатам работы, качество оформления отчета.
    14.2. РАБОТА № 1.
    Анализ файловой структуры баз данных
    Цель работы: ознакомление с программной архитектурой сервера баз данных и приобретение практических навыков применения инструментальных программных средств, используемых разработчиками и администраторами для управления файловой структурой баз данных.
    Задачи:
    – изучить пользовательский интерфейс программной среды SQL-Server
    Management Studio;
    – исследовать файловую структуру системной базы данных «Model», ис- пользуемую в качестве шаблона для создания пользовательских баз данных;
    – освоить технику создания пользовательских баз данных средствами MS
    SQL-Server Management Studio исоответствующими средствами языка Transact
    SQL (операторы Create Database, Create Table, Alter Table);
    7 / 19

    179
    – освоить технику модификации параметров файловой структуры пользо- вательских баз данных средствами MS SQL-Server Management Studio, сред- ствами языка Transact SQL (оператор Alter Database);
    – исследовать объекты системного каталога базы данных, ответственные за хранение параметров ее файловой структуры.
    Задание 1. Анализ файловой структуры базы данных «Model»
    1.1. Активизируйте системную БД «Model». Определите свойства файло- вой структуры (состав и имена файлов и файловых групп, размеры и прочие параметры файлов) этой базы данных.
    1.2. Просмотрите и проанализируйте схемы и содержимое системных таблиц SysFileGroups и SysFiles этой базы данных (через соответствующие им одноименные системные представления (Sys.SysFileGroups и Sys.SysFiles) и пря- мым доступом к этим таблицам SQL-оператором Select).
    1.3. На базе таблиц SysFileGroups и SysFiles создайте хранимое представ- ление (Create View) для визуализации информации о технических параметрах файлов базы данных и их распределения по группам.
    1.4. Сохраните результаты выполнения задания в отчете.
    Задание 2. Создание пользовательских баз данных
    2.1. Создайте пользовательскую БД и сформируйте ее схему (2–3 связан- ные таблицы) средствами SQL-Server Management Studio.
    2.2. Активизируйте созданную БД и, не заполняя таблиц данными, вы- полните в контексте этой базы данных задание 1.2.
    2.3. В контексте этой БД выполните хранимое представление, созданное при выполнении задания 1.3. Проанализируйте результаты.
    2.4. Создайте еще одну пользовательскую БД средствами Transact SQL
    (оператор Create Database). Создайте в этой БД две вторичные файловые груп- пы, одной из которых установите свойство «по умолчанию». Создайте по два вторичных файла в каждой из вторичных файловых групп. Создайте в этой БД
    4–5 простых таблиц, определите для этих таблиц файловые группы.
    2.5. Повторите задания 2.2 и 2.3 в контексте новой базы данных.
    2.6. Сохраните результаты выполнения задания в отчете.
    Задание 3. Модификация файловой структуры баз данных
    3.1. Используя средства SQL-Server Management Studio, измените пара- метры файловой структуры одной из пользовательских БД, созданных при вы- полнении предыдущего задания:
    – увеличите в 2 раза начальный размер первичного файла БД;
    – уменьшите в 2 раза шаг приращения размера этого файла;
    – создайте две дополнительные (вторичные) файловые группы;
    – создайте во вторичных файловых группах по два (вторичных) файла ба-
    зы данных.
    3.2. В контексте этой (модифицированной) БД выполните запрос, создан- ный при выполнении задания 1.3. Проанализируйте результат.
    8 / 19

    180 3.3. Измените по своему усмотрению параметры файловой структуры си- стемной базы данных «Model» (размер первичного файла БД, количество вто- ричных файловых групп и вторичных файлов).
    3.4. Создайте новую пользовательскую БД, в контексте этой БД выполни- те задания 2.2 и 2.3, результаты сохраните в отчете.
    14.3. РАБОТА № 2.
    Анализ алгоритмов резервирования памяти
    Цель работы: исследование типовых алгоритмов управления процессами распределения файловых страниц между логическими объектами базы данных и приобретение практических навыков использования инструментальных средств администратора для анализа и управления физической моделью данных.
    Задачи:
    – изучить внутреннюю организацию файлов БД в системе MS SQL-Server и внутреннюю организацию файловых страниц;
    – изучить структуру объектов системного каталога БД, ответственных за хранение параметров ее физической модели;
    – освоить языковые (TransactSQL) средства создания и модификации ло- гических объектов БД;
    – освоить технику анализа физической модели БД с использованием ко- манд системной утилиты DBCC и системных хранимых процедур;
    – исследовать алгоритмы выделения дисковой памяти для хранения логи- ческих объектов базы данных (таблиц и индексов), реализованные в MS
    SQL-Server.
    Методические указания
    Лабораторная работа содержит четыре задания, каждое из которых предполагает постановку несложного эксперимента с привлечением програм- мных компонентов базы данных и последующий анализ полученных результа- тов.
    В процессе выполнения заданий продолжается знакомство с компонента- ми системного каталога базы данных (таблицами SysObjects, SysIndexes и соот- ветствующими им системными представлениями), а также приобретается опыт использования встроенных программных средств, предназначенных для созда- ния и анализа компонентов файловой структуры БД:
    – SQL-операторы подмножества DDL языка TransactSQL: CreateDatabase,
    CreateTable, Create Proc;
    – команды системной утилиты DBCC (DataBase Console Command): DBCC
    TraceON, DBCC Page, DBCC ExtentINFO, DBCC ShowContig;
    – системные хранимые процедуры и функции: sp_helptext, sp_helpfile, sp_spaceused, Object_ID().
    9 / 19

    181
    Задание 1. Анализ системного каталога пользовательской БД
    1.1. Используя SQL-команду CREATE DATABASE, создайте пользователь- скую базу данных с простейшей файловой структурой: один файл данных и од- на файловая группа (листинг 4.13).
    Use master;
    CREATE DATABASE MyDB-1
    ON
    (NAME = MyDB-1_Dat,
    FILENAME = 'C:\...\...\MyDB-1.mdf',
    SIZE = 4MB,
    MAXSIZE = UNLIMITED,
    FILEGROWTH = 1MB)
    LOG ON
    (NAME = MyDB-1_log,
    FILENAME = 'D:\...\...\MyDB-1.ldf',
    SIZE = 2MB,
    MAXSIZE = 10MB,
    FILEGROWTH = 15%);
    Листинг 4.13
    Пример создания
    БД
    1.2. Проконтролируйте и сохраните в отчете параметры БД, созданной в результате выполнения приведенного выше SQL-кода: а) прямым доступом оператором Select к таблицам SysFiles и SysFileGroups системного каталога базы данных MyDB-1; б) с использованием хранимой процедуры sp_helpfile (листинг 4.14).
    Use MyDB-1;
    EXEC sp_helpfile;
    Листинг 4.14
    Пример выполнения хранимой процедуры
    1.3. Используя SQL-команду CREATE TABLE, создайте в этой базе данных простую унарную таблицу MyTable_1, каждая строка которой будет занимать ровно одну дисковую страницу (листинг 4.15):
    Use MyDB-1;
    CREATE TABLE MyTable_1
    (column1 char(8000) NOT NULL default 'One row in one page');
    Листинг 4.15
    Пример создания унарной таблицы
    10 / 19

    182 1.4. Прямым доступом оператором к таблице SysObjects системного ката- лога БД MyDB-1 определите и сохраните в отчете: а) параметры name, Id, xtype и crdate для вновь созданного объекта (таб- лицы MyTable_1); б) общее количество объектов такого же типа (xtype) в этой БД; в) общее количество объектов с такой же датой создания (crdate) в этой БД; г) общее количество пользовательских таблиц (xtype = 'U'), системных таблиц (xtype = 'S'), хранимых представлений (xtype = 'V') и хранимых процедур
    (xtype = 'P') в этой БД.
    1.5. Используя встроенную функцию Object_ID(), определите идентифи- катор объекта (таблицы MyTable_1) по его имени.
    Use MyDB-1;
    Select Object_ID('MyTable_1');
    Листинг 4.16
    Пример использования функции Object_ID()
    1.6. Прямым доступом к таблице SysIndexes системного каталога БД
    MyDB-1 определите и сохраните в отчете: а) количество строк в этой таблице, соответствующих объекту MyTable1
    (для ограничения выборки используйте конструкцию: where
    ID = Object_ID('MyTable_1')); б) значения полей Id, IndId, First, Root, FirstIAM для таблицы MyTable_1; в) количество и номера (адреса PageNum) дисковых страниц, владельцем которых является таблица MyTable_1 (в текущей ситуации эта таблица еще не содержит ни одной строки данных).
    1.7. Сформулируйте и сохраните в отчете ответы на следующие вопросы.
    1. Каковы результаты трансляции SQL-запроса CREATE TABLE … и в каких таблицах системного каталога MS SQL-Server сохраняет эти результаты?
    2. Каково назначение системной таблицы SysObjects?
    3. Какую информацию несут значения полей name, Id, xtype и crdate в таблице SysObjects?
    4. Каково назначение системной таблицы SysIndexes?
    5. Какую информацию несут значения полей Id и IndId в таблице
    SysIndexes?
    6. Какую информацию несут значения полей First, Root и FirstIAM и в ка- ком формате представлена эта информация в таблице SysIndexes?
    7. Сколько страниц занимает в файле данных «пустая» таблица?
    8. Для чего можно использовать встроенные хранимые процедуры sp_helpfile и sp_helptext и встроенную функцию Object_ID()? Приведите примеры.
    11 / 19

    183
    Задание 2. Исследование алгоритма резервирования памяти
    в базах данных с простой файловой структурой
    Продолжим эксплуатировать БД MyDB-1, созданную при выполнении предыдущего задания. Эта база содержит единственный (primary) файл данных, ассоциированный с единственной (primary) файловой группой.
    В соответствии с результатами выполнения задания 1.4, часть страниц типа Data этого файла занята объектами системного каталога, а единственная пользовательская таблица MyTable_1 пока пуста и не владеет ни одной из фай- ловых страниц этого типа.
    Проведя несложный эксперимент, исследуйте процесс резервирования и заполнения файловых страниц и распределения их по экстентам соответствую- щих типов (смешанных — mixed или однородных — uniform) при последова- тельной вставке строк в таблицы.
    2.1. Создайте в БД MyDB-1 еще одну таблицу, например MyTable-2, с та- кой же схемой, как у таблицы MyTable-1 (используйте SQL-код, подобный при- веденному в листинге 4.15).
    2.2. Вставьте по одной строке в обе эти таблицы (листинг 4.17) и затем повторно выполните задание 1.6 для двух таблиц (теперь обе таблицы не пусты и каждая из них является владельцем как минимум двух страниц: одной стра- ницы типа Data и одной IAM-страницы).
    Use MyDB-1;
    INSERT INTO MyTable_1 DEFAULT VALUES;
    INSERT INTO MyTable_2 DEFAULT VALUES;
    Листинг 4.17
    Вставка одной строки
    Определите номера экстентов, содержащих страницы, выделенные двум таблицам при вставке в них строк данных. К какому типу относятся эти экстен- ты — uniform или mixed? Ответ обоснуйте и сохраните в отчете.
    2.3. С помощью команды PAGE системной утилиты DBCC просмотри- те заголовки и основное содержимое этих страниц (для каждой из двух таб- лиц).
    DBCC TRACEON (3604)
    DBCC PAGE ('MyDB-1',,,0)
    Листинг 4.18
    Пример выполнения команды PAGE
    С четвертым параметром команды PAGE придется поэспериментировать: значение этого параметра (0, 1, 2 или 3) влияет (по-разному для различных ти- пов страниц) на объем и формат выводимой на экран информации.
    2.4. Используя хранимую процедуру sp_spaceused, определите количе- ство страниц, занятых каждой из этих таблиц.
    12 / 19

    184
    Use MyDB-1;
    EXEC sp_spaceused MyTable_1;
    EXEC sp_spaceused MyTable_2;
    Листинг 4.19
    Пример выполнения процедуры sp_spaceused
    Прокомментируйте результаты работы этой процедуры, представленные на экране в табличном виде, как это показано на рисунке 4.16.
    NAME
    ROWS
    RESERVED
    DATA
    INDEX_SIZE
    UNUSED
    MyTable_1 1




    NAME
    ROWS
    RESERVED
    DATA
    INDEX_SIZE
    UNUSED
    MyTable_2 1




    Рис. 4.16
    Форма представления результатов выполнения процедуры sp_spaceused
    Подтвердите или скорректируйте свой ответ на вопрос, сформулирован- ный в задании 2.2.
    2.5. Последовательно добавляя в обе таблицы еще по 4 строки (листинг
    4.20), определите после каждой вставки общее количество зарезервированных страниц (поле RESERVED), количество страниц, занятых строками таблиц (поле
    DATA), и количество зарезервированных, но еще не использованных страниц
    (поле UNUSED).
    Use MyDB-1;
    INSERT INTO MyTable_1 DEFAULT VALUES;
    EXEC sp_spaceused MyTable_1;
    Go 4;
    INSERT INTO MyTable_1 DEFAULT VALUES;
    EXEC sp_spaceused MyTable_2;
    Go 4;
    Листинг 4.20
    Вставка 4-х строк с контролем занятого пространства
    Обратите внимание на динамику изменения трех указанных выше пара- метров при изменении количества вставленных в таблицы строк. Теперь в каж- дой таблице по 5 строк и, соответственно, каждая таблица является владельцем пяти файловых страниц типа DATA и одной IAM-страницы.
    В экстентах какого типа (uniform или mixed) размещены страницы, выде- ленные двум этим таблицам?
    2.6. Повторите предыдущий опыт — вставьте еще по 5 строк в обе эти таблицы (Go 5) и проанализируйте полученный результат.
    2.7. Вставьте в эти таблицы еще по 50 строк, проанализируйте получен- ный результат с помощью процедуры sp_spaceused и дополнительно с помо- щью команды DBCC EXTENTINFO (листинг 4.21), которая отобразит на экране
    13 / 19

    185
    информацию об идентификаторах занятых страниц (поля file_id и page_id), ко- личестве выделенных (ext_size) и фактически заполненных (pg_alloc) страниц.
    2.8. Если SQL-Server все еще выделяет таблицам страницы в смешанных экстентах, продолжайте вставлять строки в таблицы до тех пор, пока сервер не начнет резервировать однородные экстенты для страниц каждой из таблиц.
    DBCC EXTENTINFO(MyDB-1,MyTable_1,-1 8
    )
    Листинг 4.21
    Пример выполнения команды EXTENTINFO
    2.9. С помощью команды DBCC PAGE просмотрите содержимое страниц типа GAM и SGAM (позиции этих страниц в файле фиксированы: № 2 — для
    GAM и № 3 — для SGAM). Какие свойства (двухбитовые коды) получили экс- тенты, зарезервированные для хранения строк таблиц MyTable_1 и MyTable_2?
    2.10. С помощью команды DBCC PAGE просмотрите содержимое страницы типа PFS (фиксированная позиция № 1 в файле данных). Определите степень заполнения нескольких страниц, выделенных таблицам MyTable_1 и MyTable_2.
    2.11. Сформулируйте и сохраните в отчете ответы на следующие вопросы.
    1. В каком формате хранятся номера страниц в таблице SysIndeses?
    2. Может ли логический объект базы данных (например, таблица) быть владельцем единственной файловой страницы?
    3. Может ли логический объект базы данных быть владельцем несколь- ких файловых страниц типа DATA?
    4. Может ли одна файловая страница типа DATA иметь более чем одного владельца?
    5. Может ли одна файловая страница типа DATA входить в состав более чем одного экстента?
    6. В каких случаях MS SQL-Server резервирует смешанные экстенты?
    7. В каких случаях MS SQL-Server резервирует однородные экстенты?
    8. В каких структурах данных и в каком формате SQL-Server хранит ин- формацию о свободных экстентах, типах зарезервированных экстентов и сво- бодном пространстве внутри файловых страниц?
    9. Какие эксплуатационные показатели использовались в качестве крите- риев при реализации стратегии резервирования экстентов?
    Задание 3. Исследование алгоритма распределения памяти
    в базах данных со сложной файловой структурой
    Если в предыдущем задании анализировался процесс резервирования экс- тентов и страниц единственного файла данных, то теперь ставится задача экс- периментального исследования алгоритма распределения страниц одного логи- ческого объекта (таблицы) между несколькими файлами данных.
    8
    Последним параметром команды EXTENTINFO можно указывать либо имя индекса табли- цы (для вывода информации о страницах этого индекса), либо число 0 (для вывода информа- ции о страницах, занятых строками таблицы), либо число –1 (для вывода информации о страницах, занятых строками таблицы и всеми ее индексами).
    14 / 19

    186
    Рабочая гипотеза, которую следует подтвердить, опровергнуть или уточ- нить в результате выполнения этого задания, может быть сформулирована сле- дующим образом: «Если файловая группа содержит более одного файла типа
    DATA, то при вставке строк в таблицу, ассоциированную с этой файловой
    группой, количество файловых страниц, выделяемых сервером в каждом из
    файлов, будет пропорционально их размерам».
    Для выполнения задания потребуется создать несколько баз данных, имеющих более сложную (по сравнению с MyDB-1)файловую структуру: не- сколько файловых групп и несколько файлов разных размеров в каждой группе.
    3.1. Создайте новую пользовательскую базу данных (например, MyDB-2) со следующей файловой структурой:
    – две файловые группы (группа Primary со свойством по умолчанию и до- полнительная группа Group2);
    – четыре файла типа DATA (первичный файл и три вторичных файла
    (File1, File2 и File3), принадлежащих группе Group2);
    – установите начальные размеры вторичных файлов: Size = 5, 10 и 15 Mb соответственно;
    – установите остальные размерные параметры, одинаковые для всех этих трех файлов: MaxSize = Unlimited; Grows = 1 Mb.
    3.2. Проконтролируйте и сохраните в отчете полученный результат с ис- пользованием прямого доступа к системной таблице sysfiles.
    3.3. Создайте в базе данных MyDB-2 новую таблицу MyTable_3 (листинг
    4.22) — каждая строка этой таблицы будет занимать ровно одну файловую страницу, и все эти страницы (в случае заполнения строк таблицы) будут раз- мещены во вторичных файлах, включенных в группу Group2.
    Use MyDB-2;
    CREATE TABLE MyTable_3
    (column1 char(8000) NOT NULL default 'One row in one page')
    ON Group2;
    Листинг 4.22
    Пример создания таблицы, связанной с файловой группой
    3.4. Учитывая тот факт, что все системные объекты БД MyDB-2 будут размещены в ее первичном файле, а вторичные файлы будут заняты исключи- тельно пользовательскими данными таблицы MyTable_3, рассчитайте (прибли- зительно) максимальное количество страниц этой таблицы, соответствующее начальному размеру каждого из трех файлов группы Group2.
    3.5. Используя листинг 4.23, напишите пользовательскую хранимую про- цедуру AddRows, при выполнении которой в таблицу будет вставлено заданное количество строк со значениями полей по умолчанию, указанными при созда- нии таблицы.
    15 / 19

    187 3.6. Используя процедуру AddRows, вставьте в таблицу MyTable_3 рас- четное количество строк так, чтобы меньший из трех вторичных файлов ока- зался заполненным примерно наполовину. Проконтролируйте и сохраните в от- чете полученный результат.
    CREATE PROC AddRows @Tablename char(12),@maxrows int
    AS
    SET nocount off
    DECLARE @count INT
    SET @count = 0
    WHILE @count < @maxrows
    BEGIN
    INSERT INTO @Tablename DEFAULT VALUES
    SET @count = @count + 1
    END
    Листинг 4.23
    Пример SQL-кода для создания хранимой процедуры
    3.7. Многократно повторяя п. 3.6, добейтесь ситуации, когда наибольший (по начальному размеру) из вторичных файлов увеличится по размеру примерно вдвое.
    3.8. По результатам проведенного эксперимента опишите и сохраните в отчете алгоритм распределения страниц типа DATA между файлами одной файловой группы в случае, когда начальные размеры файлов различны, но их предельные размеры не ограничены.
    3.9. Создайте новую пользовательскую базу данных (например, MyDB-3) с файловой структурой, аналогичной MyDB-2, но с различными параметрами
    MaxSize для вторичных файлов.
    3.10. Повторите п. 3.2–3.7 этого задания.
    3.11. По результатам проведенного эксперимента постройте графики за- висимостей размеров файлов от количества строк таблицы, опишите и сохрани- те в отчете алгоритм распределения страниц типа DATA между файлами одной файловой группы в случае, когда различны и начальные, и предельные размеры файлов.
    Задание 4. Исследование структуры файловой страницы типа DATA
    При выполнении предыдущих заданий исследовался процесс резервиро- вания файловых страниц при вставке строк в таблицы, и для этого было удобно использовать унарные таблицы с полями типа char(8000), чтобы каждая строка таблицы занимала целую страницу. В реальной ситуации страница может со- держать несколько строк таблицы и при этом иметь свободное пространство для вставки в таблицу последующих строк.
    Объектом исследования в этом задании является внутренняя структура файловой страницы и процесс ее заполнения строками таблицы.
    Для выполнения задания рекомендуется создать новую базу данных
    (например, MyDB-4) с простой файловой структурой.
    16 / 19

    188 4.1. Создайте бинарную таблицу MyTable_4(Key1 INT, Data CHAR(10)) с длиной строки 14 байт.
    4.2. Вставьте в таблицу 10 строк, заполнив поля случайными данными.
    USE MyDB-4
    DECLARE @key1 INT, @data CHAR(10)
    SET @key1=1000*RAND(), @data=STR(@key1)
    INSERT into MyTable_4 values(@Key1,@data)
    Go 10
    Листинг 4.24
    Вставка 10-ти строк в таблицу
    Примечание. Функция RAND() возвращает псевдослучайное число в диапазоне
    (0–1), а функция STR() преобразует число в соответствующую цифровую строку.
    4.3. Определите номер первой файловой страницы (SysIndexes.First), вы- деленной этой таблице, и просмотрите страницу командой DBCC PAGE(). Опре- делите и сохраните в отчете:
    – количество слотов страницы, занятых строками таблицы;
    – смещения (в байтах) каждого слота;
    – длину (в байтах) каждого слота.
    4.4. Вставьте еще 100 строк в таблицу и повторно выполните п. 4.3.
    4.5. Просмотрите PFS-страницу командой DBCC PAGE, определите процент заполнения первой страницы, выделенной таблице.
    4.6. Выполняйте п. 4.4 и 4.5 до 100%-ного заполнения первой страницы выделенной таблицы. Определите и сохраните в отчете:
    – количество слотов первой страницы, занятых строками таблицы;
    – суммарный объем страницы, занятый заполненными слотами;
    – суммарный объем страницы (в байтах), занятый областью обратных ссылок (offset table).
    4.7. Просматривая первую страницу таблицы, выберите по своему усмот- рению один из заполненных слотов, запомните его номер и значения полей со- ответствующей строки таблицы. Затем удалите из таблицы эту строку (Delete
    MyTable_4 Where Key1=…).
    4.8. Повторно просмотрите страницу командой DBCC PAGE, обращая вни- мание на слот с удаленной строкой. Прокомментируйте и попытайтесь объяс- нить полученный результат.
    14.4. РАБОТА № 3.
    Исследование индексных структур данных
    Цель работы: изучение индексных структур и приобретение навыков ис- пользования инструментальных средств управления индексами.
    Задачи:
    – освоить программные средства создания, модификации и анализа ин- дексных структур данных;
    17 / 19

    189
    – изучить структуру объектов системного каталога, ответственных за хранение параметров индексов;
    – изучить формат индексных страниц для различных типов индексов.
    Методические указания
    Работа содержит четыре взаимосвязанных задания, каждое из которых направлено на изучение многоуровневых индексных структур данных для ин- дексов четырех различных типов:
    – некластеризованного индекса по неуникальным столбцам таблицы при условии отсутствия кластеризованного индекса;
    – кластеризованного уникального индекса;
    – некластеризованного индекса при условии наличия в таблице кластери- зованного индекса;
    – некластеризованного индекса с включенными столбцами.
    Каждое задание предполагает постановку несложного эксперимента с привлечением программных компонентов базы данных и последующее прове- дение анализа полученных результатов.
    В процессе выполнения заданий продолжится знакомство с компонента- ми системного каталога базы данных (таблица SysIndexes) и программными средствами, используемыми для управления индексами:
    – SQL-операторы Create/Alter/Drop Index;
    – команды Page и ShowContig системной утилиты DBCC;
    – системная хранимая процедура sp_spaceused;
    – TVF-функция sys.dm_db_index_physical_stats().
    Задание 1. Анализ структуры индексных страниц
    для неуникального некластеризованного индекса
    1.1. Используя SQL-команду Create Database, создайте пользовательскую базу данных (например, Index_Test_1) с простейшей файловой структурой: один файл данных в одной группе.
    1.2. Используя SQL-команду Create Table, создайте в этой БД таблицу
    MyTable_4, схема которой включает три целочисленных столбца и четвертый столбец строкового типа.
    Use Index_Test_1
    CREATE TABLE MyTable_4
    (Key_0 INT NOT NULL,
    Key_1 INT NOT NULL,
    Key_2 INT NOT NULL,
    Data CHAR(61) NOT NULL)
    Листинг 4.25
    Создание таблицы MyTable_4
    Примечание. Длина поля Data (61 байт) выбрана для удобства просмот-
    ра файловых страниц командой DBCC PAGE: так как каждый слот страницы
    18 / 19

    190
    содержит два служебных поля суммарной длиной в 7 байт, то общая длина
    каждого слота составит ровно 80 байт (7+3*4+61).
    1.3. Определите идентификатор этой таблицы и убедитесь в том, что си- стемная таблица SysIndexes содержит ровно одну запись, соответствующую таблице MyTable_4, и при этом таблица MyTable_4 не является владельцем ни одной файловой страницы. Объясните этот факт.
    1.4. Вставьте в таблицу MyTable_4 одну строку данных.
    USE Index_Test_1
    DECLARE @key0 INT, @key1 INT, @key2 INT, @dat CHAR(30)
    SET @key0=1000*RAND(),@key1=1000*RAND(), @key2=1000*RAND()
    SET @dat=STR(@key0)+STR(@key1)+STR(@key2)
    INSERT into MyTable_4 values(@key0,@key1,@key2,@dat)
    Листинг 4.26
    Вставка строки в таблицу MyTable_4 1.5. Используя хранимую процедуру sp_spaceused, определите количе- ство страниц, занятых данными этой таблицы и всеми ее индексами, включая
    IAM-страницу.
    1.6. Повторным запросом к таблице SysIndexes определите:
    – количество записей в системной таблице SysIndexes, соответствующих таблице MyTable_4;
    – значения полей Root, First, FirstIAM и IndID для каждой из этих записей;
    – категории объектов (Heap, ClusteredIndex или NonClusteredIndex), соот- ветствующих таблице MyTable_4.
    1.7. С помощью команды DBCC PAGE просмотрите содержимое всех стра- ниц, владельцем которых является таблица MyTable_4.
    1.8. Создайте НЕкластеризованные НЕуникальные индексы по полям
    Key_0, Key_1 и Key_2 таблицы MyTable_4 (листинг 4.26), затем повторно вы- полните п. 1.5 и 1.6.
    Use Index_Test_1
    Create NONCLUSTERED Index NonClInd_0
    ON MyTable_4(Key_0)
    Листинг 4.27
    Создание некластеризованного индекса NonClInd_0 по полю Key_0 1.9. Командой DBCC PAGE просмотрите заголовки и основное содержи- мое корневых и листовых страниц всех трех индексов (используйте значения 1,
    2 и 3 для четвертого параметра этой команды). Определите:
    – глубину индексов;
    – номера страниц корневого и листового уровней;
    – формат ссылки с корневого уровня индекса на промежуточный (не ли- стовой) уровень;
    – формат ссылки с листовой страницы на страницу данных в куче (heap).
    19 / 19

    191 1.10. Вставьте в таблицу еще 1000 строк.
    1.11. Проанализируйте полученный результат с помощью хранимой про- цедуры sp_spaceused, команды DBCC ShowContig и TVF-функции sys.dm_db_index_physical_stats().
    1.12. Вставьте в таблицу еще 100 000 строк (возможно, придется немного подождать) и выполните повторный анализ полученного результата.
    1.13. Сформулируйте ответы на следующие вопросы.
    1. Для чего и в каких случаях рекомендуется использовать индексы сле- дующих типов: «кластеризованный индекс», «некластеризованный индекс»,
    «уникальный индекс», «индекс с включенными стобцами»?
    2. На какие эксплуатационные показатели работы базы данных оказывает влияние индексирование данных в таблицах?
    3. В каких ситуациях наличие индексированных столбцов таблиц может привести к снижению производительности работы базы данных?
    4. Какие ограничения накладывает SQL-Server на использование индек- сов?
    5. Каков формат ссылки с корневого уровня индекса на промежуточный
    (не листовой) уровень?
    6. Каков формат ссылки с листовой страницы некластеризованного ин- декса при условии, что в таблице отсутствует кластерный индекс?
    7. Как связаны между собой значения параметров «порядок индекса» и
    «глубина индекса» индексной структуры данных?
    8. Какова глубина индексов, построенных при выполнении заданий 1.8,
    1.10 и 1.12?
    Задание 2. Анализ структуры индексных страниц
    для кластеризованного индекса
    Для выполнения задания рекомендуется создать новую базу данных
    (например, Index_Test_2) с простейшей файловой структурой.
    2.1. Создайте в БД Index_Test_2 таблицу MyTable_5 (листинг 4.27). use Index_Test_2
    CREATE TABLE MyTable_5
    (Key_0 IDENTITY CONSTRAINT Key0_PK PRIMARY KEY,
    Key_1 INT,Key_2 INT, Data CHAR(68))
    Листинг 4.28
    Пример создания таблицы с первичным ключом
    Примечание 1. Параметр IDENTITY, установленный для целочисленного
    поля Key_0, присваивает полю статус идентификатора, значения которого
    при вставке строк в таблицу сервер будет присваивать автоматически (по
    умолчанию автоинкрементно с шагом 1, начиная с 1).
    Примечание 2. Ограничение первичного ключа (PRIMARY KEY) для поля
    Key_0 гарантирует уникальность значений этого поля в таблице, даже при
    1 / 24

    192
    отсутствии свойства IDENTITY. По умолчанию сервер автоматически создает
    кластеризованный индекс по первичному ключу.
    2.2. Определите адреса файловых страниц Root, First и FirstIAM для кла- стеризованного индекса поля Key_0 таблицы MyTable_5.
    2.3. Вставьте в таблицу 10 строк (листинг 4.28) и повторите п. 2.2.
    USE Index_Test_2
    DECLARE @key0 INT,@key1 INT,@key2 INT,@dat CHAR(30)
    SET @key1=1000*RAND(),@key2=1000*RAND()
    SET @dat=STR(@key1)+STR(@key2)
    INSERT into MyTable_5 values(@key1,@key2,@dat)
    Go 10
    Листинг 4.29
    Вставка 10-ти строк в таблицу MyTable_5 2.4. Выполните задания, аналогичные п. 1.8–1.12, в контексте базы дан- ных Index_Test_2 применительно к таблице MyTable_5.
    Задание 3. Анализ структуры индексных страниц
    некластеризованного индекса при условии наличия
    кластеризованного индекса
    3.1. Для выполнения задания будет использоваться ранее созданная база данных Index_Test_2 и уже существующая и заполненная таблица MyTable_5.
    3.2. Создайте в таблице MyTable_5 некластеризованный индекс по полю
    Key_1. use Index_Test_2
    Create NONCLUSTERED Index NonClInd_1
    ON MyTable_5(Key_1)
    Листинг 4.30
    Создание индекса в ранее заполненной таблице
    3.3. Дождитесь завершения процесса построения индекса и затем повторно выполните задания 2.2–2.4.
    Задание 4. Анализ структуры индексных страниц
    некластеризованного индекса с включенным столбцом
    4.1. Для выполнения задания будет использоваться ранее созданная база данных Index_Test_2 и заполненная таблица MyTable_5, в которой уже созданы индексы по двум полям: уникальный кластеризованный индекс по ключевому полю Key_0 и неуникальный некластеризованный индекс по полю Key_1.
    Остальные два поля таблицы неиндексированы.
    4.2. Создайте в таблице MyTable_5 некластеризованный индекс по полю
    Key_2 с включенным полем Data.
    2 / 24

    193
    use Index_Test_2
    Create NONCLUSTERED Index incl_Ind_2
    ON MyTable_5(Key_1) INCLUDE(Data)
    Листинг 4.31
    Создание индекса c включенным столбцом
    4.3. Повторно выполните задание 3.3.
    14.5. РАБОТА № 4.
    Анализ процедурных планов SQL-запросов
    Эта работазавершает цикл из четырех работ, направленных на изучение физической модели данных, поддерживаемой MS SQL-Server.
    Цель работы: изучение стратегий построения процедурных планов ис- полнения SQL-запросов, реализуемых оптимизатором, и приобретение практи- ческих навыков анализа и управления производительностью.
    Задачи:
    – ознакомиться с основными низкоуровневыми операторами, используе- мыми для построения и описания процедурных планов;
    – освоить технику анализа процедурных планов соответствующими язы- ковыми средствами (SET SHOWPLAN, SET STATISTICS), а также средствами их графической визуализации;
    – провести экспериментальное исследование влияния индексирования таблиц БД на производительность выполнения типовых SQL-запросов;
    – по результатам проведенного анализа сделать выводы о стратегии рабо- ты генератора процедурных планов и эффективности применения различных индексных структур.
    Методические указания
    Работа содержит два задания, каждое из которых направлено на изучение стратегий построения процедурных планов исполнения следующих типовых
    SQL-запросов при использовании различных типов индексов по столбцам базо- вых таблиц:
    – процедурные планы реализации простейших однотабличных SQL- запросов вида Select … From Where ;
    – процедурные планы реализации SQL-запросов с соединением таблиц;
    – процедурные планы реализации SQL-запросов с группировкой данных и использованием агрегатных функций;
    – процедурные планы реализации модифицирующих SQL-запросов
    (Insert, Delete, Update).
    Для выполнения работы потребуется создать базу данных, состоящую из нескольких взаимосвязанных таблиц достаточно большой мощности, по столб- цам которых сформированы индексы различных типов.
    3 / 24

    194
    Каждое задание предполагает постановку несложных экспериментов с выполнением типовых SQL-запросов, визуализацией процедурных планов их исполнения и сравнительной оценкой планов по производительности.
    В процессе выполнения заданий потребуется использование следующих программных средств:
    – SQL-операторов Create/Alter DataBase/Table/Index — для создания/мо- дификации логических объектов базы данных;
    – TVF-функции sys.dm_db_index_physical_stats() — для определения па- раметров индексов;
    – команды DBCC show_statistics(t1,ind) — для отображения статистики индекса Ind таблицы Т1;
    – команды группы SET — для визуализации процедурных планов:
    • SHOWPLAN_XML, SHOWPLAN_TEXT, SHOWPLAN_ALL — отображают ин- формацию о предполагаемом (estimated) процедурном плане выполнения за- проса, блокируя при этом его выполнение;
    • STATISTICS XML, STATISTICS PROFILE — отображают информацию о фак- тическом (real) процедурном плане исполнения запроса;
    • STATISTICS IO, STATISTICS TIME — отображают информацию о дисковой активности и времени выполнения запроса;
    – логические и физические процедурные операторы (табл. 4.10), исполь- зуемые генератором для формирования планов исполнения SQL-запросов.
    Задание 1. Анализ процедурных планов реализации
    однотабличных SQL-запросов
    1.1. Запросы выборки из структуры данных типа куча.
    Для проведения эксперимента создайте БД (например, Plan_Test1) и в этой БД создайте таблицу MyTable_6.
    Use Plan_Test1;
    CREATE TABLE MyTable_6
    (Key_0 INT NOT NULL, Key_1 INT NOT NULL,
    Key_2 INT NOT NULL, Data CHAR(8000) NOT NULL);
    Листинг 4.32
    Создание таблицы MyTable_6
    Заполните 10 000 строк этой таблицы случайными значениями.
    USE Plan_Test1;
    DECLARE @key0 INT,@key1 INT,@key2 INT,@dat CHAR(30)
    SET @key0=1000*RAND(),@key1=1000*RAND(),@key2=1000*RAND()
    SET @dat=STR(@key1)+STR(@key2)
    INSERT into MyTable_6 values(@key0,@key1,@key2,@dat);
    Go 10000
    Листинг 4.33
    Вставка 10 000 строк в таблицу MyTable_6 4 / 24

    195 1.1.1. Прямым доступом к таблице SysIndexes убедитесь в том, что для таблицы MyTable_6 сформирована структура данных типа куча, и определите количество страниц, занятых строками этой таблицы с помощью хранимой процедуры sp_spaceused.
    1.1.2. Подготовьте и выполните SQL-запрос выборки всех данных табли- цы (Select * From MyTable_6), оцените ее мощность, сравните с результатами работы процедуры sp_spaceused.
    1.1.3. Включите (рис. 4.13) режим графического отображения предпола- гаемого плана выполнения запроса и определите:
    – графическую схему предполагаемого плана;
    – используемые процедурные операторы;
    – стоимость выполнения операторов;
    – стоимость операций ввода-вывода;
    – стоимость операций обработки данных.
    1.1.4. Дополните пакет выполнения предыдущего запроса (п. 1.1.2) ко- мандами управления отображением процедурных планов:
    – SET STATISTICS XML ON;
    – SET STATISTICS PROFILE ON;
    – SET STATISTICS IO ON;
    – SET STATISTICS TIME ON.
    1.1.5. Включите режим графического отображения фактического плана и повторно выполните запрос.
    1.1.6. Просмотрите результаты выполнения запроса (вкладки «Результа- ты», «Сообщения» и «План выполнения»). Определите и сохраните в отчете параметры фактического процедурного плана.
    1.1.7. Проведите анализ фактических планов выполнения следующих за- просов, содержащих операторы ограничения и группировки строк таблицы:
    1) Select * From MyTable_6 Where Key_1=555;
    2) Select * From MyTable_6 Where Key_2>666;
    3) Select Data From MyTable_6 Where Key_1>20 And Key_2<100;
    4) Select * From MyTable_6 Order By Data;
    5) Select Key_1,Count(*) From MyTable_6 Group By Key_1.
    1.1.8. Сформулируйте выводы о стратегии работы генератора процедур- ных планов выполнения SQL-запросов выборки данных из кучи.
    1.2. Запросы выборки данных из индексированных таблиц.
    1.2.1. Создайте таблицу MyTable_7 (аналогичную MyTable_6).
    1.2.2. Создайте НЕкластеризованные НЕуникальные индексы по полям
    Key_0, Key_1 и Key_2 таблицы MyTable_7.
    1.2.3. Вставьте 10 строк в таблицу MyTable_7.
    1.2.4. Используя данные таблицы SysIndexes, убедитесь в том, что для таблицы MyTable_7 сформирована структура данных типа куча и дополнитель- но три некластеризованных индекса.
    1.2.5. Определите для каждого из индексов глубину индекса и количество индексных страниц на каждом уровне.
    5 / 24

    196 1.2.6. Выполните запросы (п. 1.1.2 и 1.1.7) на базе индексированной таб- лицы MyTable_7, сравните процедурные планы их выполнения с планами за- просов выборки из кучи.
    1.2.7. Вставьте в таблицу MyTable_7 еще 9990 строк(теперь ее мощность будет равна мощности таблицы MyTable_6).
    1.2.8. Просмотрите процедурный план выполнения операции Insert, определите стоимость ее выполнения, сохраните в отчете.
    1.2.9. Командой DBCC show_statistics(‘MyTable_7’,) отобразите статистику всех трех индексов таблицы. Прокомментируйте результаты.
    1.2.10. Повторно выполните п. 1.2.6. Оцените повышение производитель- ности запросов на индексированной таблице по сравнению с запросами выбор- ки данных из кучи.
    1.2.11. Создайте (листинг 4.33) таблицу MyTable_8 с первичным ключом
    Key_0 автоинкрементного типа IDENTITY (по этому полю таблицы будет автома- тически создан кластеризованный индекс).
    USE Plan_Test1
    CREATE TABLE MyTable_8
    (Key_0 INT NOT NULL IDENTITY
    CONSTRAINT Key0_PK PRIMARY KEY,
    Key_1 INT NOT NULL,
    Key_2 INT NOT NULL,
    Data CHAR(8000) NOT NULL)
    Листинг 4.34
    Создание таблицы с первичным ключом
    1.2.12. Создайте НЕкластеризованные НЕуникальные индексы по полям
    Key_1 и Key_2 таблицы MyTable_8.
    1.2.13. Вставьте в таблицу MyTable_8 10 000 строк.
    USE Plan_Test1
    DECLARE @key1 INT
    DECLARE @key2 INT
    DECLARE @dat CHAR(30)
    SET @key1=1000*RAND()
    SET @key2=1000*RAND()
    SET @dat=STR(@key1)+STR(@key2)
    INSERT into MyTable_8 values(@key1,@key2,@dat)
    Go 10000
    Листинг 4.35
    Вставка 10 000 строк
    1.2.14. Командой DBCC show_statistics() отобразите статистику всех трех индексов таблицы MyTable_8. Прокомментируйте результаты.
    6 / 24

    197 1.2.15. Просмотрите процедурный план выполнения операции Insert, определите стоимость ее выполнения, сохраните в отчете.
    1.2.16. Повторно выполните запросы, аналогичные запросам п. 1.1.2 и
    1.1.7, сравните процедурные планы их выполнения с планами запросов выбор- ки данных из кучи и с планами запросов выборки данных из таблицы с некла- стеризованными индексами.
    Задание 2. Анализ процедурных планов выполнения SQL-запросов
    с соединениями таблиц
    2.1. Запросы с соединением неиндексированных таблиц.
    В этом эксперименте будет использоваться имеющаяся таблица
    MyTable_6 (индексов нет, мощность — 10 000 строк) и аналогичная ей по структуре новая таблицу MyTable_9 мощностью в 100 строк.
    Создайте 4 запроса на базе таблиц MyTable_6 и MyTable_9 и проведите анализ фактических планов их выполнения.
    1) Select MyTable_6.Key_0, MyTable_9.Key_1, MyTable_6.Data
    From MyTable_6 Inner Join MyTable_9
    ON MyTable_6.Key_0=MyTable_9.Key_1;
    2) Select MyTable_9.Key_0, MyTable_6.Key_1, MyTable_6.Data
    From MyTable_9 Inner Join MyTable_6
    ON MyTable_9.Key_0 = MyTable_6.Key_1;
    3) Select MyTable_9.Key_0, MyTable_6.Key_1, MyTable_6.Data
    From MyTable_9 Left Join MyTable_6
    ON MyTable_9.Key_0 = MyTable_6.Key_1;
    4) Select MyTable_9.Key_0, MyTable_6.Key_1, MyTable_6.Data
    From MyTable_9 Right Join MyTable_6
    ON MyTable_9.Key_0 = MyTable_6.Key_1;
    Листинг 4.36
    Запросы с соединением неиндексированных таблиц
    2.2. Запросы с соединением индексированных таблиц.
    В этом эксперименте будет использоваться имеющаяся таблица
    MyTable_8 (мощность — 10 000 строк, кластеризованный уникальный индекс по полю — Key_0, некластеризованные неуникальные индексы по полям —
    Key_1 и Key_2) и аналогичная ей по структуре новая таблица MyTable_10 мощ- ностью в 100 строк.
    Создайте 4 запроса на базе таблиц MyTable_8 и MyTable_10 (аналогич- ные запросам, приведенным в п. 2.1) и проведите анализ фактических планов их выполнения.
    Сформулируйте ответы на следующие вопросы.
    1. В каких ситуациях наличие индексированных столбцов таблиц может привести к снижению производительности работы базы данных?
    2. Какую информацию о состоянии базы данных использует генератор процедурных планов?
    7 / 24

    198 3. В каких типовых ситуациях «estimated plan» и «real plan» одного и того же SQL-запроса не совпадают?
    Задание 3. Анализ процедурных планов выполнения SQL-запросов
    с группировкой строк
    Выполнение задания потребует проведение эксперимента по анализу стратегии работы генератора процедурных планов выполнения SQL-запросов, содержащих операторы группировки строк Group By, операторы фильтрации групп Having и агрегатные функции (такие, например, как COUNT(), SUM() или
    MAX()).
    Методика проведения экспериментов и средства анализа процедурных планов те же, что и при выполнении предыдущих заданий этой работы.
    Предлагается самостоятельно спланировать, подготовить и провести две серии экспериментов:
    – группировка строк таблицы с применением агрегатной функции;
    – группировка строк таблицы с фильтрацией групп.
    Серия содержит несколько опытов, каждый из которых выполняется для определенных условий:
    – таблица не имеет индексов, группировка — по одному из столбцов;
    – таблица не имеет кластеризованного индекса, группировка — по одно- му из индексированных столбцов;
    – таблица имеет первичный ключ, группировка — по одному из неиндек- сированных столбцов;
    – таблица имеет первичный ключ, группировка — по одному из индекси- рованных столбцов.
    8 / 24

    199
    ЧАСТЬ 5.
    ИНФОРМАЦИОННАЯ
    БЕЗОПАСНОСТЬ БАЗ ДАННЫХ
    9 / 24

    200
    1   ...   10   11   12   13   14   15   16   17   18


    написать администратору сайта