Thiết kế cơ sở dữ liệu và bảng tốt nhất cho hàng tỷ hàng dữ liệu [đã đóng]


74

Tôi đang viết một ứng dụng cần lưu trữ và phân tích một lượng lớn dữ liệu điện và nhiệt độ.

Về cơ bản, tôi cần lưu trữ một lượng lớn các phép đo sử dụng điện hàng giờ trong nhiều năm qua và trong nhiều năm để có hàng chục ngàn địa điểm và sau đó phân tích dữ liệu theo cách không phức tạp lắm.

Thông tin mà tôi cần lưu trữ (hiện tại) là ID vị trí, Dấu thời gian (Ngày và giờ), Nhiệt độ và cách sử dụng điện.

Về lượng dữ liệu cần lưu trữ, đây là một xấp xỉ, nhưng có gì đó dọc theo các dòng đó:
20 000+ vị trí, 720 bản ghi mỗi tháng (số đo hàng giờ, khoảng 720 giờ mỗi tháng), 120 tháng (trong 10 năm trở lại ) và nhiều năm trong tương lai. Tính toán đơn giản mang lại kết quả như sau:

20 000 vị trí x 720 hồ sơ x 120 tháng (10 năm trở lại) = 1 728 000 000 hồ sơ .

Đây là những hồ sơ trong quá khứ, hồ sơ mới sẽ được nhập hàng tháng, vì vậy đó là khoảng 20 000 x 720 = 14 400 000 hồ sơ mới mỗi tháng .

Tổng số vị trí sẽ tăng trưởng đều đặn là tốt.

Trên tất cả dữ liệu đó, các thao tác sau sẽ cần được thực hiện:

  1. Truy xuất dữ liệu cho một ngày nhất định VÀ khoảng thời gian: tất cả các bản ghi cho một ID vị trí nhất định trong khoảng thời gian từ 01.01.2013 đến 01.01.2017 và từ 07:00 đến 13:00.
  2. Các phép toán đơn giản cho một ngày và phạm vi thời gian nhất định, ví dụ như sử dụng điện và nhiệt độ MIN, MAX và AVG cho một ID vị trí nhất định trong 5 năm từ 07:00 đến 13:00.

Dữ liệu sẽ được ghi hàng tháng, nhưng sẽ được đọc bởi hàng trăm người dùng (ít nhất là), do đó tốc độ đọc có tầm quan trọng hơn đáng kể.

Tôi không có kinh nghiệm với cơ sở dữ liệu NoQuery nhưng từ những gì tôi đã thu thập được, chúng là giải pháp tốt nhất để sử dụng ở đây. Tôi đã đọc trên các cơ sở dữ liệu NoQuery phổ biến nhất, nhưng vì chúng khá khác nhau và cũng cho phép kiến ​​trúc bảng rất khác nhau, tôi không thể quyết định đâu là cơ sở dữ liệu tốt nhất để sử dụng.

Lựa chọn chính của tôi là Cassandra và MongoDB, nhưng vì tôi có kiến ​​thức rất hạn chế và không có kinh nghiệm thực tế khi nói đến dữ liệu lớn và NoQuery tôi không chắc lắm. Tôi cũng đọc rằng PostreSQL cũng xử lý tốt lượng dữ liệu như vậy.

Câu hỏi của tôi là như sau:

  1. Tôi có nên sử dụng cơ sở dữ liệu NoQuery cho lượng dữ liệu lớn như vậy không. Nếu không tôi có thể dính vào MySQL không?
  2. Tôi nên sử dụng cơ sở dữ liệu nào?
  3. Tôi có nên giữ các ngày và thời gian trong các cột riêng biệt, được lập chỉ mục (nếu có thể) để truy xuất và xử lý dữ liệu nhanh chóng trong khoảng thời gian và ngày nhất định hoặc điều này có thể được thực hiện bằng cách giữ dấu thời gian trong một cột không?
  4. Là một cách tiếp cận mô hình dữ liệu chuỗi thời gian thích hợp ở đây, và nếu không bạn có thể cho tôi gợi ý cho một thiết kế bảng tốt không?

Cảm ơn bạn.


29
2017. Mặc dù không nhỏ, nhưng đây không phải là lượng dữ liệu LỚN cho phần cứng phù hợp. Và tôi ghét phải nói với bạn, nhưng cho đến nay những gì bạn có ở đó nghe có vẻ như dữ liệu quan hệ.
TomTom

