Mantener bases de datos (SQL Server Compact)

La estructura interna de una base de datos de Microsoft SQL Server Compact puede fragmentarse con el tiempo, lo que da lugar a espacio en disco desaprovechado. Si la fragmentación es excesiva, el rendimiento se puede deteriorar. A fin de evitar la fragmentación, utilice las siguientes características para mantener la base de datos de SQL Server Compact.

Para obtener más información sobre cómo utilizar los métodos y propiedades que se describen en este tema, vea System.Data.SqlServerCe.

Compact

El método Compact (el método CompactDatabase en programación nativa) se utiliza para recuperar espacio en el archivo de base de datos. También se puede utilizar para cambiar opciones de base de datos, como la contraseña y el id de configuración regional (LCID).

Los archivos de base de datos de SQL Server Compact están divididos en unidades lógicas de 4 KB conocidas como páginas. Con la modificación continua de una base de datos, algunas páginas pueden contener espacio no utilizado y otras no se utilizan. Al final, el mecanismo AutoShrink recupera las páginas no utilizadas. Para obtener más información, vea la sección "AutoShrink" más adelante en este tema.

El espacio vacío de las páginas solo se puede recuperar con el método Compact. El método Compact lee filas de la base de datos de origen y las escribe en la base de datos de destino, con una cantidad mínima de espacio desaprovechado en la base de datos de destino.

Nota

Si no se especifica la propiedad Data Source para la base de datos de destino, el método Compact sobrescribe la base de datos de origen con la nueva base de datos compactada y tiene el mismo nombre.

Al compactar una base de datos:

  • Se crea una nueva base de datos y nuevos índices.

  • Las páginas de tablas se reorganizan para que residan en páginas contiguas de la base de datos. Esto mejora la asignación de espacio al reducir la fragmentación de las tablas en la base de datos.

  • Para reclamar el espacio sin utilizar creado por la eliminación de objetos y registros, todos los datos de la base de datos se debe volver a escribir en nuevas páginas de datos. Cuando se eliminan objetos o registros en la base de datos, el espacio que ocupaban se marca como disponible para nuevas adiciones a la base de datos. Salvo que se haya eliminado una página de datos completa, la página permanece en un estado parcialmente lleno. La base de datos no se reduce hasta que se eliminan de la página los datos finales o se compacta la base de datos. Para las bases de datos en las que con frecuencia se agregan, eliminan y actualizan objetos y registros, se recomienda compactarlas a menudo.

  • Las columnas de identidad incrementales se restablecen de forma que el siguiente valor asignado será un valor de paso más que el valor más alto de los registros existentes. Por ejemplo, si se han eliminado todos los registros de la base de datos, la compactación de la base de datos establece el valor de la columna de identidad del siguiente registro en el valor de inicialización. Si el valor de identidad restante más alto de la base de datos es 50 y el valor de paso es 5, al compactar la base de datos, se establece el valor del siguiente registro en 55. Esto es aplicable incluso si anteriormente se agregaron registros que contenían valores mayores que 50, pero se eliminaron antes de la compactación. El valor de paso también puede ser negativo, por ejemplo –5, y el valor mínimo es 15. Al compactar la base de datos se establece el valor del siguiente registro en 10.

    Nota

    Este comportamiento se produce cuando se utiliza la versión original de Visual Studio 2008. La compactación de una base de datos no modifica la información de identidad del SP1. de Visual Studio 2008.

  • Si se han especificado valores para el identificador de configuración regional o la contraseña en la cadena de conexión de la base de datos de destino, dichos valores se utilizarán al crear la base de datos de destino.

Antes de compactar una base de datos, asegúrese de que se cumplen las siguientes condiciones:

  • La base de datos debe estar cerrada.

  • La base de datos de destino no debe existir cuando se llama al método Compact. Se produce un error si ya existe la base de datos especificada en DestConnection o existe otro archivo con el mismo nombre.

  • Debe existir suficiente espacio de almacenamiento para las versiones original y compactada de la base de datos, además de los datos de caché y datos almacenados en la base de datos temporal.

Importante

Para utilizar el método Compact, el dispositivo debe tener espacio disponible equivalente como mínimo al doble del tamaño de la base de datos de origen.

Autoshrink

Para compactar una base de datos, se crea una base de datos nueva y, después, se copian todos los objetos de la base de datos de origen en la nueva base de datos. En general, la compactación no se inicia de forma automática. El ajuste automático del tamaño de un archivo de base de datos se denomina AutoShrink. Esta técnica casi no utiliza tiempo de procesador y memoria, lo que la hace especialmente adecuada para los dispositivos de mano y los productos de base de datos móviles. La técnica Autoshrink mueve las páginas de un archivo de forma que todas las páginas vacías o no asignadas se coloquen juntas al final del archivo. Después, las páginas vacías se truncan. A continuación, las páginas truncadas están disponibles para que las utilice el sistema de archivos de base de datos. La devolución de las páginas truncadas al sistema de archivos de base de datos aumenta el espacio del sistema de archivos.

