Как преобразовать базу данных 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.
При появлении запроса выберите кнопку "Да", чтобы обновить файл.
Ответ 5
Это на правильном пути:
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