如何将SQL Server 2008 R2数据库转换为SQL Server 2012?
我安装了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倍的业绩放缓吗?
请确保您设置数据库的兼容模式为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;
您可以使用'EXEC sp_MSforeachtable'UPDATE STATISTICS以更紧凑的方式执行此操作吗? WITH FULLSCAN'' – 2014-02-25 16:44:29
@TsahiAsher该方法不是非常安全,不仅仅因为未公开的,不支持的过程与sp_MSforeachdb([已知中断]共享代码)(http://www.mssqltips.com/sqlservertip/2201/making -a-more-reliable-and-flexible-spmsforeachdb /)),但也因为你可以在不同的模式中有多个具有相同名称的表。我的代码还可以让您轻松添加过滤条件,例如只有具有特定命名约定或特定模式的表。 – 2014-02-25 16:49:59
您也可以运行Ola Hallengren的一套漂亮的实用程序(https://ola.hallengren.com/)来更新统计信息,因为无论如何您都应该定期进行此操作。 – DaveN59 2014-09-26 16:37:54
这是在正确的轨道上:
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
我认为你已经完成了这一步,不是吗?为什么这是一个答案,而不是问题的一部分? – 2012-04-22 22:29:13
当您分离并附加数据库时,必须更新Stats。否则,查询规划器不能生成高效的执行计划,并且执行时间很长。这是我注意到的。
升级数据库文件中使用的LocalDB:
1.In服务器资源管理器,选择连接到数据库按钮。
2.In添加连接对话框,指定下列信息:
数据来源:Microsoft SQL Server的程序(SqlClient)
服务器名称:(的LocalDB)\ 11.0
连接一个数据库文件:Path,其中Path是主.mdf文件的物理路径。
逻辑名称:Name,其中Name是要与文件一起使用的名称。
选择确定按钮。
提示时,选择是按钮升级文件。
当我在答案中运行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
我觉得你很困惑。你是如何溢出nvarchar(max)的?你的字符串真的超过十亿个字符吗?或者你是否认为,因为PRINT只显示了一部分命令,它不是全部? – 2014-02-17 11:23:42
是不是nvarchar(最大)4000的限制?或者是SP_ExecuteSql上的参数限制?如果是这样,我想只是一个执行会做这项工作 – 2014-02-17 11:50:33
不...并且不... – 2014-02-17 12:28:15
我还应该补充一点,我的数据库使用水平分区,所以我需要一些能够保留原始数据库所有好的功能。 – Contango 2012-04-22 22:25:59