Para establecer Autoshrink, para el código administrado, utilice la propiedad de cadena de conexión AutoShrink Threshold. Para código nativo, utilice la propiedad DBPROP_SSCE_AUTO_SHRINK_THRESHOLD. Con esta propiedad se especifica el porcentaje de espacio disponible del archivo antes de que se inicie Autoshrink.

Nota

También puede reducir una base de datos llamando al método Shrink. Para obtener más información, vea System.Data.SqlServerCe.

Verify

Los archivos de base de datos de SQL Server Compact se dividen en unidades lógicas de 4 KB denominadas páginas. A medida que cada página se escribe en el archivo de base de datos, SQL Server Compact calcula y guarda una suma de comprobación de esa página. Si la página se modifica o se daña después de escribirse en el archivo, ya no coincidirá con la suma de comprobación esperada. Cuando SQL Server Compact lee esta página, devuelve el error nativo SSCE_M_DATABASECORRUPTED (25017).

Si se llama al método Verify de la clase SqlCeEngine, se vuelven a calcular las sumas de comprobación de todas las páginas del archivo de base de datos y se comprueba que las sumas de comprobación coincidan con los valores esperados. Si este método devuelve true, no se han producido daños en el archivo de base de datos. Si este método devuelve false, el archivo de base de datos se ha dañado y la aplicación debe llamar al método Repair.

Repair

Si un archivo de base de datos se daña, puede intentar recuperarlo con el método Repair(System.String,System.Data.SqlServerCe.RepairOption) del objeto SqlCeEngine o el método Repair del Programar el objeto Engine (SQL Server Compact) nativo. El método Repair examina la base de datos y calcula las sumas de comprobación de página. Si una suma de comprobación no coincide con la suma de comprobación calculada previamente cuando se escribió la página en la base de datos, dicha página se considera dañada. Hay cuatro opciones de reparación (RepairOptions) disponibles. Para obtener más información sobre cómo funcionan estas opciones, vea Comprobar y reparar una base de datos (mediante programación)

Nota

El método Repair resulta útil únicamente cuando SQL Server Compact devuelve el error nativo SSCE_M_DATABASECORRUPTED (25017) o cuando una llamada al método Verify del objeto SqlCeEngine devuelve false.

Autoflush

Cuando se producen cambios en una base de datos debido a las transacciones, los cambios se retienen en el grupo de búferes hasta que la transacción se confirma o anula. Si una transacción se anula, los cambios se descartan. Si una transacción se confirma, los cambios serán visibles para los demás usuarios y transacciones, pero puede que no se escriban inmediatamente en la base de datos. Si se produce una finalización anormal del programa, por ejemplo se reinicia el dispositivo, las transacciones que se han confirmado pero cuyos cambios no se han escrito en la base de datos se descartarán.

Tenga en cuenta que las transacciones siempre se escriben en la base de datos en el orden en que se confirman. Eso significa que si bien algunas transacciones se pueden perder, la base de datos siempre es coherente. Por ejemplo, considere el caso en que una aplicación ha confirmado la transacción A y, después, la transacción B. Si la aplicación se bloquea o el dispositivo se reinicia, el estado de la base de datos será uno de los siguientes:

  • Sin cambios

  • Con los cambios de la transacción A

  • Con los cambios de A y B

Al escribir las transacciones en la base de datos en el orden en que se confirman se mejora el rendimiento mediante la reducción del número de veces que se debe escribir el archivo de base de datos. La mejora del rendimiento es especialmente notable cuando se han confirmado muchas transacciones pequeñas en un período de tiempo breve. En ese caso, todas las transacciones se escriben en el archivo de base de datos al mismo tiempo en lugar de que cada transacción genere una operación independiente de escritura en la base de datos.

Los cambios pendientes del grupo de búferes se escriben o vacían en la base de datos a intervalos de tiempo especificados en la propiedad de la cadena de conexión Flush Interval en ADO.NET (propiedad DPROP_SSCE_FLUSH_INTERVAL en OLE DB). Estas propiedades establecen el número máximo de segundos antes de que las transacciones confirmadas se vacíen en el disco.

Nota

Para las transacciones que deben persistir en la base de datos una vez confirmadas, la aplicación puede utilizar la enumeración CommitMode (o la propiedad DBPROP_SSCE_TRANSACTION_COMMIT_MODE en OLE DB) para invalidar el comportamiento predeterminado de vaciado en el momento de la confirmación. Mediante estas propiedades, una aplicación puede garantizar que todas las transacciones producidas en una base de datos persistan correctamente.

Copias de seguridad, restauración y eliminación

Dado que SQL Server Compact es un sistema de base de datos basado en archivos, es posible llevar a cabo muchas tareas comunes de bases de datos, como realizar una copia de seguridad de una base de datos, restaurarla y eliminarla mediante las API del sistema de archivos.

  • Para realizar una copia de seguridad de una base de datos, cierre todas las conexiones a la base de datos y, después, copie el archivo .sdf.

  • Para eliminar una base de datos, elimine el archivo de base de datos .sdf.

Vea también

Referencia

Método CompactDatabase (SQL Server Compact)

Método Repair (SQL Server Compact)