基本的に価格要因により、時系列データベース (ECHO ヒストリアン) からオープン ソース データベースに移行しています。オープン ソースの時系列データベースがないため、PostgreSQL を選択しました。ECHO に保存していたのは、時間と値のペアだけでした。ここに問題があります。postgre で作成したテーブルは 2 つの列で構成されています。1 つ目は UTC ミリ秒 (13 桁の数字) で時刻を格納する「bigint」型で、2 つ目はデータ型が「real」型に設定された値です。約 360 万行 (30 日間の時間範囲に広がる) のデータを埋めました。短い時間範囲 (たとえば 1 日) をクエリすると、クエリに 4 秒かかりますが、ECHO の同じ時間範囲での応答時間は150ミリ秒です!これは大きな違いです。時間が遅いのは時間がかかるためと思われますが、確かではありません。クエリ時間を改善する方法を教えてください。データ型「timestamp」と「timestamptz」の使用についても読みましたが、日付と時刻を UTC 秒ではなく通常の形式で保存する必要があるようです。これはクエリ時間を短縮するのに役立ちますか?
これが私のテーブル定義です:
Table "public. MFC2 Flow_LCL "
Column | Type | Modifiers | Storage | Stats target | Description
----------+--------+-----------+---------+--------------+-------------
the_time | bigint | | plain | |
value | real | | plain | |
Indexes:
"MFC2 Flow_LCL _time_idx" btree (the_time)
Has OIDs: no
現在、時間を UTC ミリ秒単位で保存しています (bigint を使用)。ここでの課題は、時間値のペアが重複している可能性があることです。
これは私が使用しているクエリです(テーブル名、開始時刻、終了時刻を渡す単純な API を介して呼び出されます)
PGresult *res;
int rec_count;
std::string sSQL;
sSQL.append("SELECT * FROM ");
sSQL.append(" \" ");
sSQL.append(table);
sSQL.append(" \" ");
sSQL.append(" WHERE");
sSQL.append(" time >= ");
CString sTime;
sTime.Format("%I64d",startTime);
sSQL.append(sTime);
sSQL.append(" AND time <= ");
CString eTime;
eTime.Format("%I64d",endTime);
sSQL.append(eTime);
sSQL.append(" ORDER BY time ");
res = PQexec(conn, sSQL.c_str());