6
Tôi đã lưu trữ các bảng nhiều TB với hàng chục tỷ hàng trong MS SQL Server 2008-2014 bằng cách sử dụng khóa tốt (ngày kỷ nguyên), nén, phân vùng và đảm bảo các truy vấn / chỉ mục của tôi được căn chỉnh theo phân vùng. Tôi đã phải chuyển sang NoQuery (Hadoop) khi tôi bắt đầu nhận được hàng petabyte dữ liệu để phân tích và lập chỉ mục khác nhau. NoQuery nên có những cân nhắc khác và trong trường hợp này, nó dường như không phù hợp.
Ali Razeghi

3
@AliRazeghi Hadoop không liên quan gì đến SQL hoặc NoQuery - nó chỉ là một công cụ lưu trữ. Có rất nhiều giao diện SQL được hỗ trợ bởi Hadoop ngoài kia.
mustaccio

3
Hạn chế của bạn là gì: tiền để chi cho phần mềm / giấy phép?
dùng3067860

1
Khi bạn có tiền vô hạn, thì tôi sẽ đề nghị mua một thiết bị SAP HANA. Thật tuyệt vời cho các tập hợp trên các bộ dữ liệu lớn. Nhưng bạn có thể không có tiền vô hạn.
Philipp

Câu trả lời:


90

Đây chính xác là những gì tôi làm mỗi ngày, ngoại trừ thay vì sử dụng dữ liệu hàng giờ, tôi sử dụng dữ liệu 5 phút. Tôi tải xuống khoảng 200 triệu hồ sơ mỗi ngày, vì vậy số tiền bạn nói ở đây không phải là vấn đề. Dữ liệu 5 phút có kích thước khoảng 2 TB và tôi có dữ liệu thời tiết quay trở lại 50 năm ở mức độ theo giờ. Vì vậy, hãy để tôi trả lời bạn câu hỏi dựa trên kinh nghiệm của tôi:

  1. Đừng sử dụng NoQuery cho việc này. Dữ liệu có cấu trúc cao và hoàn toàn phù hợp với cơ sở dữ liệu quan hệ.
  2. Cá nhân tôi sử dụng SQL Server 2016 và tôi không gặp vấn đề gì khi áp dụng các tính toán trên khối lượng dữ liệu đó. Ban đầu nó là một phiên bản PostgreSQL khi tôi bắt đầu công việc của mình và nó không thể xử lý khối lượng dữ liệu như trên một cá thể AWS nhỏ.
  3. Tôi đặc biệt khuyên bạn nên trích phần giờ của ngày và lưu trữ tách biệt với ngày đó. Hãy tin tôi, học hỏi từ những sai lầm của tôi!
  4. Tôi lưu trữ phần lớn danh sách dữ liệu (DATE, TIME, DATAPOINT_ID, VALUE) nhưng đó không phải là cách mọi người sẽ muốn diễn giải dữ liệu. Hãy chuẩn bị cho một số truy vấn khủng khiếp đối với dữ liệu và số lượng lớn các trục. Đừng ngại tạo một bảng không chuẩn hóa cho các tập kết quả quá lớn để tính toán khi đang di chuyển.

Mẹo chung: Tôi lưu trữ hầu hết dữ liệu giữa hai cơ sở dữ liệu, đầu tiên là dữ liệu chuỗi thời gian thẳng và được chuẩn hóa. Cơ sở dữ liệu thứ hai của tôi rất không chuẩn hóa và chứa dữ liệu tổng hợp trước. Nhanh như hệ thống của tôi, tôi không mù quáng về việc người dùng thậm chí không muốn đợi 30 giây để tải báo cáo - ngay cả khi cá nhân tôi nghĩ rằng 30 giây để xử lý 2 TB dữ liệu là cực kỳ nhanh.

