2012-04-22 16 views
10

SQL Server 2012をインストールし、元々SQL Server 2008 R2によって生成されたデータベースを添付しました。SQL Server 2008 R2データベースをSQL Server 2012に変換する方法はありますか?

マージは1秒あたり1000から1秒あたり10回(100倍の減速)に減少しました。

私はSQL Server 2012からSQL Server 2008 R2データベースにアクセスしているため、そのことを推測しています.SQL Server 2012形式にデータベースを変換する方法はありますか?それとも100倍のパフォーマンスの低下を説明してくれることがありますか?

+0

私のデータベースは水平パーティショニングを使用しているため、元のデータベースのすてきな機能をすべて保持する必要があります。 – Contango

答えて

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'' –

+5

@TsahiAsherその方法はあまり安全ではありません。なぜなら、文書化されていないサポートされていないプロシージャがsp_MSforeachdbとコードを共有しているだけではないからです([破損することが知られています](http://www.mssqltips.com/sqlservertip/2201/making -a-more-reliable-and-flexible-spmsforeachdb /))、異なるスキーマで同じ名前の複数の表を持つことができるためです。私のコードでは、特定の命名規則を持つテーブルや特定のスキーマなど、フィルタ条件を非常に簡単に追加することもできます。 –

+0

また、Ola Hallengrenの便利なユーティリティ(https://ola.hallengren.com/)を実行して統計を更新することもできます。これは、定期的にこれを行う必要があるためです。 – DaveN59

-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

私はすでにこのステップを済ませたと思いますか?これはなぜ質問の一部ではなく答えですか? –

1

データベースをデタッチして添付するときは、統計情報を更新する必要があります。そうしないと、クエリプランナは効率的な実行計画を生成できず、実行時間が長いため終了しません。これは私が気づいたものです。

1.Inサーバーエクスプローラ、データベースのボタンに接続]を選択します:LocalDBを使用するデータベース・ファイルをアップグレードするには

0

データソース:Microsoft SQL Serverの(のSqlClient)

サーバー名:(LocalDB)を取り付け

v11.0 \ [接続の追加]ダイアログボックス2.In

は、以下の情報を指定しますデータベースファイル:Path。Pathは、プライマリ.mdfファイルの物理パスです。

論理名:名前。Nameは、ファイルで使用する名前です。

[OK]をクリックします。

メッセージが表示されたら、[はい]ボタンを選択してファイルをアップグレードします。

2

答えでSQLを実行すると、nvarcharがオーバーフローしました。問題は、データベースにSQLが長すぎてnvarcharに長すぎるテーブルがある場合です。私のデータベースにはvarchar(nvarcharの2倍の長さ)をオーバーフローさせるのに十分なテーブルがありました。そこで、各テーブルをループして別々のステートメントを実行するように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)をオーバーフローしましたか?あなたの文字列は本当に10億文字以上でしたか?あるいは、PRINTがコマンドの一部しか示していなかったので、それはすべてではないと思いましたか? –

+0

はnvarchar(max)4000の制限ではありませんか?それとも、SP_ExecuteSqlのparam制限ですか?もしそうなら、私はエグゼクティブが仕事をするだろうと思う。 –

+1

いいえ...いいえ... –

関連する問題