2009-02-21 28 views
14

Tôi sử dụng SQL Server 2005 làm kho dữ liệu cho nhiều dữ liệu tôi thực hiện công việc phân tích. Đây không phải là một cơ sở dữ liệu giao dịch vì tôi không nhấn nó với các bản cập nhật hoặc thu thập dữ liệu thời gian thực. Tôi nhận được một vài hợp đồng biểu diễn dữ liệu từ khách hàng của tôi, tải chúng vào SQL Server và thực hiện một loạt các thao tác. Sau đó tôi lấy các bit của dữ liệu này và kéo chúng vào R nơi tôi làm hầu hết các phân tích của tôi. Tôi sau đó đẩy một ít dữ liệu vào các bảng trong SQL Server và có thể làm một hoặc hai tham gia.Làm cho SQL Server nhanh hơn trong thao tác dữ liệu - tắt ghi nhật ký giao dịch?

Tôi có một heck của một thời gian với các bản ghi trong SQL Server nhận được lớn và tôi giả sử phải mất một số mức phí trên không để tạo ra những. Làm thế nào tôi có thể cấu hình SQL Server để nó chạy với rất ít hoặc không có đăng nhập? Nếu mọi thứ trở nên hư hỏng, tôi rất vui khi mới bắt đầu ngay từ đầu. Bất kỳ ý tưởng làm thế nào để làm cho tất cả điều này nhanh hơn?

BTW, không cần phải cho tôi biết cách thu nhỏ nhật ký, tôi đã làm điều đó. Nhưng tôi ước tôi không phải làm cho các bản ghi ở nơi đầu tiên. Tôi chỉ sử dụng DB để chứa dữ liệu vì nó quá lớn để vừa với bộ nhớ trong R.

Tôi có nên sử dụng DB đơn giản hơn Sql Server không? Hãy cho tôi biết tôi đang giết một con kiến ​​với một cái búa tạ. Nhưng hãy giới thiệu một cái búa có kích thước thích hợp hơn. :)

+0

Tại sao bạn muốn trở thành hạn chế với co các tập tin cơ sở dữ liệu: http://www.karaszi.com/SQLServer/info_dont_shrink.asp – JohnB

Trả lời

9

Tôi làm cách nào để định cấu hình máy chủ SQL để chạy với ít hoặc không có nhật ký? Tôi

Tôi không tin rằng bạn có thể.

Tuy nhiên nếu bạn định cấu hình cơ sở dữ liệu (mỗi cơ sở dữ liệu trên máy chủ có thể khác nhau) để sao lưu đơn giản, tệp nhật ký sẽ không phát triển cho đến khi bạn sao lưu. Điều này được thực hiện bằng cách đặt chế độ khôi phục thành "đơn giản".

Với bản sao lưu đơn giản, nhật ký chỉ được sử dụng để giữ trạng thái giao dịch cho đến khi chúng được ghi đầy đủ vào cơ sở dữ liệu chính.

+0

Đó có thể là những gì tôi cần phải làm. Cảm ơn phản ứng rất nhanh. –

5

Bạn có thể giảm thiểu mức tiêu thụ nhật ký trong máy chủ SQL bằng cách thay đổi mô hình khôi phục cơ sở dữ liệu để đơn giản thấy điều này link. Vì bạn không giao dịch với đồng thời và các giao dịch bạn đã xem là Microsoft Access?

+0

Tôi chuyển sang SQL Server vì tôi thường xuyên đập đầu vào giới hạn 2 GB trong Access. Tôi gần như hỏi câu hỏi này trong các hình thức "làm thế nào tôi có thể nhận được SQL Server để hành động giống như truy cập" nhưng tôi sợ tôi sẽ nhận được rất nhiều BS về cách truy cập sucks, yada yada. Tôi chỉ cần một cửa hàng dữ liệu tốt! –

+0

Bạn có thể chia dữ liệu của mình thành nhiều tệp cơ sở dữ liệu Access không? Các ngữ nghĩa bảng được liên kết trong Access sẽ làm cho nó rất dễ dàng và hợp lý để thiết lập một tệp chính đề cập đến một số tệp dữ liệu Access con. – James

+1

Ý tưởng hay, nhưng chứa nhiều bảng Truy cập sẽ là tổng số kludge có thể cản trở việc phân tích. Có điều này trong SQL Server cũng cho phép tôi đẩy các truy vấn đắt tiền đến một máy chủ mạnh mẽ hơn. Truy cập sẽ yêu cầu tôi thực hiện các truy vấn đó trên máy khách. –

2

để giảm thiểu quá trình ghi nhật ký sử dụng mô hình khôi phục đơn giản và thực hiện công việc theo lô.

+0

Tôi đã đọc lại những câu trả lời này và đề cập đến các lô bắt mắt của tôi. Bạn có thể cung cấp cho tôi cái nhìn sâu sắc hơn về những gì bạn có nghĩa là bằng cách làm những việc theo lô? Nếu tôi làm một kịch bản dài với 30 bước thì khác với chạy 30 tập lệnh? Cảm ơn bạn đã giúp đỡ. –

+0

theo lô tôi có nghĩa là ví dụ nếu bạn phải cập nhật/xóa 50.000 hàng làm điều đó theo lô 1000. và mỗi lô trong giao dịch của riêng nó. bạn có thể làm điều này với một vòng lặp while. cho chèn sử dụng khả năng chèn hàng loạt. –