Để giải thích lý do tại sao tôi khuyên bạn nên lưu trữ giờ tách biệt với ngày, đây là một vài lý do tại sao tôi làm theo cách đó:

  1. Cách mà dữ liệu điện được trình bày là theo Giờ kết thúc- do đó, 01:00 thực sự là trung bình của năng lượng điện cho giờ trước và 00:00 là Giờ kết thúc 24. (Điều này rất quan trọng vì bạn thực sự phải tìm kiếm hai ngày để bao gồm giá trị 24 giờ - ngày bạn đang tìm kiếm cộng với dấu đầu tiên của ngày hôm sau.) Tuy nhiên, dữ liệu thời tiết thực sự được trình bày theo cách chuyển tiếp (thực tế và dự báo cho giờ tiếp theo). Theo kinh nghiệm của tôi với dữ liệu này, người tiêu dùng muốn phân tích ảnh hưởng của thời tiết đối với giá / nhu cầu điện. Nếu bạn sử dụng so sánh ngày thẳng, bạn thực sự sẽ so sánh giá trung bình của giờ trước so với nhiệt độ trung bình cho giờ tiếp theo, mặc dù tem thời gian là như nhau.DATETIME cột.
  2. Hiệu suất. Tôi sẽ nói ít nhất 90% các báo cáo mà tôi tạo ra là các biểu đồ, thông thường vẽ giá so với giờ cho một ngày hoặc cho một phạm vi ngày. Phải phân chia thời gian từ ngày có thể làm giảm tốc độ của truy vấn được sử dụng để tạo báo cáo tùy thuộc vào phạm vi ngày mà bạn muốn xem. Không có gì lạ khi người tiêu dùng muốn xem một ngày duy nhất, hàng năm trong 30 năm qua (thực tế đối với thời tiết, điều này là bắt buộc để tạo ra các quy tắc 30 năm) - điều này có thể chậm. Tất nhiên bạn có thể tối ưu hóa truy vấn của mình và thêm các chỉ mục, và hãy tin tôi, tôi có một số chỉ mục điên rồ mà tôi không muốn có nhưng nó làm cho hệ thống chạy nhanh.
  3. Năng suất. Tôi ghét phải viết cùng một đoạn mã nhiều lần. Tôi đã sử dụng để lưu trữ ngày và thời gian trong cùng một cột, cho đến khi tôi phải viết cùng một truy vấn nhiều lần để trích xuất phần thời gian. Sau một thời gian, tôi phát ốm vì phải làm điều này và trích xuất nó vào cột riêng của nó. Càng ít mã bạn phải viết thì càng ít có lỗi trong đó. Ngoài ra, phải viết ít mã hơn có nghĩa là bạn có thể nhận được báo cáo của mình nhanh hơn, không ai muốn chờ đợi cả ngày để báo cáo.
  4. Người dùng cuối. Không phải tất cả người dùng cuối đều là người dùng có quyền lực (tức là biết cách viết SQL). Có dữ liệu đã được lưu trữ ở định dạng mà họ có thể đưa vào Excel (hoặc công cụ tương tự khác) với nỗ lực tối thiểu sẽ giúp bạn trở thành anh hùng trong văn phòng. Nếu người dùng không thể truy cập hoặc thao tác dữ liệu dễ dàng, họ sẽ không sử dụng hệ thống của bạn. Hãy tin tôi, tôi đã thiết kế hệ thống hoàn hảo vài năm trước và không ai sử dụng nó vì lý do này. Thiết kế cơ sở dữ liệu không chỉ là tuân thủ một bộ quy tắc / hướng dẫn được xác định trước mà còn là làm cho hệ thống có thể sử dụng được.

Như tôi đã nói ở trên, tất cả đều dựa trên kinh nghiệm cá nhân của tôi và để tôi nói với bạn, đã mất một vài năm khó khăn và rất nhiều thiết kế lại để đến nơi tôi đang ở. Đừng làm những gì tôi đã làm, học hỏi từ những sai lầm của tôi và đảm bảo bạn liên quan đến người dùng cuối của hệ thống của bạn (hoặc nhà phát triển, tác giả báo cáo, v.v.) khi đưa ra quyết định về cơ sở dữ liệu của bạn.


Tôi đã rất may mắn khi chỉ sử dụng ngày Epoch nhưng đề xuất của bạn rất thú vị cho trường hợp sử dụng của bạn. Cám ơn vì đã chia sẻ.
Ali Razeghi

4
Tôi không đồng ý với rất nhiều điều này. Không có gì trong số này là mối quan tâm thực sự với một cơ sở dữ liệu hiện đại như được chứng minh với các con số thực tế ở đây . Nếu người dùng dữ liệu quá ngu ngốc để sử dụng sql, thì bạn cần tạo cho họ một giao diện - bạn không nghiền nát lược đồ. Trích xuất giờ là một ý tưởng tồi
Evan Carroll

