10

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

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

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

4

5 回答 5

19

请确保您将数据库的兼容模式设置为 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;
于 2012-04-22T22:30:10.707 回答
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
于 2014-02-17T10:29:38.023 回答
1

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

于 2013-05-07T16:17:36.247 回答
0

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

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

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

数据源:Microsoft SQL Server (SqlClient)

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

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

逻辑名称:名称,其中名称是要用于文件的名称。

选择确定按钮。

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

于 2013-10-16T18:27:13.990 回答
-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
于 2012-04-22T22:25:16.093 回答