2010-04-20 16 views
6

Bây giờ chúng tôi có một cơ sở dữ liệu Firebird với 1.000.000 mà phải được xử lý sau khi TẤT CẢ được nạp vào bộ nhớ RAM. Để có được tất cả những người chúng ta phải trích xuất dữ liệu bằng cách sử dụng (chọn * đầu tiên 1000 ...) trong 8 giờ. Giải pháp cho điều này là gì?Làm thế nào để tải 1 triệu hồ sơ từ cơ sở dữ liệu nhanh chóng?

+0

kích thước của bảng là bao nhiêu? bạn có chắc là bộ nhớ của bạn có thể giữ được không? – zsong

+2

Âm thanh như một công việc cho ... [Cơ sở dữ liệu nhanh nhất thế giới] (http://thedailywtf.com/Articles/Announcing-APDB-The-Worlds-Fastest-Database.aspx)! –

+0

Một triệu bản ghi sẽ được tải trong vài giây trừ khi đây là những bản ghi thực sự khổng lồ. Làm thế nào bạn tải chúng? Bạn đang sử dụng nền tảng nào? –

Trả lời

0

Loại xử lý nào bạn cần thực hiện sẽ yêu cầu tải chúng trong bộ nhớ và không chỉ xử lý chúng thông qua câu lệnh SQL?

Có hai kỹ thuật tôi sử dụng làm việc tùy thuộc vào những gì tôi đang cố gắng làm.

  1. Giả sử có một số loại khóa nhân tạo (nhận dạng), hoạt động theo lô, tăng giá trị danh tính cuối cùng được xử lý.

  2. BCP dữ liệu ra tệp văn bản, lật ngược các bản cập nhật, sau đó BCP lại, nhớ tắt ràng buộc và chỉ mục trước bước IN.

+0

Chúng tôi thực hiện một số phân tích về mọi thứ từ db và chúng tôi cần phải tải chúng vào bộ nhớ. Nút cổ chai là thời điểm chúng ta chuyển dữ liệu từ tập bản ghi sang đối tượng DTO của chúng ta. –

0
+0

Không có gì để giúp tôi tại liên kết đó, có thể vấn đề này gặp phải trên tất cả các cơ sở dữ liệu. Tôi cần tối ưu hóa thời gian cho "while (read.Read())". –

4

Có mỗi bạn "chọn * đầu tiên 1000" (như bạn mô tả nó) làm một bảng quét toàn bộ? Xem xét các truy vấn đó và đảm bảo chúng đang sử dụng chỉ mục.

+0

Không phải tốc độ chọn là vấn đề. Việc chuyển dữ liệu từ recordset chọn vào bộ nhớ, trong khi (read.Read()) mất nhiều thời gian ... –

1

để tải dữ liệu từ một bảng với 1.000.000 hàng trong C# sử dụng một db Firebird mang một 3GHz Pentium 4 ít nhất 8 giờ

Mọi người đều được giả sử bạn đang chạy một truy vấn SQL để chọn các bản ghi từ cơ sở dữ liệu Một cái gì đó giống như

select * 
from your_big_table 
/

Vì điều đó thực sự mất vài giây. Vâng, lâu hơn một chút để hiển thị nó trên màn hình, nhưng thực thi lựa chọn thực tế sẽ nhanh như chớp.

Nhưng tham chiếu đó đến C# khiến tôi nghĩ bạn đang làm điều gì đó khác. Có lẽ những gì bạn thực sự có là một vòng RBAR instantiating một triệu đối tượng. Tôi có thể thấy cách đó có thể lâu hơn một chút. Nhưng dù vậy, tám giờ? Thời gian trôi bao lâu rồi?

chỉnh sửa

tôi đoán đã đúng và bạn đang instantiating 1000000 đối tượng trong một vòng lặp. Lời khuyên chính xác sẽ là tìm cách khác để làm bất cứ điều gì bạn làm khi bạn đã có tất cả các đối tượng của bạn trong bộ nhớ. Không biết nhiều hơn về chi tiết thì khó có thể đưa ra chi tiết cụ thể. Nhưng có vẻ như đây không phải là một giao diện người dùng nghĩ - người dùng nào sẽ nghiên cứu một triệu đối tượng?

Vì vậy, một quan sát chung sẽ phải đủ: sử dụng hoạt động hàng loạt để triển khai hoạt động hàng loạt. Cơ sở dữ liệu SQL nổi trội tại các bộ xử lý. Tận dụng sức mạnh của SQL để xử lý hàng triệu hàng của bạn trong một tập hợp đơn lẻ, chứ không phải là các hàng riêng lẻ.

Nếu bạn không thấy câu trả lời này hữu ích thì bạn cần cung cấp cho chúng tôi thêm chi tiết về điều bạn muốn đạt được.

+0

Quá trình của chúng tôi chạy tối đa mỗi tháng một lần trong trường hợp xấu nhất. Và có, chúng tôi tải tất cả dữ liệu từ bảng ra trong một vòng lặp lớn duy nhất. Vòng lặp đó là nút cổ chai của chúng tôi. Trong một khoảnh khắc, tôi đã suy nghĩ để tạo ra một số bản sao của DB và bây giờ để chạy một số truy vấn song song để tải dữ liệu nhanh hơn. –

+2

CHÚNG TÔI bạn không bao giờ tải các bản ghi trong một vòng lặp khi bạn có nhiều. Đó là cơ sở dữ liệu 101. Tôi không biết firebird nhưng hầu hết hỗ trợ cơ sở dữ liệu bằng cách chọn trong chèn như chèn bảng 2 (trường1, field2) chọn trường1, trường2 từ bảng1 Điều đó sẽ nhanh hơn nhiều so với một hàng tại một thời điểm – HLGEM

1

Mất bao lâu để xây dựng đối tượng DTO mà bạn đang tạo với từng dữ liệu được đọc?

{ int a = read.GetInt32(0); int b = read.GetInt32(1); mylist.Add(new DTO(a,b)); } 

Bạn đang tạo hàng triệu đối tượng này. Nếu mất 29 mili giây để tạo một đối tượng DTO, thì sẽ mất hơn 8 giờ để hoàn thành.