1
Phần cứng của bạn như thế nào?
kennes

1
@kennes vật lý, 16 lõi, RAM 256 GB, HĐH 100 GB, SSD cục bộ 500 GB với dữ liệu TempDB trên đó, SAN kết hợp với Bộ nhớ cache SSD 8TB và ổ đĩa trục chính 40TB có khả năng 100.000 iops / giây. Việc triển khai cơ sở dữ liệu sử dụng Cột, nén, bảng trong bộ nhớ, phân vùng và một thể hiện SSAS dạng bảng.
Mr.Brownstone

1
Đó là phần cứng đáng kinh ngạc tùy thuộc vào số lượng người dùng bạn phục vụ. Vì đây là phản hồi tối ưu hóa giả, tôi nghĩ bao gồm cả công nghệ của bạn là hữu ích. Tôi đã hoàn toàn sốc khi nghe tin bạn có thể crunch 2TB trong 30 giây - điều đó cực kỳ nhanh. Đánh giá cá nhân của riêng tôi sang một bên, tôi nghĩ rằng nó sẽ hữu ích cho những người trong tương lai đang tìm cách tối ưu hóa dữ liệu chuỗi thời gian!
kennes

57

Các chỉ mục PostgreSQL và BRIN

Kiểm tra nó cho chính mình. Đây không phải là vấn đề trên máy tính xách tay 5 tuổi có ssd.

EXPLAIN ANALYZE
CREATE TABLE electrothingy
AS
  SELECT
    x::int AS id,
    (x::int % 20000)::int AS locid,  -- fake location ids in the range of 1-20000
    now() AS tsin,                   -- static timestmap
    97.5::numeric(5,2) AS temp,      -- static temp
    x::int AS usage                  -- usage the same as id not sure what we want here.
  FROM generate_series(1,1728000000) -- for 1.7 billion rows
    AS gs(x);

                                                               QUERY PLAN                                                               
----------------------------------------------------------------------------------------------------------------------------------------
 Function Scan on generate_series gs  (cost=0.00..15.00 rows=1000 width=4) (actual time=173119.796..750391.668 rows=1728000000 loops=1)
 Planning time: 0.099 ms
 Execution time: 1343954.446 ms
(3 rows)

Vì vậy, phải mất 22 phút để tạo bảng. Phần lớn, vì bảng có dung lượng khiêm tốn 97GB. Tiếp theo chúng ta tạo các chỉ mục,

CREATE INDEX ON electrothingy USING brin (tsin);
CREATE INDEX ON electrothingy USING brin (id);    
VACUUM ANALYZE electrothingy;

Phải mất một thời gian dài để tạo ra các chỉ mục quá. Mặc dù vì họ BRIN chỉ có 2-3 MB và họ lưu trữ dễ dàng trong ram. Đọc 96 GB không phải là tức thời, nhưng đó không phải là vấn đề thực sự đối với máy tính xách tay của tôi với khối lượng công việc của bạn.

Bây giờ chúng tôi truy vấn nó.

explain analyze
SELECT max(temp)
FROM electrothingy
WHERE id BETWEEN 1000000 AND 1001000;
                                                                 QUERY PLAN                                                                  
---------------------------------------------------------------------------------------------------------------------------------------------
 Aggregate  (cost=5245.22..5245.23 rows=1 width=7) (actual time=42.317..42.317 rows=1 loops=1)
   ->  Bitmap Heap Scan on electrothingy  (cost=1282.17..5242.73 rows=993 width=7) (actual time=40.619..42.158 rows=1001 loops=1)
         Recheck Cond: ((id >= 1000000) AND (id <= 1001000))
         Rows Removed by Index Recheck: 16407
         Heap Blocks: lossy=128
         ->  Bitmap Index Scan on electrothingy_id_idx  (cost=0.00..1281.93 rows=993 width=0) (actual time=39.769..39.769 rows=1280 loops=1)
               Index Cond: ((id >= 1000000) AND (id <= 1001000))
 Planning time: 0.238 ms
 Execution time: 42.373 ms
(9 rows)

Cập nhật với dấu thời gian

Ở đây chúng tôi tạo một bảng có các dấu thời gian khác nhau để bão hòa yêu cầu lập chỉ mục và tìm kiếm trên cột dấu thời gian, việc tạo ra mất nhiều thời gian hơn vì to_timestamp(int)chậm hơn đáng kể so với now()(được lưu trong bộ nhớ cache cho giao dịch)

