Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Плещёв БД 2013-03-15.doc
Скачиваний:
3
Добавлен:
01.04.2025
Размер:
12.65 Mб
Скачать

4.3.6.10. Фрагментация

Вывод данных о фрагментации (п. 4.3.1.1) выполняется командой:

Dbcc Showcontig(<идентификатор таблицы> [, <идентификатор индекса>])

Для получения индекса используется команда Select Object_id.

Пример

select Object_id ('Сотрудники') -- вывод идентификатора таблицы

Dbcc Showcontig (629577281) -- вывод данных о фрагментации таблицы

Справочная информация выводится в виде строк:

Pages/Extents Scanned ‑ число страниц/экстентов в таблице или индексе.

Extents Switches ‑ число переключателей между экстентами. Если это чис­ло превышает число всех экстентов, то экстенты фрагментированы.

Avg Pages per Extent ‑ среднее число страниц на один экстент.

Scan Density [Best Count: Actual Count] ‑ плотность сканирования в процентах. Чем она выше, тем лучше. Дополнительно указывается идеаль­ное и текущее число экстентов.

Logical/Extent Scan Fragmentation ‑ степень логической/физической фраг­мен­тации данных. При отсутствии фрагментации степень нулевая.

Avg. Bytes free per Pages ‑ среднее свободного пространства (в байтах) на странице размером 8 Кбайт.

Avg. Page density (full) ‑ процент среднего заполнения страницы. При боль­­шом проценте заполнения нужно перестроить данные на странице.

4.3.6.11. Курсоры

Курсоры позволяют создать временный результирующий набор записей (строк) из пред­став­ле­ния или запроса с воз­мож­­ностью доступа к любой отдельной за­пи­си этого набора.

Курсоры Transact-SQL бывают четырех типов:

  1. Cтатические (Static) ‑ сервер сохраняет результирующий набор систем­ной базы данных tempdb на основе моментального снимка (копий) исполь­зуемых таблиц. Курсоры открываются только для чтения и из­ме­не­ния, произведенные в базе данных после открытия, не учитываются.

  2. Ключевые (Keyset) ‑ результирующий набор ключей состоит из ссылок на записи и создается в систем­ной базе данных tempdb толь­ко при открытии курсора и далее не изменяется. Учитываются изменения в базе данных после открытия курсора, а удаления и вставки новых записей ‑ нет.

  3. Последовательные (Fast_Forward) результирующий набор не со­х­раняется на сервере набора данных и запоминается только номер те­ку­щей строки. Допускается переход только к следующей строке курсора, ко­то­рая нахо­ди­т­ся сервером. Все изменения в базе будут учиты­вать­ся.

  4. Динамические (Dynamic) ‑ аналогичны последовательным курсо­рам, но до­пус­кают доступ к любой отдельной строке.

Схема работы с курсором: объявление, открытие, выборка данных из курсора командой Fetch в цикле обработки курсора, закрытие и осво­бож­дение курсора.

Команды работы с курсором (имя курсора может задаваться кон­стан­той или переменной типа курсора).

Declare <имя курсора> Cursor [Local | Global] [Forward_Only | Scroll]

[Static | Keyset | Dynamic | Fast_Forward] --типы курсоров

[Read_Only | Scroll_Locks | Optimistic] [Type_Warning]

For <Select ...> For Update [Of <имя столбца>, ...] ‑ объяв­ле­ние курсора.

Рассмотрим параметры этой команды.

Local/Global ‑ локальный/глобальный курсор, удаляемый/сохраняемый пос­ле завершения транзакции. Допускаются одноименные локальный и глобальный курсоры. В этом случае в остальных операторах по умолчанию используется локальный, а глобальный уточняется параметром Global.

Forward_Only/Scroll ‑ выборка следующей/любой строки.

Read Only ‑ только чтение данных из курсора.

Scroll_Locks ‑ блокирует все строки курсора.

Update [Of <имя колонки>, ...] ‑ допускается корректировка всего курсора или только указанных столбцов.

Optimistic ‑ при изменении данных в курсоре, которые уже были изменены вне его, выводится сообщение об ошибке, и операция откатывается.

Type_Warning ‑ вывод сообщения при преобразовании типа курсора.

Open/Close/Deallocate [Clobal] Cursor <имя курсора> ‑ открытие/зак­ры­тие /ос­вобождение курсора. Пос­ле освобождения курсора открыть его уже невозможно. Закрытие и удаление курсора выполняются автоматически при окончании работы хранимой процедуры.

Fetch [Next | Prior | First | Last | Absolute n | Relative k] [Global]

<имя курсора> Into <@X1> [, <@X2>]... ‑ чтение следующей (Next), предыдущей (Prior), первой (First), последней (Last) записи в переменные @X1, @X2 ... соот­вет­ственно. Значение N (константа или переменная) задает номер читаемой строки (если N<0, то отсчет ведется от конца набора). Значение K задает число пропуcкаемых записей вперед или назад (К<0) от текущей записи. Признаком окончания строк в запросе является сохранение значений пе­ременных неизменными или значение системной переменной Fetch_Status<>0.

Update/Delete <имя таблицы>

[Set {<имя столбца>={Default | Null | <выражение>}}, ...] --для Update

Where Current Of <имя курсора> ‑ корректировка/удаление строки табли­цы, соот­вет­ствующей текущей строке курсора.

Пример хранимой процедуры c курсором (п. 4.3.7).

CREATE PROCEDURE [Подразделения] AS

Declare @kp Integer --объявление переменной

Declare @np Nvarchar (30) --объявление переменной

--объявление курсора с запросом вывода таблицы Подразделения

Declare zapros Cursor For Select* from Подразделения For Read Only

Open zapros --открытие курсора, запрос выполняется и формируется набор

Set Nocount On --блокировка вывода числа обработанных записей

While 1>0 --заголовок бесконечного цикла чтения набора

Begin --начало блока тела цикла

Fetch zapros Into @kp, @np --чтение очередной записи набора

If @@Fetch_Status<>0 break --окончание набора и выход из цикла

Select @kp, @np --вывод полей записи на экран

End --конец тела цикла

Close zapros Deallocate zapros --закрытие и удаление курсора