2012-04-22 9 views
10

Tôi đã cài đặt SQL Server 2012 và đính kèm một cơ sở dữ liệu ban đầu được tạo bởi SQL Server 2008 R2.Làm thế nào để chuyển đổi cơ sở dữ liệu SQL Server 2008 R2 sang SQL Server 2012?

Mọi thứ dường như hoạt động hoàn hảo, với một vấn đề: hợp nhất bị giảm từ 1000 mỗi giây xuống 10 mỗi giây (sự sụt giảm 100x).

Tôi phỏng đoán rằng nó vì tôi đang truy nhập cơ sở dữ liệu SQL Server 2008 R2 từ SQL Server 2012. Có cách nào để chuyển đổi cơ sở dữ liệu sang định dạng SQL Server 2012 không? Hoặc có cái gì khác thats xảy ra mà có thể giải thích sự chậm lại 100x trong hiệu suất?

+0

Tôi cũng nên thêm rằng cơ sở dữ liệu của tôi sử dụng phân vùng theo chiều ngang, vì vậy tôi cần thứ gì đó sẽ bảo toàn tất cả các tính năng đẹp của cơ sở dữ liệu gốc. – Contango

Trả lời

18

Hãy chắc chắn rằng bạn thiết lập các chế độ tương thích của cơ sở dữ liệu đến 110, và thống kê cập nhật.

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

bạn có thể làm điều đó một cách gọn gàng hơn với 'EXEC sp_MSforeachtable' STATISTICS UPDATE? VỚI FULLSCAN'' –

+5

@TsahiAsher rằng phương pháp đó không phải là rất an toàn, không chỉ vì đó không có giấy tờ, không được hỗ trợ thủ tục mã cổ phiếu với sp_MSforeachdb ([được biết đến để phá vỡ] (http://www.mssqltips.com/sqlservertip/2201/making -a-more-trusted-and-flexible-spmsforeachdb /)), nhưng cũng bởi vì bạn có thể có nhiều bảng có cùng tên trong các lược đồ khác nhau.Mã của tôi cũng cho phép bạn dễ dàng thêm tiêu chí lọc, chẳng hạn như chỉ các bảng có quy ước đặt tên nhất định hoặc trong một lược đồ cụ thể. –

+0

Bạn cũng có thể chạy các tiện ích tiện lợi của Ola Hallengren (https://ola.hallengren.com/) để cập nhật số liệu thống kê, vì bạn nên làm điều này một cách thường xuyên. – DaveN59

-4

Đây có phải là đi đúng hướng:

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

Tôi nghĩ bạn đã thực hiện bước này, phải không? Tại sao đây lại là câu trả lời thay vì một phần của câu hỏi? –

1

Cập nhật Thống kê là phải khi bạn tháo và đính kèm cơ sở dữ liệu. Nếu không, trình hoạch định truy vấn không thể tạo kế hoạch thực hiện hiệu quả và kết thúc với thời gian thực hiện dài. Đây là những gì tôi nhận thấy.

0

Để nâng cấp tệp cơ sở dữ liệu để sử dụng LocalDB:

1.Trong Server Explorer, hãy chọn nút Kết nối với cơ sở dữ liệu.

2.In Add kết nối hộp thoại, chỉ rõ các thông tin sau:

Nguồn dữ liệu: Microsoft SQL Server (SqlClient)

Server Name: (LocalDB) \ v11.0

Đính kèm tệp cơ sở dữ liệu: Đường dẫn, trong đó Đường dẫn là đường dẫn vật lý của tệp .mdf chính.

Tên hợp lý: Tên, trong đó Tên là tên mà bạn muốn sử dụng với tệp.

Chọn nút OK.

Khi được nhắc, hãy chọn nút Có để nâng cấp tệp.

2

Khi tôi chạy SQL trong câu trả lời, nvarchar bị tràn. Vấn đề là khi cơ sở dữ liệu của bạn có quá nhiều bảng SQL quá dài đối với một nvarchar. Cơ sở dữ liệu của tôi đã có đủ bảng để tràn một varchar (gấp đôi miễn là một nvarchar). Vì vậy, tôi đã chỉnh sửa SQL để lặp qua từng bảng và thực hiện các câu lệnh riêng biệt. Bằng cách này bạn sẽ không bỏ lỡ việc cập nhật số liệu thống kê trên bất kỳ bảng nào của bạn.

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

Tôi nghĩ bạn đang bối rối. Làm thế nào bạn tràn một nvarchar (tối đa)? Chuỗi của bạn có thực sự hơn một tỷ ký tự không? Hay bạn cho rằng vì PRINT chỉ cho thấy một phần của lệnh, nó không phải là tất cả? –

+0

không phải là giới hạn của một nvarchar (tối đa) 4000? Hoặc là giới hạn param trên SP_ExecuteSql? Nếu vậy tôi đoán chỉ là một Exec sẽ làm công việc –

+1

Không ... và không ... –