Обслуживание баз данных (SQL Server Compact)
Со временем внутренняя структура базы данных Microsoft SQL Server Compact становится все более фрагментированной, что ведет к нерациональному использованию места на диске. и снижению производительности. Для уменьшения фрагментации используйте описанные ниже функции обслуживания базы данных SQL Server Compact.
Дополнительные сведения о работе с методами и свойствами, описанными в данном разделе, см. в разделе System.Data.SqlServerCe.
Сжатие
Воспользуйтесь методом Compact (метод CompactDatabase в программировании собственного кода) для восстановления места в файле базы данных. Метода также можно использовать для изменения параметров базы данных, например пароля и кода локали (LCID).
Файлы базы данных SQL Server Compact разбиты на логические единицы размером по 4 КБ, называемые страницами. Поскольку в базу данных постоянно вносятся изменения, некоторые страницы могут содержать неиспользуемое пространство, а некоторые страницы не используются. Неиспользуемые страницы со временем перерабатываются механизмом AutoShrink. Дополнительные сведения см. в подразделе «Автосжатие» текущего раздела.
Пустое место на страницах можно восстановить только с помощью метода Compact. Метод Compact читает строки исходной базы данных и записывает их в конечную базу данных, тем самым минимизируя объем нерационально используемого пространства в конечной базе данных.
Примечание
Если для конечной базы данных не указано свойство Data Source, метод Compact перезаписывает исходную базу данных новой сжатой базой, которой присваивается то же имя.
При сжатии базы данных выполняются следующие операции.
Заново создается новая база, и для нее создаются индексы.
Страницы таблицы реорганизуются так, чтобы они располагались в соседних страницах базы данных. За счет дефрагментации таблиц в базе данных достигается более рациональное использование места.
Неиспользуемое пространство, возникающее в результате удаления объектов и записей, восстанавливается за счет перезаписи всех данных базы в новые страницы данных. При удалении из базы данных объектов и записей занимаемое ими место помечается как доступное для внесения новых дополнений в базу данных. До тех пор пока вся страница с данными не будет полностью удалена, она считается частично заполненной. Размер базы данных не уменьшится до тех пор, пока из страницы не будут удалены последние данные, либо пока база данных не будет сжата. Базы данных, в которых часто добавляются, удаляются и обновляются объекты и записи, рекомендуется регулярно сжимать.
Возрастающие столбцы удостоверения сбрасываются так, чтобы последующее выделенное значение на один шаг превышало самое большое значение в оставшихся записях. Например, если все записи базы данных удалены, то при сжатии базы данных значению столбца удостоверения следующей записи присваивается начальное значение. Если самое большое оставшееся значение идентификатора базы данных — 50, а значение шага — 5, то при сжатии базы данных для следующей записи устанавливается значение 55. Это произойдет, даже если прежде добавлялись записи со значением больше 50, но до сжатия они были удалены. Значение шага может быть отрицательным. Например, при значении шага, равном –5, и минимальном значении, равном 15, в процессе сжатия базы данных для следующей записи устанавливается значение 10.
Примечание
Это может произойти при использовании исходной окончательной версии среды Visual Studio 2008. В среде Visual Studio 2008 с пакетом обновления 1 (SP1) при сжатии базы данных идентификаторы не изменяются.
Если в строке подключения к конечной базе данных указать значения для идентификатора локали или пароля, эти значения будут использованы при создании конечной базы данных.
Прежде чем сжимать базу данных, убедитесь, что соблюдаются следующие условия.
База данных должна быть закрыта.
При вызове метода Compact из конечной базы данных выходить нельзя. Если база данных, указанная DestConnection, уже существует или существует другой файл с тем же именем, возникнет ошибка.
Должно быть достаточно места для хранения исходной и сжатой базы данных, а также для размещения кэшированных данных и временной базы данных.
Важно!
При использовании метода Compact объем свободного места на устройстве должен по меньшей мере в два раза превышать размер исходной базы данных
Автосжатие
Для сжатия базы данных необходимо создать новую базу данных и скопировать туда все объекты исходной базы данных. Обычно процесс сжатия автоматически не запускается. Процедура автоматического регулирования размера файла базы данных называется AutoShrink. Этот способ практически не использует ресурсы процессора и память, что особенно важно для переносных устройств и предназначенных для них продуктов баз данных. Способ Autoshrink перемещает страницы по файлу так, чтобы все пустые или невыделенные страницы размещались последовательно в конце файла. Затем выполняется усечение пустых страниц, после чего усеченные страницы становятся доступными для файловой системы базы данных. Возвращение усеченных страниц в файловую систему базы данных увеличивает свободное пространство файловой системы.
Для настройки Autoshrink с управляемым кодом воспользуйтесь свойством строки подключения AutoShrink Threshold. В случае с собственным кодом воспользуйтесь свойством DBPROP_SSCE_AUTO_SHRINK_THRESHOLD. Свойство указывает процент свободного места в файле перед запуском Autoshrink.
Примечание
Кроме того, можно сжать базу данных, вызвав метод Shrink. Дополнительные сведения см. в разделе System.Data.SqlServerCe.
Проверка
Файлы базы данных SQL Server Compact разбиты на логические единицы размером по 4 КБ, называемые страницами. При записи каждой страницы в файл базы данных SQL Server Compact вычисляет и сохраняет ее контрольную сумму. Если после записи в файл страница была изменена или повреждена, она уже не соответствует ожидаемой контрольной сумме. Когда SQL Server Compact считывает такую страницу, он возвращает собственную ошибку SSCE_M_DATABASECORRUPTED (25017).
При вызове метода Verify класса SqlCeEngine выполняется пересчет контрольной суммы для каждой страницы файла базы данных с проверкой соответствия контрольных сумм ожидаемым значениям. Если метод возвращает значение true, файл базы данных не поврежден. Если метод возвращает значение false, файл базы данных поврежден и приложение должно вызвать метод Repair.
Восстановление
При повреждении файла базы данных его можно попробовать восстановить методом Repair(System.String,System.Data.SqlServerCe.RepairOption) объекта SqlCeEngine или методом Repair в собственном коде, как описано в разделе Программирование объекта Engine (SQL Server Compact). Метод Repair служит для сканирования базы данных и вычисления контрольных сумм страниц. Если контрольная сумма не совпадает с суммой, вычисленной в момент записи страницы в базу данных, такая страница считается поврежденной. Доступны четыре параметра RepairOption. Дополнительные сведения о том, как действуют эти параметры, см. в разделе Как проверить и исправить базу данных (программным путем).
Примечание
Метод Repair используется, только если SQL Server Compact возвращает собственную ошибку SSCE_M_DATABASECORRUPTED (25017) либо вызов метода Verify объекта SqlCeEngine возвращает значение false.
Автоматическая запись
Если в процессе транзакций в базу данных вносятся изменения, они удерживаются в пуле буферов, пока транзакция не будет зафиксирована или прервана. Если транзакция прерывается, изменения отменяются. Если транзакция фиксируется, ее изменения становятся видимыми другим пользователям и транзакциям, однако, возможно, в базу данных они будут записаны не сразу. В случае непредвиденного завершения программы, например в результате сброса устройства, зафиксированные транзакции, изменения которых не были записаны в базу данных, будут отменены.
Обратите внимание, что транзакции всегда записываются в базу данных в порядке их фиксации. Это означает, что даже в случае потери некоторых транзакций в базе данных всегда соблюдается строгая последовательность. Рассмотрим, к примеру, случай, когда приложение зафиксировало транзакцию А, а затем транзакцию Б. Если в приложении произошел сбой или устройство было сброшено, база данных будет находиться в одном из трех состояний:
Без изменений
Изменена транзакцией А
Изменены А и Б
Запись транзакций в базу данных в порядке их фиксации увеличивает производительность за счет сокращения количества операций записи в файл базы данных. Увеличение производительности особенно заметно, когда за короткий промежуток времени фиксируется много небольших транзакций. В этом случае все транзакции записываются в файл базы данных одновременно вместо того, чтобы вызывать в базе данных отдельную операцию записи.
Отложенные в пул буферов изменения записываются или сбрасываются в базу данных через интервал времени, указанные свойством строки подключения Flush Interval в ADO .NET (свойством DPROP_SSCE_FLUSH_INTERVAL в OLE DB). Эти свойства устанавливают максимальное количество секунд перед записью транзакций на диск.
Примечание
Для транзакций, которые должны быть обязательно зафиксированы в базе данных, приложение может использовать перечисление CommitMode (или свойство DBPROP_SSCE_TRANSACTION_COMMIT_MODE в OLE DB), чтобы переопределить стандартное поведение сброса в момент фиксации. С помощью этих свойств приложение может обеспечить успешное сохранение всех транзакций в базе данных.
Создание резервной копии, восстановление, удаление
Поскольку SQL Server Compact — это система баз данных на основе файлов, с ними можно выполнять многие обычные задачи, связанные с базой данных, например создавать резервные копии, восстанавливать и удалять базу данных с помощью интерфейсов API файловой системы.
Чтобы создать резервную копию базы данных, закройте все соединения с ней и скопируйте файл SDF.
Чтобы удалить базу данных, удалите файл базы данных SDF.