Lưu trữ và tính toán các giá trị tổng hợp


96

Có bất kỳ hướng dẫn hoặc quy tắc nào để xác định khi nào sẽ lưu trữ các giá trị tổng hợp và khi nào cần tính toán chúng khi đang bay?

Ví dụ: giả sử tôi có các widget mà người dùng có thể xếp hạng (xem lược đồ bên dưới). Mỗi lần tôi hiển thị một widget tôi có thể tính xếp hạng người dùng trung bình từ Ratingsbảng. Ngoài ra, tôi có thể lưu trữ đánh giá trung bình trên Widgetbàn. Điều này sẽ giúp tôi không phải tính toán xếp hạng mỗi khi tôi hiển thị tiện ích, nhưng sau đó tôi phải tính toán lại xếp hạng trung bình mỗi lần người dùng xếp hạng tiện ích.

Ratings       Widgets
---------     -------
widget_id     widget_id
user_id       name              
rating        avg_rating  <--- The column in question

Câu trả lời:


58

Nó phụ thuộc. Các giá trị tổng hợp tính toán trước đặt một tải lớn hơn lên ghi, việc tạo ra chúng làm cho việc đọc trở nên khó khăn hơn

Nếu bạn thường xuyên truy cập một giá trị dẫn xuất, tính toán trước là bước khử chuẩn hóa hợp lệ. Tuy nhiên, trong trường hợp này, tôi khuyên bạn nên sử dụng Chế độ xem được Vật chất hóa (chế độ xem, được ghi vào đĩa, được liên kết bằng trình kích hoạt với các bảng cha). Khung nhìn cụ thể hóa được thiết kế để lưu trữ dữ liệu thường xuyên được hỏi nhưng tẻ nhạt và rất hữu ích cho số lượng ghi cao và số lần đọc thấp.

Trong một kịch bản viết cao, đọc cao, hãy xem xét có một nhiệm vụ trong nền bắt chước các hiệu ứng của một khung nhìn cụ thể hóa, nhưng trong thời gian thực ít hơn thời gian thực. Điều này sẽ thể hiện mức trung bình "đủ tốt" trong khi duy trì hiệu suất ghi và đọc.

Trong mọi trường hợp, bạn nên coi cột dẫn xuất như cột "bình thường": đảm bảo dữ liệu được trình bày trong "khung nhìn" của Widgets có mặt ở nơi khác trong bảng, sao cho toàn bộ bộ dữ liệu có thể được lấy từ bất kỳ quy trình nào bạn đặt. Câu hỏi này cũng đặc biệt là cơ sở dữ liệu (và phiên bản cơ sở dữ liệu), vì vậy tôi khuyên bạn nên kiểm tra hiệu năng của tổng hợp (với các chỉ mục phù hợp) dựa trên tập dữ liệu có kích thước bình thường và chế độ xem cụ thể hóa.


Tôi thấy cuộc thảo luận này rất hữu ích về các quan điểm cụ thể hóa. Nó phù hợp với Oracle nhưng có thể hiểu một cách khái quát. Đối với những người như tôi đến từ nền tảng MySQL, chế độ xem MySQL khác với chế độ xem Được vật chất hóa, nó là ảo và không lưu trữ vào đĩa (như đã nói trong liên kết tôi đã cung cấp).
Siddhartha

nâng cao tinh thần! chuẩn bị đặt câu hỏi chính xác, tôi cần lưu trữ các chỉ số như SMA, EMA, WMA, RSI, v.v. và chúng liên quan đến tính toán nặng nề, tôi đã tạo một bảng hiện tại mà tôi đang làm mới bằng tay Dữ liệu mới được đưa vào, chiến lược tốt để duy trì chúng là gì, tôi biết các chế độ xem sẽ tách hoàn toàn cơ sở dữ liệu nếu mọi người bắt đầu truy vấn các chế độ xem trái và phải
PirateApp

11

Tần suất bạn cần tính toán / hiển thị các giá trị liên quan đến tần suất các số cơ bản được thay đổi / cập nhật.

Vì vậy, nếu bạn có một trang web với 10 nghìn lượt truy cập hàng ngày hiển thị giá trị sẽ chỉ thay đổi mỗi giờ một lần, tôi sẽ tính toán khi giá trị cơ bản thay đổi (có thể là kích hoạt cơ sở dữ liệu, bất cứ điều gì).

