2012-04-22 19 views
10

Instalé SQL Server 2012 y adjunté una base de datos generada originalmente por SQL Server 2008 R2.¿Cómo convertir la base de datos de SQL Server 2008 R2 a SQL Server 2012?

Todo parecía funcionar perfectamente, con un problema: las fusiones se redujeron de 1000 por segundo a 10 por segundo (una ralentización de 100x).

Supongo que es porque estoy accediendo a una base de datos de SQL Server 2008 R2 desde SQL Server 2012. ¿Hay alguna manera de convertir la base de datos al formato de SQL Server 2012? ¿O hay algo más que está sucediendo que podría explicar la desaceleración de 100 veces en el rendimiento?

+0

Debo agregar que mi base de datos usa particiones horizontales, por lo que necesito algo que preserve todas las características agradables de la base de datos original. – Contango

Respuesta

18

Por favor asegúrese de que se establece el modo de compatibilidad de la base de datos a 110, y las estadísticas de actualización.

ALTER DATABASE MyDatabase SET COMPATIBILITY_LEVEL = 110; 

DECLARE @sql NVARCHAR(MAX) = N''; 

SELECT @sql += CHAR(13) + CHAR(10) + 'UPDATE STATISTICS ' 
    + QUOTENAME(SCHEMA_NAME(schema_id)) 
    + '.' + QUOTENAME(name) + ' WITH FULLSCAN;' 
    FROM sys.tables; 

PRINT @sql; 
--EXEC sp_executesql @sql; 
+0

puede hacerlo de una forma más compacta con 'EXEC sp_MSforeachtable 'UPDATE STATISTICS? CON FULLSCAN'' –

+5

@TsahiAsher ese método no es muy seguro, no solo porque ese procedimiento no documentado y sin soporte comparte código con sp_MSforeachdb ([que se sabe que se rompe] (http://www.mssqltips.com/sqlservertip/2201/making) -a-more-reliable-and-flexible-spmsforeachdb /)), pero también porque podría tener varias tablas con el mismo nombre en diferentes esquemas.Mi código también le permite agregar fácilmente criterios de filtro, como solo tablas con una determinada convención de nomenclatura o en un esquema específico. –

+0

También podría ejecutar el ingenioso conjunto de utilidades de Ola Hallengren (https://ola.hallengren.com/) para actualizar las estadísticas, ya que de todos modos debería hacer esto regularmente. – DaveN59

-4

¿Es esta en el camino correcto:

http://msdn.microsoft.com/en-us/library/ms189625.aspx

USE master; 
GO 
CREATE DATABASE MyDatabase 
    ON (FILENAME = 'C:\MySQLServer\MyDatabase.mdf'), 
    (FILENAME = 'C:\MySQLServer\Database.ldf') 
    FOR ATTACH; 
GO 
+1

Creo que ya has hecho este paso, ¿no? ¿Por qué es esto una respuesta en lugar de una parte de la pregunta? –

1

La actualización de las estadísticas es obligatoria cuando se desconecta y se adjunta la base de datos. De lo contrario, el planificador de consultas no puede generar un plan de ejecución eficiente y un final con un tiempo de ejecución largo. Esto es lo que noté.

0

para actualizar un archivo de base de utilizar LocalDB:

1.In el Explorador de servidores, elija el botón Conectar a la base de datos.

2.In el cuadro de diálogo Agregar conexión, especifique la siguiente información:

Fuente de datos: Microsoft SQL Server (SqlClient)

Nombre del servidor: (LocalDB) \ v11.0

Adjuntar un archivo de base de datos: Ruta, donde Ruta es la ruta física del archivo .mdf principal.

Nombre lógico: Nombre, donde Nombre es el nombre que desea usar con el archivo.

Elija el botón Aceptar.

Cuando se le solicite, elija el botón Sí para actualizar el archivo.

2

Cuando ejecuté el SQL en la respuesta, el nvarchar se desbordó. El problema es cuando su base de datos tiene demasiadas tablas, el SQL es demasiado largo para un nvarchar. Mi base de datos tenía suficientes tablas para desbordar un varchar (dos veces más largo que un nvarchar). Así que edité el SQL para recorrer cada tabla y ejecutar instrucciones por separado. De esta forma, no perderás la actualización de las estadísticas en ninguna de tus mesas.

ALTER DATABASE MyDatabase SET COMPATIBILITY_LEVEL = 110; 

DECLARE @SQL NVARCHAR(MAX) = N''; 

Declare @Tables table 
([Schema] nvarchar(50) 
,[TableName] nvarchar(100)) 

Insert into @Tables 
Select QUOTENAME(SCHEMA_NAME(schema_id)),QUOTENAME(name) 
FROM sys.tables; 

Declare @Schema nvarchar(50), @TableName nvarchar(100) 

While Exists(Select * From @Tables) 
Begin 
    Select Top 1 @Schema = [Schema], @TableName = [TableName] From @Tables 
    Set @SQL = 'UPDATE STATISTICS ' + @Schema + '.' + @TableName + ' WITH FULLSCAN;' 

    Begin Try 
     EXEC SP_ExecuteSql @SQLToExecute = @SQL 
     Print 'Completed: ' + @SQL 
    End Try 
    Begin Catch 
     DECLARE @ErrMsg nvarchar(4000) 
     SELECT @ErrMsg = SubString(ERROR_MESSAGE(),0,900) 

     Select GetDate(), 'Failed updating stats on ' + @Schema + ' ' + @TableName + '. Error: '[email protected] 
    End Catch 

    Delete From @Tables Where [Schema] = @Schema and [TableName] = @TableName 
End 
+1

Creo que estás confundido. ¿Cómo desbordó un nvarchar (máximo)? ¿Tu cadena realmente tenía más de mil millones de caracteres? ¿O supusiste que debido a que PRINT mostraba solo una parte del comando, no estaba todo allí? –

+0

no es el límite de un nvarchar (max) 4000? ¿O es ese el límite de param en SP_ExecuteSql? Si es así, supongo que solo un ejecutivo haría el trabajo –

+1

No ... y no ... –

Cuestiones relacionadas