2012-04-22 186 views
10

我安装了SQL Server 2012,并附加了最初由SQL Server 2008 R2生成的数据库。如何将SQL Server 2008 R2数据库转换为SQL Server 2012?

一切似乎都完美地工作,有一个问题:合并从每秒1000下降到每秒10(100倍放缓)。

我在猜测它是因为我正在从SQL Server 2012访问SQL Server 2008 R2数据库。有什么方法可以将数据库转换为SQL Server 2012格式?或者还有其他的事情可以解释100倍的业绩放缓吗?

+0

我还应该补充一点,我的数据库使用水平分区,所以我需要一些能够保留原始数据库所有好的功能。 – Contango 2012-04-22 22:25:59

回答

18

请确保您设置数据库的兼容模式为110,和更新的统计数据。

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

您可以使用'EXEC sp_MSforeachtable'UPDATE STATISTICS以更紧凑的方式执行此操作吗? WITH FULLSCAN'' – 2014-02-25 16:44:29

+5

@TsahiAsher该方法不是非常安全,不仅仅因为未公开的,不支持的过程与sp_MSforeachdb([已知中断]共享代码)(http://www.mssqltips.com/sqlservertip/2201/making -a-more-reliable-and-flexible-spmsforeachdb /)),但也因为你可以在不同的模式中有多个具有相同名称的表。我的代码还可以让您轻松添加过滤条件,例如只有具有特定命名约定或特定模式的表。 – 2014-02-25 16:49:59

+0

您也可以运行Ola Hallengren的一套漂亮的实用程序(https://ola.hallengren.com/)来更新统计信息,因为无论如何您都应该定期进行此操作。 – DaveN59 2014-09-26 16:37:54

-4

这是在正确的轨道上:

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

我认为你已经完成了这一步,不是吗?为什么这是一个答案,而不是问题的一部分? – 2012-04-22 22:29:13

1

当您分离并附加数据库时,必须更新Stats。否则,查询规划器不能生成高效的执行计划,并且执行时间很长。这是我注意到的。

0

升级数据库文件中使用的LocalDB:

1.In服务器资源管理器,选择连接到数据库按钮。

2.In添加连接对话框,指定下列信息:

数据来源:Microsoft SQL Server的程序(SqlClient)

服务器名称:(的LocalDB)\ 11.0

连接一个数据库文件:Path,其中Path是主.mdf文件的物理路径。

逻辑名称:Name,其中Name是要与文件一起使用的名称。

选择确定按钮。

提示时,选择是按钮升级文件。

2

当我在答案中运行SQL时,nvarchar溢出。问题是当你的数据库有太多的表时,对于一个nvarchar来说SQL太长了。我的数据库有足够的表来溢出一个varchar(两倍于nvarchar)。所以我编辑了SQL循环遍历每个表并执行单独的语句。这样你就不会错过更新任何表的统计信息。

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

我觉得你很困惑。你是如何溢出nvarchar(max)的?你的字符串真的超过十亿个字符吗?或者你是否认为,因为PRINT只显示了一部分命令,它不是全部? – 2014-02-17 11:23:42

+0

是不是nvarchar(最大)4000的限制?或者是SP_ExecuteSql上的参数限制?如果是这样,我想只是一个执行会做这项工作 – 2014-02-17 11:50:33

+1

不...并且不... – 2014-02-17 12:28:15

相关问题