EXPLAIN ANALYZE
CREATE TABLE electrothingy
AS
  SELECT
    x::int AS id,
    (x::int % 20000)::int AS locid,
    -- here we use to_timestamp rather than now(), we
    -- this calculates seconds since epoch using the gs(x) as the offset
    to_timestamp(x::int) AS tsin,
    97.5::numeric(5,2) AS temp,
    x::int AS usage
  FROM generate_series(1,1728000000)
    AS gs(x);

                                                               QUERY PLAN                                                                
-----------------------------------------------------------------------------------------------------------------------------------------
 Function Scan on generate_series gs  (cost=0.00..17.50 rows=1000 width=4) (actual time=176163.107..5891430.759 rows=1728000000 loops=1)
 Planning time: 0.607 ms
 Execution time: 7147449.908 ms
(3 rows)

Bây giờ chúng ta có thể chạy truy vấn trên giá trị dấu thời gian thay thế ,,

explain analyze
SELECT count(*), min(temp), max(temp)
FROM electrothingy WHERE tsin BETWEEN '1974-01-01' AND '1974-01-02';
                                                                        QUERY PLAN                                                                         
-----------------------------------------------------------------------------------------------------------------------------------------------------------
 Aggregate  (cost=296073.83..296073.84 rows=1 width=7) (actual time=83.243..83.243 rows=1 loops=1)
   ->  Bitmap Heap Scan on electrothingy  (cost=2460.86..295490.76 rows=77743 width=7) (actual time=41.466..59.442 rows=86401 loops=1)
         Recheck Cond: ((tsin >= '1974-01-01 00:00:00-06'::timestamp with time zone) AND (tsin <= '1974-01-02 00:00:00-06'::timestamp with time zone))
         Rows Removed by Index Recheck: 18047
         Heap Blocks: lossy=768
         ->  Bitmap Index Scan on electrothingy_tsin_idx  (cost=0.00..2441.43 rows=77743 width=0) (actual time=40.217..40.217 rows=7680 loops=1)
               Index Cond: ((tsin >= '1974-01-01 00:00:00-06'::timestamp with time zone) AND (tsin <= '1974-01-02 00:00:00-06'::timestamp with time zone))
 Planning time: 0.140 ms
 Execution time: 83.321 ms
(9 rows)

Kết quả:

 count |  min  |  max  
-------+-------+-------
 86401 | 97.50 | 97.50
(1 row)

Vì vậy, trong 83.321 ms, chúng ta có thể tổng hợp 86.401 bản ghi trong một bảng với 1,7 tỷ hàng. Điều đó nên hợp lý.

Giờ kết thúc

Tính toán kết thúc giờ cũng khá dễ dàng, cắt bớt dấu thời gian xuống và sau đó chỉ cần thêm một giờ.

SELECT date_trunc('hour', tsin) + '1 hour' AS tsin,
  count(*),
  min(temp),
  max(temp)
FROM electrothingy
WHERE tsin >= '1974-01-01'
  AND tsin < '1974-01-02'
GROUP BY date_trunc('hour', tsin)
ORDER BY 1;
          tsin          | count |  min  |  max  
------------------------+-------+-------+-------
 1974-01-01 01:00:00-06 |  3600 | 97.50 | 97.50
 1974-01-01 02:00:00-06 |  3600 | 97.50 | 97.50
 1974-01-01 03:00:00-06 |  3600 | 97.50 | 97.50
 1974-01-01 04:00:00-06 |  3600 | 97.50 | 97.50
 1974-01-01 05:00:00-06 |  3600 | 97.50 | 97.50
 1974-01-01 06:00:00-06 |  3600 | 97.50 | 97.50
 1974-01-01 07:00:00-06 |  3600 | 97.50 | 97.50
 1974-01-01 08:00:00-06 |  3600 | 97.50 | 97.50
 1974-01-01 09:00:00-06 |  3600 | 97.50 | 97.50
 1974-01-01 10:00:00-06 |  3600 | 97.50 | 97.50
 1974-01-01 11:00:00-06 |  3600 | 97.50 | 97.50
 1974-01-01 12:00:00-06 |  3600 | 97.50 | 97.50
 1974-01-01 13:00:00-06 |  3600 | 97.50 | 97.50
 1974-01-01 14:00:00-06 |  3600 | 97.50 | 97.50
 1974-01-01 15:00:00-06 |  3600 | 97.50 | 97.50
 1974-01-01 16:00:00-06 |  3600 | 97.50 | 97.50
 1974-01-01 17:00:00-06 |  3600 | 97.50 | 97.50
 1974-01-01 18:00:00-06 |  3600 | 97.50 | 97.50
 1974-01-01 19:00:00-06 |  3600 | 97.50 | 97.50
 1974-01-01 20:00:00-06 |  3600 | 97.50 | 97.50
 1974-01-01 21:00:00-06 |  3600 | 97.50 | 97.50
 1974-01-01 22:00:00-06 |  3600 | 97.50 | 97.50
 1974-01-01 23:00:00-06 |  3600 | 97.50 | 97.50
 1974-01-02 00:00:00-06 |  3600 | 97.50 | 97.50
