【问题标题】:How to convert SQL Server 2008 R2 database to SQL Server 2012?如何将 SQL Server 2008 R2 数据库转换为 SQL Server 2012?
【发布时间】:2012-04-22 22:22:15
【问题描述】:

我安装了 SQL Server 2012,并附加了一个最初由 SQL Server 2008 R2 生成的数据库。

一切似乎都很完美,但有一个问题:合并从每秒 1000 次下降到每秒 10 次(减速 100 倍)。

我推测这是因为我正在从 SQL Server 2012 访问 SQL Server 2008 R2 数据库。有没有办法将数据库转换为 SQL Server 2012 格式?还是有其他原因可以解释性能下降 100 倍?

【问题讨论】:

  • 我还应该补充一点,我的数据库使用水平分区,所以我需要一些能够保留原始数据库所有优点的东西。

标签: sql-server-2008-r2 sql-server-2012


【解决方案1】:

请确保您将数据库的兼容模式设置为 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'以更紧凑的方式进行操作
  • @TsahiAsher 该方法不是很安全,不仅因为该未记录的、不受支持的过程与 sp_MSforeachdb (which is known to break) 共享代码,还因为您可以在不同的架构中拥有多个同名的表.我的代码还允许您非常轻松地添加过滤条件,例如仅具有特定命名约定或特定模式的表。
  • 您还可以运行 Ola Hallengren 的一组漂亮实用程序 (ola.hallengren.com) 来更新统计信息,因为无论如何您都应该定期执行此操作。
【解决方案2】:

当我在答案中运行 SQL 时,nvarchar 溢出。问题是当您的数据库有太多表时,SQL 对于 nvarchar 来说太长了。我的数据库有足够的表来溢出 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: '+@ErrMsg
    End Catch

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

【讨论】:

  • 我觉得你很困惑。你是如何溢出 nvarchar(max) 的?你的字符串真的超过十亿个字符吗?或者您是否认为因为 PRINT 只显示了命令的一部分,所以它并不全部存在?
  • 不是 nvarchar(max) 4000 的限制吗?或者是 SP_ExecuteSql 的参数限制?如果是这样,我想只有一个 Exec 就可以完成这项工作
【解决方案3】:

在分离和附加数据库时必须更新统计信息。否则查询计划器无法生成有效的执行计划,最终执行时间长。这是我注意到的。

【讨论】:

    【解决方案4】:

    升级数据库文件以使用 LocalDB:

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

    2.在添加连接对话框中,指定以下信息:

    数据源:Microsoft SQL Server (SqlClient)

    服务器名称:(LocalDB)\v11.0

    附加数据库文件:Path,其中 Path 是主 .mdf 文件的物理路径。

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

    选择确定按钮。

    出现提示时,选择“是”按钮升级文件。

    【讨论】:

      【解决方案5】:

      这是在正确的轨道上吗:

      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
      

      【讨论】:

      • 我想你已经完成了这一步,不是吗?为什么这是一个答案而不是问题的一部分?
      猜你喜欢
      • 2013-11-19
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-09-24
      • 1970-01-01
      • 2015-01-18
      相关资源
      最近更新 更多