質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.48%
C#

C#はマルチパラダイムプログラミング言語の1つで、命令形・宣言型・関数型・ジェネリック型・コンポーネント指向・オブジェクティブ指向のプログラミング開発すべてに対応しています。

PostgreSQL

PostgreSQLはオープンソースのオブジェクトリレーショナルデータベース管理システムです。 Oracle Databaseで使われるPL/SQLを参考に実装されたビルトイン言語で、Windows、 Mac、Linux、UNIX、MSなどいくつものプラットフォームに対応しています。

SQL

SQL(Structured Query Language)は、リレーショナルデータベース管理システム (RDBMS)のデータベース言語です。大きく分けて、データ定義言語(DDL)、データ操作言語(DML)、データ制御言語(DCL)の3つで構成されており、プログラム上でSQL文を生成して、RDBMSに命令を出し、RDBに必要なデータを格納できます。また、格納したデータを引き出すことも可能です。

Q&A

解決済

2回答

1074閲覧

SQLを用いたリアルタイムデータ集約

aisuika

総合スコア9

C#

C#はマルチパラダイムプログラミング言語の1つで、命令形・宣言型・関数型・ジェネリック型・コンポーネント指向・オブジェクティブ指向のプログラミング開発すべてに対応しています。

PostgreSQL

PostgreSQLはオープンソースのオブジェクトリレーショナルデータベース管理システムです。 Oracle Databaseで使われるPL/SQLを参考に実装されたビルトイン言語で、Windows、 Mac、Linux、UNIX、MSなどいくつものプラットフォームに対応しています。

SQL

SQL(Structured Query Language)は、リレーショナルデータベース管理システム (RDBMS)のデータベース言語です。大きく分けて、データ定義言語(DDL)、データ操作言語(DML)、データ制御言語(DCL)の3つで構成されており、プログラム上でSQL文を生成して、RDBMSに命令を出し、RDBに必要なデータを格納できます。また、格納したデータを引き出すことも可能です。

0グッド

1クリップ

投稿2020/04/17 08:59

編集2020/04/17 09:55

前提・実現したいこと

複数のプログラムよりデータを集約するためにPostgreSQLを利用したいと考えています。

PostgreSQLにて以下要件の実現が可能かどうか、どのような処理で実現するかを教えていただけませんでしょうか。

またPostgreSQLは初心者のため、より効率的な代替手段がある場合は提案して頂ければ嬉しいです。
不明点等あるかと存じますが可能な限り回答いたしますので、何卒お願いいたします。

現在想定している環境

・PostgreSQL + Docker
・C# + Npgsql

・システム構成
イメージ説明

・データ構造1(データ処理PCからのINSERTのみを受け付け記録。削除はせず蓄積)

timevalueopenhighlowcode
2020-04-16 09:02:01.0256088318288368251942
2020-04-16 09:02:01.02907527062699270626871959
2020-04-16 09:02:01.03229223212300235122982212
2020-04-16 09:02:01.03488523242300235122982212
2020-04-16 09:02:01.0375156426396456371605

・データ構造2(データ構造1からのcode別で直近のものを抽出。データ処理PCに渡す)

codeopenhighlowvalue
1332454464451464
1605639645637642
17212800283727932820
18013165318531003120
1802893901879885

コード

現在以下のコードで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のスペックはどの程度あれば捌けるか
・そもそもこの構成が適切かどうか

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

gentaro

2020/04/17 09:16

「SQL Server(マイクロソフトの製品)」なのか「PostgreSQL」なのかハッキリしないんですが、どっちの話をしてるのかという疑問と、そもそもスペック見積もりとかそれ作業の丸投げじゃね?と思いますが、ご自身で見積もる方法を勉強してやってみよう、という気がないのなら、お金払ってどっかに依頼されてみては。
aisuika

2020/04/17 09:34

gentaro様 ご指摘ありがとうございます。SQL Serverは製品名なのですね。勉強になりました。今回使用したいのはPostgreSQLになります。 スペックの見積もりについては、おっしゃる通りですね。今回は趣味の質問ですので自分で落としどころを探りたいと思います。
dodox86