(24 rows)

Time: 116.695 ms

Điều quan trọng cần lưu ý là nó không sử dụng chỉ mục trên tập hợp, mặc dù có thể. Nếu đó là truy vấn thông thường của bạn, bạn có thể muốn có BRIN date_trunc('hour', tsin)trong đó có một vấn đề nhỏ date_trunckhông phải là bất biến, vì vậy trước tiên bạn phải bọc nó để biến nó thành như vậy.

Phân vùng

Một điểm quan trọng khác của thông tin trên PostgreSQL là PG 10 mang phân vùng DDL . Vì vậy, bạn có thể, ví dụ, dễ dàng tạo phân vùng cho mỗi năm. Chia nhỏ cơ sở dữ liệu khiêm tốn của bạn thành những cơ sở nhỏ. Khi làm như vậy, bạn sẽ có thể sử dụng và duy trì các chỉ số btree thay vì BRIN, điều này thậm chí sẽ nhanh hơn.

CREATE TABLE electrothingy_y2016 PARTITION OF electrothingy
    FOR VALUES FROM ('2016-01-01') TO ('2017-01-01');

Hay bất cứ cái gì.


13

Điều làm tôi ngạc nhiên là không có ai ở đây đề cập đến điểm chuẩn - đó là cho đến khi @EvanCarroll xuất hiện cùng với sự đóng góp xuất sắc của anh ấy!

Nếu tôi là bạn, tôi sẽ dành một chút thời gian (và vâng, tôi biết đó là một mặt hàng quý giá!) Thiết lập hệ thống, chạy những gì bạn nghĩ sẽ có (lấy đầu vào của người dùng cuối ở đây!), Giả sử, 10 truy vấn phổ biến nhất của bạn.

Suy nghĩ của riêng tôi:

Các giải pháp NoQuery có thể hoạt động rất tốt cho các trường hợp sử dụng cụ thể nhưng thường không linh hoạt đối với các truy vấn đặc biệt. Đối với một mất mát thú vị trên NoQuery bởi Brian Aker - cựu kiến ​​trúc sư trưởng của MySQL, xem tại đây !

Tôi đồng ý với @ Mr.Brownstone rằng dữ liệu của bạn rất phù hợp với giải pháp quan hệ (và ý kiến ​​này đã được Evan Carroll xác nhận )!

Nếu tôi cam kết với bất kỳ chi tiêu, nó sẽ là công nghệ đĩa của tôi! Tôi sẽ chi bất kỳ khoản tiền nào tôi có cho NAS hoặc SAN hoặc có thể một số đĩa SSD để giữ dữ liệu tổng hợp hiếm khi được viết của tôi!

Đầu tiên tôi sẽ xem xét những gì tôi có sẵn bây giờ . Chạy một số thử nghiệm và hiển thị kết quả cho những người ra quyết định. Bạn đã có proxy dưới dạng công việc của EC ! Nhưng, một bài kiểm tra nhanh hoặc hai lần đánh với nhau trên phần cứng của bạn sẽ thuyết phục hơn!

Sau đó nghĩ về việc tiêu tiền! Nếu bạn định chi tiền, hãy nhìn vào phần cứng trước hơn là phần mềm. AFAIK, bạn có thể thuê công nghệ đĩa trong một thời gian dùng thử, hoặc tốt hơn là tạo ra một vài bằng chứng về khái niệm trên đám mây.