Nếu bạn có một công cụ để đi và xem các số liệu thống kê, trong đó các số liệu thống kê sẽ thay đổi lần thứ hai, nhưng bạn chỉ có ba người có quyền truy cập và họ chỉ nhìn vào nó vài lần một ngày, tôi sẽ có nhiều khả năng tính toán hơn nó đang bay (trừ khi, phải mất vài phút để tính toán rằng việc có dữ liệu cũ ở nơi đầu tiên không phải là vấn đề lớn ... và ông chủ của tôi bảo tôi chỉ tạo ra thứ đó từ cron mỗi giờ, vì vậy anh ta không có chờ đợi khi anh ấy muốn nhìn vào nó.)


cứ sau 15 phút, 10 số liệu thay đổi 100% với 1000 hàng trên mỗi số liệu
PirateApp

1
@PirateApp và nó được xem bao nhiêu lần trong một cửa sổ trung bình 15 phút? Những gì bạn cũng có thể làm là tạo nó theo yêu cầu đầu tiên trong cửa sổ 15 phút và sau đó lưu nó vào bộ nhớ cache cho những người tiếp tục tải lại nhiều lần
Joe

Nó sẽ xuất hiện trên một trang web vì vậy tôi cho rằng ít nhất 10000 người sẽ nhìn thấy nó cho người mới bắt đầu, trang web không hoạt động nên không có dữ liệu thực tế về hành vi của người dùng
PirateApp

1
Vấn đề là có bao nhiêu yêu cầu liên quan đến tần suất thay đổi. Vì vậy, nếu bạn tạo trước một cái gì đó sẽ được nhìn thấy 10.000 lần trước khi dữ liệu cơ bản thay đổi, thì có, tạo trước nó. Nếu nó chỉ được xem một lần hoặc ít hơn một lần (vì dữ liệu thay đổi quá nhanh hoặc do trang hiếm khi được xem), thì bạn không nên xem.
Joe

4

Sử dụng bảng StaleWidgets như một hàng đợi các vật dụng "không hợp lệ" (được tính toán lại). Sử dụng tác vụ luồng khác (không đồng bộ) có thể tính toán lại các giá trị này. Thời gian hoặc thời điểm tính toán lại phụ thuộc vào yêu cầu hệ thống:

  • chỉ cần đọc,
  • vào cuối tháng,
  • cho một số người dùng vào đầu ngày
  • ...

1
Làm thế nào để họ vào hàng đợi cũ?
jcolebrand

2
@jcolebrand ..tại thời điểm chèn / xóa xếp hạng (Bảng xếp hạng) cho một số tiện ích. Tại thời điểm này, giá trị trung bình trong bảng Widgets đang trở nên không hợp lệ, vì vậy chúng tôi phải chèn vào bảng bản ghi StaleWidgets chỉ có một cột - widget_id. Sử dụng kích hoạt hoặc lưu trữ Proc chèn bản ghi vào bảng Xếp hạng hoặc tất nhiên biến thể của bạn.
garik

2

Tôi sẽ đề nghị tính toán khi đang bay nếu việc tính toán không quá cồng kềnh và trong trường hợp bạn có calcutaion phức tạp và cập nhật thường xuyên nhưng không phải là mạng thường xuyên đọc hơn bạn có thể lưu trữ dữ liệu được tính toán và có thêm cột (bool) sẽ lưu trữ liệu có cần tính toán lại hay không . vd

Bằng cách này, bạn không phải tính toán lại mọi lúc, bạn sẽ chỉ tính toán khi bạn phải đọc và tính toán lại giá trị cột là đúng. Bằng cách này, bạn sẽ tiết kiệm được rất nhiều tính toán lại.


2

Đối với trường hợp cụ thể, có một giải pháp khác mà bạn không phải thêm tất cả các xếp hạng và chia cho tổng số để tìm mức trung bình. Thay vào đó, bạn có thể có một trường khác chứa tổng số đánh giá, do đó, mỗi lần bạn thêm xếp hạng bạn sẽ tính trung bình mới bằng cách sử dụng (avg_rating × Total + new_rating) / tổng, điều này nhanh hơn nhiều so với tổng hợp và giảm số lần đọc đĩa kể từ khi bạn không phải truy cập vào tất cả các giá trị xếp hạng. Các giải pháp tương tự có thể áp dụng cho các trường hợp khác.

Nhược điểm của điều này là nó không phải là một giao dịch axit, vì vậy bạn có thể kết thúc với một đánh giá lỗi thời. Nhưng bạn vẫn có thể giải quyết điều đó bằng cách sử dụng các kích hoạt trong cơ sở dữ liệu. Vấn đề khác là cơ sở dữ liệu không còn được chuẩn hóa nữa, nhưng đừng ngại việc chuẩn hóa dữ liệu để đổi lấy hiệu suất.

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.