我安裝了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倍的業績放緩嗎?
我安裝了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