+1

trong thế giới thực, ít nhất là trong Oracle (ouch!), Nó luôn luôn nhanh hơn để xử lý dữ liệu của bạn như một bộ hoàn chỉnh, không chia nó thành các vết cắn nhỏ hơn. COMMITs hoạt động, cũng như các giao dịch bắt đầu và kết thúc. Một lời khuyên khác là cách nhanh nhất để cập nhật TẤT CẢ (hoặc hầu hết) của các hàng trong một bảng là tạo một bảng mới. –

6

Một cách để tránh ghi nhật ký khi làm việc với các tập dữ liệu lớn, đang sử dụng SELECT/INTO. Nó sẽ tạo một bảng mới nhưng không có bảng nào được ghi lại.

Có một số điều để xem cho trong việc này:

  • cột Điện Toán trở thành cột dữ liệu thường xuyên
  • Indexing và bản sắc cột sẽ cần phải được thành lập quá

Khi thực hiện đúng cách nó có thể tiết kiệm không gian chỉ nhưng thời gian xử lý.

Cách khác là một cái gì đó giống như những gì tôi đang làm ngay bây giờ, như một ví dụ:

UPDATE [MyTable] 
SET [Message] = REPLACE([Message], N'Content_Type', N'Content-Type') 

Hoạt động tốt nhưng cập nhật toàn bộ bảng tạo một bộ giao dịch rất lớn, thay vào đó bạn có thể làm:

DECLARE @IDs TABLE ([id] int) 
DECLARE @Batch TABLE ([id] int) 

INSERT INTO @IDs ([ID]) SELECT [ID] FROM [MyTable] 

WHILE EXISTS (SELECT TOP 1 [ID] FROM @IDs) 
BEGIN 
    INSERT INTO @Batch ([ID]) SELECT TOP 1000 [Id] FROM @IDS 

    UPDATE [MyTable] 
    SET [Message] = REPLACE([Message], N'Content_Type', N'Content-Type') 
    WHERE [Id] IN (SELECT [Id] FROM @Batch) 

    DELETE @IDs WHERE [Id] IN (SELECT [Id] FROM @Batch) 
    DELETE @Batch 
END 

Điều này cập nhật bảng 1.000 hàng cùng một lúc để giảm kích thước giao dịch của bạn.

3

Bạn sẽ không làm cho SQL Server của mình nhanh hơn nhiều bằng cách tắt ghi nhật ký giao dịch nhưng kích thước nhật ký có thể nhỏ hơn bằng cách chuyển sang chế độ khôi phục nhật ký đơn giản hoặc hàng loạt như đã đề xuất.

Việc tôi thực hiện việc này là bạn không bao giờ nên tắt chế độ khôi phục đầy đủ ngoại trừ trong những trường hợp đặc biệt như của bạn khi điều đó thực sự không cần thiết.

Lý do chính cho việc này là nhật ký giao dịch khôi phục đầy đủ có thể là hy vọng duy nhất của bạn phục hồi trong trường hợp bị vô tình thực hiện UPDATE, DELETE hoặc TRUNCATE nơi bạn không có bản sao lưu hoặc tất cả dữ liệu không có trong bản sao lưu.

Có một số chủ đề về chủ đề này trong đó đọc nhật ký giao dịch là hy vọng cuối cùng để khôi phục.

How can I rollback an UPDATE query in SQL server 2005?

How to undo a delete operation in SQL Server 2005?

Một lần nữa, trong trường hợp cụ thể của bạn điều này có lẽ không phải là một vấn đề nhưng tôi đoán là nó có thể hữu ích cho người khác.

-1

Mã sử ​​dụng EntityFramework để cấu hình cơ sở dữ liệu của bạn như Richards câu trả lời mô tả:

using (var dbInstance = new YourEntityFrameworkDB_Context()) 
{ 
    var sqlConfigConn = dbInstance.Database.Connection as SqlConnection; 
    sqlConfigConn.Open(); 

    using (var sqlCmd = new SqlCommand()) 
    { 
     sqlCmd.Connection = sqlConfigConn as SqlConnection; 
     sqlCmd.CommandText = String.Format("ALTER DATABASE model SET RECOVERY SIMPLE"); 
     var result = sqlCmd.ExecuteNonQuery(); 
    } 
    sqlConfigConn.Close(); 
} 

Và để kiểm tra xem nó đã thành công chỉ bắt đầu Management Studio và chạy: Screenshot Management Studio


EDIT tháng 2 năm 2018:

MSDN mô tả abo ut mô hình phục hồi

╔══════════╦══════════════════════╦══════════════════════════════════════════╗ 
║ Recovery ║ Description  ║  Recover to a point in time?   ║ 
║ model ║      ║           ║ 
╠══════════╬══════════════════════╬══════════════════════════════════════════╣ 
║ Simple ║ No log backups  ║ Can recover only to the end of a backup. ║ 
║   ║      ║           ║ 
║ Full  ║ Requires log backups ║ Can recover to a specific point in time, ║ 
║   ║      ║ assuming that your backups are complete ║ 
║   ║      ║ up to that point in time.    ║ 
║   ║      ║           ║ 
║ Bulk  ║ Requires log backups ║ Can recover to the end of any backup. ║ 
║ logged ║      ║           ║ 
╚══════════╩══════════════════════╩══════════════════════════════════════════╝ 
Các vấn đề liên quan