Как преобразовать базу данных SQL Server 2008 R2 в SQL Server 2012?

Я установил SQL Server 2012 и приложил базу данных, первоначально созданную SQL Server 2008 R2.

Все, казалось, работало отлично, с одной проблемой: слияния упали с 1000 в секунду до 10 в секунду (100-кратное замедление).

Я предполагаю, что это потому, что я обращаюсь к базе данных SQL Server 2008 R2 из SQL Server 2012. Есть ли способ конвертировать базу данных в формат SQL Server 2012? Или есть что-то еще, что происходит, что может объяснить 100-кратное замедление производительности?

Ответ 1

Пожалуйста, убедитесь, что вы установили режим совместимости базы данных на 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;

Ответ 2

Когда я запустил 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: '[email protected]
    End Catch

    Delete From @Tables Where [Schema] = @Schema and [TableName] = @TableName 
End

Ответ 3

Обновление статистики необходимо при отсоединении и прикреплении базы данных. В противном случае планировщик запросов не может создать эффективный план выполнения и завершить с длительным временем выполнения. Это то, что я заметил.

Ответ 4

Чтобы обновить файл базы данных, чтобы использовать LocalDB:

1. В проводнике сервера выберите кнопку "Подключиться к базе данных".

2. В диалоговом окне "Добавить соединение" укажите следующую информацию:

Источник данных: Microsoft SQL Server (SqlClient)

Имя сервера: (LocalDB)\v11.0

Прикрепить файл базы данных: Путь, где путь - это физический путь к основному файлу .mdf.

Логическое имя: имя, где Name - это имя, которое вы хотите использовать с файлом.

Выберите кнопку OK.

При появлении запроса выберите кнопку "Да", чтобы обновить файл.