我安装了SQL Server2012,并附加了一个最初由SQL Server2008 R2生成的数据库。
一切似乎都很完美,只有一个问题:合并速度从每秒1000次下降到每秒10次(速度减慢了100倍)。
我猜测这是因为我正在从SQL Server2012访问SQL Server2008 R2数据库。有什么方法可以将数据库转换为SQL Server 2012格式吗?或者还有其他原因可以解释性能下降100倍的原因?
发布于 2012-04-23 06:30:11
请确保将数据库的兼容模式设置为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;发布于 2014-02-17 18:29:38
当我在答案中运行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: '+@ErrMsg
End Catch
Delete From @Tables Where [Schema] = @Schema and [TableName] = @TableName
End发布于 2013-05-08 00:17:36
在分离和附加数据库时,必须更新统计信息。否则,查询规划器将无法生成高效的执行计划,最终导致执行时间过长。这就是我注意到的。
https://stackoverflow.com/questions/10272637
复制相似问题