2012-04-22 188 views
10

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

+0

我還應該補充一點,我的數據庫使用水平分區,所以我需要一些能夠保留原始數據庫所有好的功能。 – Contango 2012-04-22 22:25:59

回答

18

請確保您設置數據庫的兼容模式爲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; 
+0

您可以使用'EXEC sp_MSforeachtable'UPDATE STATISTICS以更緊湊的方式執行此操作嗎? WITH FULLSCAN'' – 2014-02-25 16:44:29

+5

@TsahiAsher該方法不是非常安全,不僅僅因爲未公開的,不支持的過程與sp_MSforeachdb([已知中斷]共享代碼)(http://www.mssqltips.com/sqlservertip/2201/making -a-more-reliable-and-flexible-spmsforeachdb /)),但也因爲你可以在不同的模式中有多個具有相同名稱的表。我的代碼還可以讓您輕鬆添加過濾條件,例如只有具有特定命名約定或特定模式的表。 – 2014-02-25 16:49:59

+0

您也可以運行Ola Hallengren的一套漂亮的實用程序(https://ola.hallengren.com/)來更新統計信息,因爲無論如何您都應該定期進行此操作。 – DaveN59 2014-09-26 16:37:54

-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 
+1

我認爲你已經完成了這一步,不是嗎?爲什麼這是一個答案,而不是問題的一部分? – 2012-04-22 22:29:13

1

當您分離並附加數據庫時,必須更新Stats。否則,查詢規劃器不能生成高效的執行計劃,並且執行時間很長。這是我注意到的。

0

升級數據庫文件中使用的LocalDB:

1.In服務器資源管理器,選擇連接到數據庫按鈕。

2.In添加連接對話框,指定下列信息:

數據來源:Microsoft SQL Server的程序(SqlClient)

服務器名稱:(的LocalDB)\ 11.0

連接一個數據庫文件:Path,其中Path是主.mdf文件的物理路徑。

邏輯名稱:Name,其中Name是要與文件一起使用的名稱。

選擇確定按鈕。

提示時,選擇是按鈕升級文件。

2

當我在答案中運行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 
+1

我覺得你很困惑。你是如何溢出nvarchar(max)的?你的字符串真的超過十億個字符嗎?或者你是否認爲,因爲PRINT只顯示了一部分命令,它不是全部? – 2014-02-17 11:23:42

+0

是不是nvarchar(最大)4000的限制?或者是SP_ExecuteSql上的參數限制?如果是這樣,我想只是一個執行會做這項工作 – 2014-02-17 11:50:33

+1

不...並且不... – 2014-02-17 12:28:15

相關問題