前提・実現したいこと
複数のプログラムよりデータを集約するためにPostgreSQLを利用したいと考えています。
PostgreSQLにて以下要件の実現が可能かどうか、どのような処理で実現するかを教えていただけませんでしょうか。
またPostgreSQLは初心者のため、より効率的な代替手段がある場合は提案して頂ければ嬉しいです。
不明点等あるかと存じますが可能な限り回答いたしますので、何卒お願いいたします。
現在想定している環境
・PostgreSQL + Docker
・C# + Npgsql
・データ構造1(データ処理PCからのINSERTのみを受け付け記録。削除はせず蓄積)
time | value | open | high | low | code |
---|---|---|---|---|---|
2020-04-16 09:02:01.025608 | 831 | 828 | 836 | 825 | 1942 |
2020-04-16 09:02:01.029075 | 2706 | 2699 | 2706 | 2687 | 1959 |
2020-04-16 09:02:01.032292 | 2321 | 2300 | 2351 | 2298 | 2212 |
2020-04-16 09:02:01.034885 | 2324 | 2300 | 2351 | 2298 | 2212 |
2020-04-16 09:02:01.037515 | 642 | 639 | 645 | 637 | 1605 |
・データ構造2(データ構造1からのcode別で直近のものを抽出。データ処理PCに渡す)
code | open | high | low | value |
---|---|---|---|---|
1332 | 454 | 464 | 451 | 464 |
1605 | 639 | 645 | 637 | 642 |
1721 | 2800 | 2837 | 2793 | 2820 |
1801 | 3165 | 3185 | 3100 | 3120 |
1802 | 893 | 901 | 879 | 885 |
コード
現在以下のコードでINSERTを試みています。
1万件のINSERTが約20秒かかるため、500件/秒ほどの処理しかできていません。
リアルタイム性を重視しているためCommitの回数が多くなる点がネックかと考えております。
C#
1public string sql_db = "Host=172.16.1.130;Port=8330;Username=postgres;Password=postgres;Database=postgres"; 2 3public void WriteSQL (int code_, double value_, double open_, double high_, double low_) { 4 string insert =@"INSERT INTO table20200417 (time,value,open,high,low) VALUES(current_timestamp,{0},{1},{2},{3});"; 5 6 try { 7 using (var conn = new NpgsqlConnection (sql_db)) { 8 conn.Open (); 9 using (var cmd = new NpgsqlCommand (string.Format (insert, value_, open_, high_, low_, code_), conn)) { 10 cmd.ExecuteNonQuery (); 11 //Console.WriteLine ("success insert"); 12 } 13 } 14 } catch (System.ObjectDisposedException e) { 15 //pass 16 } 17}
疑問点
・INSERTに競合または遅延等のボトルネックが発生する可能性があるのではないか
・データ構造1からデータ構造2へのリアルタイムな変形が可能か
・PostgreSQLのスペックはどの程度あれば捌けるか
・そもそもこの構成が適切かどうか
回答2件
あなたの回答
tips
プレビュー