Cổng gọi cá nhân đầu tiên của riêng tôi cho một dự án như thế này sẽ là PostgreSQL. Điều đó không có nghĩa là tôi sẽ loại trừ một giải pháp độc quyền, nhưng các định luật vật lý và đĩa là giống nhau cho tất cả mọi người! "Yae cannae củ cải luật o 'vật lý Jim" :-)


6

Nếu bạn chưa có, hãy xem DBMS chuỗi thời gian, vì nó được tối ưu hóa để lưu trữ và truy vấn dữ liệu trong đó trọng tâm chính là loại ngày / giờ. Thông thường cơ sở dữ liệu chuỗi thời gian được sử dụng để ghi dữ liệu trong phạm vi phút / giây / giây phụ, vì vậy tôi không chắc liệu nó có còn phù hợp với gia số hàng giờ hay không. Điều đó nói rằng, loại DBMS này có vẻ đáng để xem xét. Hiện tại InfluxDB dường như là cơ sở dữ liệu chuỗi thời gian được thiết lập và sử dụng rộng rãi nhất.


1
Một ví dụ về một chuỗi thời gian DBMS là gì?
giám mục

2
Có một cái nhìn ở đây .
Vérace

4

Rõ ràng đây không phải là vấn đề của NoQuery, nhưng tôi sẽ đề xuất rằng trong khi giải pháp RDBMS hoạt động, tôi nghĩ cách tiếp cận OLAP sẽ phù hợp hơn nhiều và đưa ra các phạm vi dữ liệu rất hạn chế, tôi sẽ đề nghị điều tra việc sử dụng DB dựa trên cột thay vì hàng dựa trên một. Hãy nghĩ về nó theo cách này, bạn có thể có 1,7 tỷ mẩu dữ liệu, nhưng bạn vẫn chỉ cần 5 bit để lập chỉ mục cho mọi giá trị có thể của giờ hoặc ngày trong tháng.

Tôi có kinh nghiệm với một miền có vấn đề tương tự trong đó Sybase IQ (nay là SAP IQ) được sử dụng để lưu trữ tới 300 triệu quầy mỗi giờ dữ liệu quản lý hiệu suất thiết bị viễn thông, nhưng tôi nghi ngờ nếu bạn có ngân sách cho loại giải pháp đó. Trong lĩnh vực nguồn mở, MariaDB ColumnStore là một ứng cử viên rất hứa hẹn, nhưng tôi cũng khuyên bạn nên điều tra MonetDB.

Vì hiệu suất truy vấn là một trình điều khiển chính cho bạn, hãy xem xét cách truy vấn sẽ được thực hiện. Đây là nơi OLAP và RDBMS thể hiện sự khác biệt lớn nhất của chúng: - với OLAP bạn bình thường hóa cho hiệu năng truy vấn, không để giảm sự lặp lại, giảm lưu trữ hoặc thậm chí để thực thi tính nhất quán. Vì vậy, ngoài dấu thời gian ban đầu (bạn có nhớ ghi lại múi giờ của nó tôi hy vọng không?) Có một trường riêng cho dấu thời gian UTC, các trường khác cho ngày và giờ, và nhiều hơn cho năm, tháng, ngày, giờ, phút và bù UTC. Nếu bạn có thêm thông tin về các vị trí, vui lòng giữ nó trong một bảng vị trí riêng biệt có thể tìm kiếm theo yêu cầu và thoải mái giữ chìa khóa cho bảng đó trong hồ sơ chính của bạn nhưng giữ tên đầy đủ của vị trí trong bảng chính của bạn như tốt, sau tất cả,

Như một gợi ý cuối cùng, hãy sử dụng các bảng riêng biệt cho dữ liệu tổng hợp phổ biến và sử dụng các công việc hàng loạt để điền vào chúng, theo cách đó bạn không phải lặp lại bài tập cho từng báo cáo sử dụng một giá trị tổng hợp và thực hiện các truy vấn so sánh hiện tại với lịch sử hoặc lịch sử để lịch sử dễ dàng hơn nhiều và nhanh hơn nhiều.


Bạn cũng có thể coi Greenplum như một cửa hàng cột nếu bạn đang xem chúng! Là một "phần thưởng" - nó dựa trên PostgreSQL!
Vérace

Tôi đã có trải nghiệm tốt với HP Vertica. Chúng tôi đã có một bảng duy nhất với 9 cột có 130 hàng, không cần điều chỉnh nhiều. Nó chỉ hoạt động.
ThatDataGuy
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.