Ядро SSCE было переписано с учетом минимизации риска потери данных и снижения необходимости обслуживания БД. Файл базы данных разбит на логические блоки размером 4Кб, которые называются страницами БД . Со временем, при работе с базой данных, данные удаляются, перемещаются, перестраиваются индексы и т.п. Поэтому образуются пустые страницы не содержащие данных. Для улучшения производительности и уменьшения занимаемого места, неиспользуемое место должно быть освобождено, статистика пересчитана, буфера транзакций сброшены, контрольные суммы страниц обновлены.
Для всего вышесказанного применяют такие методы.
Автоматическое сжатие — AutoShrink .
AutoShrink новая возможность SSCE, которая позволяет автоматически выстраивать страницы БД таким образом, что пустые страницы будут собираться последовательно в конце файла базы данных с их последующим уделением и урезанием файла БД для экономии места. AutoShrink может быть включен указанием параметра AutoShrink Threshold в строке подключения. Задается в процентах доступного свободного места перед началом сжатия (значение по-умолчанию – 60, при значении 100 – автосжатие отключается). Не устанавливайте слишком маленькие значения, чтобы не получить «тормоза» при работе.
Сжатие
Compact — метод ядра, обеспечивающий уменьшение занимаемого файлом БД места также как и изменение некоторых параметров БД – пароля доступа, шифрования или используемого языка локализации. В отличие от AutoShrink , метод Compact не только перестраивает и удаляет неиспользуемые страницы базы, но создает полностью новую БД. При этом:
- Пересоздаются заново все индексы и пересчитывается статистика.
- Страницы БД, содержащие данные таблиц перестраиваются таким образом, что идут последовательно.
- Столбцы со свойством IDENTITY перестраиваются так, чтобы следующий используемый номер стал бы на один шаг больше максимального используемого значения.
- Применяются изменения (если заданы) к паролю, шифрованию, локали новой базы данных.
Пример:
// исходная база данных
string sourceDB = “test.sdf”;
// сжатая база данных
string destDB = “newdb.sdf”;
SqlCeEngine engine = new SqlCeEngine(@“Data Source = “ + sourceDB);
try {
// производим сжатие нашей базы в новую
// также существует перегруженный метод ядра Compact() без параметров,
// при вызове которого исходная БД перезапишется сжатой версией автоматически.
// Но его нужно использовать с осторожностью
engine.Compact(@“Data Source = “ + destDB);
engine.Dispose();
}
catch { }
finally { engine.Dispose(); }
Починка поврежденной базы данных
Проверка
Verify – метод ядра базы данных, который позволяет проверить ее на предмет целостности. Verify пересчитывает контрольные суммы страниц БД и сравнивает их с сохраненными значениями. Если проверка оканчивается неудачей, метод возвращает false , что означает необходимость выполнения починки базы.
Починка
Ядро SQL Server Compact Edition разработано с учетом повышенных требований к целостности данных, ведь при работе с БД может произойти отключение питания или зависание операционной системы, а при работе с мобильным устройством пользователь может удалить карту памяти с хранящейся на ней базой прямо во время записи. Поэтому, рекомендуется периодически производить проверку БД (Verify) и при возникновении неполадок — чинить ее (Repair).
Если при проверке возникли ошибки, метод Repair позволяет попытаться исправить поврежденные данные. Разработчики SSCE предоставили два параметра этого метода используемых при проверке:
RepairOption.DeleteCorruptedRows — удаляет все поврежденные строки из БД.
RepairOption.RecoverCorruptedRows – попытается прочитать данные из поврежденной страницы. Но, даже если данные с поврежденной страницы успешно прочитаны, нужно иметь ввиду, что это не гарантирует логическую целостность базы данных.
Следующий пример иллюстрирует использование методов проверки и починки БД. Для эффективного использования представленных методов рекомендуется периодически запускать их во время планового обслуживания БД.
// закрываем соединение с БД
Сonnection.Close();
SqlCeEngine engine = new SqlCeEngine(@"Data Source = test.sdf");
if ( !engine.Verify() ) { // имеются ошибки при проверке
//попытаемся восстановить
engine.Repair(null, RepairOption.RecoverCorruptedRows);
if ( !engine.Verify() ) { //все еще имеются ошибки
//удаляем поврежденные страницы
engine.Repair(null, RepairOption.DeleteCorruptedRows);
}
}
else {
MessageBox.Show(“База данных в порядке!”);
}
Connection.Open();

Обслуживание SQL Server Compact Edition