2020/04/17 10:11

センサーデータか何かなのでしょうか。市販のPC数台での構成ならトランザクションを張っても1000件を1秒でコミットするのは不可能だろうと思い、回答を用意していましたが、お金に糸目をつけずに分散環境にしたり超エンタープライズ構成にしてネットを超高速にしてずっとつなぎっぱなしにするなどすれば不可能ではないと思いました。
dodox86

2020/04/17 10:16

私にとって不明点が多かったので回答は控えましたが、データ取得<-->データ集約間はDB/SQLを使わず軽いデータ構造の送受信にして、とにかく早く取り込ませて貯めさせておいて、集約部からの後段でゆっくりDB使うのが現実路線じゃないかな、と思いました。以上。
aisuika

2020/04/17 10:21

dodox86様 ご指摘ありがとうございます。 今回は趣味で作成しているシステムで、環境は全て自宅にあります。データは株価のリアルタイムデータです。ネットからの取得には成功していますので、やはりネックはデータの集約かなと感じています。 SQLはかなり難しく、皆さまの回答より自らの勉強不足を恥じるばかりです。
dodox86

2020/04/17 10:41

> データは株価のリアルタイムデータ あー、実は「相場関係かな」とも思っていました。お望みの速さのパフォーマンスを出すのは、プロじゃないとかなり難しいと思いますよ。ご自分でやるなら、少し長い目で育てるくらいのつもりじゃないと。
aisuika

2020/04/17 10:45

おっしゃる通りですね。どの証券会社もかゆいところに手が届かないサービスで難儀しています。 勉強だと思い腰を据えてやってみます。
guest

回答2

0

1000件/秒のInsertを複数台から…リアルタイム…
厳しいですね。

SQLを使いたいなら、MySQL-MyISAM か MySQL-MEMORY を検討してみては?
NoSQLならMongoDB がフリーでメジャーなのでとっつきやすいかもしれません。

投稿2020/04/17 09:41

hihijiji

総合スコア4150

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

aisuika

2020/04/17 10:09

hihijiji様 回答いただきありがとうございます。 NoSQLというものがあるのですね。とてもためになります。こちらも検討いたします。
guest

0

ベストアンサー

・INSERTに競合または遅延等のボトルネックが発生する可能性があるのではないか

単に時系列で必ず追加するようにするなら、競合は発生しません。
ただ、1秒間に1000回のinsertの発行は受け側が厳しいと思います。
DBが処理可能な時間間隔で、数千件のデータで1回のinsertなら可能でしょうけど。

・データ構造1からデータ構造2へのリアルタイムな変形が可能か

可能ですね。

・SQL-Serverのスペックはどの程度あれば捌けるか

どの程度の頻度でDBサーバーにアクセスするかによりますし、質問サイトで簡単に回答を求めるものではありません

・そもそもこの構成が適切かどうか

気になっている構成と言われているのはどの部分ですか?
クラサバっぽいけど、どのみち質問されている内容で適切かどうか判断は困難だと思います。

投稿2020/04/17 09:17

編集2020/04/17 09:52
sazi

総合スコア25188

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

aisuika

2020/04/17 10:01

sazi様 回答いただきありがとうございます。 一時的にデータ処理部でデータを蓄積し、まとめてINSERTすれば可能かもしれないということでしょうか。
sazi

2020/04/17 10:29

データの計測ではなく、蓄積においてどの程度のリアルタイム性が求められるのでしょう? その間隔が1秒なら、1秒間は貯めておいて、纏めて1回のSQL発行にすれば、1件ごとのINSERT発行よりは時間は短縮されます。
aisuika

2020/04/17 10:36

可能な限りのリアルタイム性を追求したいところではありますが、やはり難しそうですね。 データ処理部からの要求を3秒程度に抑えれば、INSERTの発行は1秒間隔でも問題ないように思えます。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問