我安装了 SQL Server 2012,并附加了一个最初由 SQL Server 2008 R2 生成的数据库。
一切似乎都很完美,但有一个问题:合并从每秒 1000 次下降到每秒 10 次(减速 100 倍)。
我推测这是因为我正在从 SQL Server 2012 访问 SQL Server 2008 R2 数据库。有没有办法将数据库转换为 SQL Server 2012 格式?或者是否还有其他事情可以解释性能下降 100 倍?
我安装了 SQL Server 2012,并附加了一个最初由 SQL Server 2008 R2 生成的数据库。
一切似乎都很完美,但有一个问题:合并从每秒 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;
当我在答案中运行 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
分离和附加数据库时必须更新统计信息。否则查询计划器无法生成有效的执行计划,并最终导致执行时间长。这是我注意到的。
升级数据库文件以使用 LocalDB:
1.在服务器资源管理器中,选择连接到数据库按钮。
2.在添加连接对话框中,指定以下信息:
数据源:Microsoft SQL Server (SqlClient)
服务器名称:(LocalDB)\v11.0
附加数据库文件:Path,其中 Path 是主 .mdf 文件的物理路径。
逻辑名称:名称,其中名称是要用于文件的名称。
选择确定按钮。
出现提示时,选择是按钮升级文件。
这是在正确的轨道上:
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