2016-11-15 4 views
0

データベースに履歴結果をファイルに記録しています。%(mod)演算子と干渉している他の行なしですぐにデータを選択

結果は

CREATE TABLE Data (TimeID INTEGER NOT NULL REFERENCES StartTimes, 
        TimeOffset REAL, 
        SensorID INTEGER NOT NULL REFERENCES Sensors, 
        Value REAL); 

が作成したテーブルに記録されている私は、インデックスを超える(TIMEID、TIMEOFFSET)を持っており、必要に応じてより多くを作成することができます - 私のINSERTのパフォーマンスは、当面の罰金で、うまくいけば残るべきそう。

Iは%sは(SensorID = 1とROWID%5 = 0)または(SensorID =」の効果ストリングによって置き換えられる

SELECT SensorID, TimeOffset, Value from Data 
WHERE ((TimeID = %d AND TimeOffset BETWEEN %f AND %f) AND 
(%s)); 

を使用してグラフ上にデータを配置するデータを読み出します2、ROWID%5000 = 0)」、%dはプリペアドステートメントの定数値、%fはグラフの限界に対応するようにバインドされています。

ここで問題になるのは、2つのセンサーが等しい速度、1つのポイントを記録していて、モジュラスを取るために使用する値が例えば1になった場合です。 2、私は1つのセンサーからすべてのデータを取得し、他のものから何も得ていない(私は思う?)。

私は(多分、私は完全に声明をmiswrittenました)非常に長い時間のために

SELECT COUNT(lesser.TimeOffset) as NewID, D.TimeOffset from Data as D 
LEFT OUTER JOIN Data as lesser on D.rowid > lesser.rowid and D.TimeID=%d and D.SensorID=1 
GROUP BY D.TimeOffset; 

けど(TIMEIDの値の例を使用して)コマンドラインコマンドラインプロセスのを使用してみました。

これらの種類の制約(TimeID =?、TimeOffset-BETWEEN-AND?)を使用してデータのサブセットを選択し、他の測定値の書き込みに影響されないコレクションをSensorIDですばやく取得できますか?

理想的には、MIN(x)とMAX(x)を使用してTimeOffsetの特定の範囲で最高値と最低値を見つけることができるようにしたいと思いますが、私は動かすことができます - 私はSQL(ite)初心者です)。したがって、%演算子を選択しました。

編集 - 例目次:私構成されるデータと

SELECT * from Data LIMIT 10; 

TimeID|TimeOffset|SensorID|Value 
1|0.0|1|0.464069664478302 
1|0.0|2|0.0 
1|0.00100000004749745|2|0.00251327152363956 
1|0.0020000000949949|2|0.00502652721479535 
1|0.00300000002607703|2|0.00753975100815296 
1|0.00400000018998981|2|0.010052926838398 
1|0.00499999988824129|2|0.0125660402700305 
1|0.00600000005215406|2|0.0150790736079216 
1|0.00700000021606684|2|0.0175920110195875 
1|0.00800000037997961|2|0.0201048385351896 

私が1Hzの時のセンサ#1と0と1の間の乱数を持っている(実装をテストするために使用される)、および正弦1kHzで#2として波動する。 (これらは一度に1点ずつ書かれていませんが、私はまだ十分にrowid%xを使って自分自身を足で撃つことができると感じています)

TimeOffsetは、 StartTimeテーブルのStartTime(YmDHMSなど)。

正当化

画面上ではるかに少ないピクセルは、関連するタイムスパンに配置するのに利用できるポイント数よりも多くの場合があるので、唯一のいくつかのポイントを選択すると、私はデータの量を削減することが賢明ですデータベースからの読み取りを試みます。

%演算子を使用すると、等間隔の点が得られますが、状況によってはデータの形が簡単に失われる可能性があります。

最小/最大デシメーションを使用すると、これを防ぐことができますが、使用するには、たとえばタイムゾーンに対応する各タイムパンの最小値と最大値を見つける必要があります。ピクセルの幅クエリ内でこれを実行しないと、データベースのすべてのデータをグラフの境界線の間に読み込む必要があります。

+0

センサーごとに別のテーブルを使用することも考えられますが、それはより速いアイデアであるとは確信していません。それは問題から他のセンサーの結果を取り除くが、それは価値があるかもしれない。 – chrisb2244

+0

テーブルの内容、現在検索された結果とそのクエリ、および希望する結果の例を追加すると便利です。 – FDavidov

+0

'WITH'節がクエリをかなり大幅に改善できるようです。私はそれらを使って完全な 'Data'テーブルのほんの一部を取って、そのサブセットに対して' ON'節の追加の制約なしに 'JOIN'を実行することができます(これは、問題)。サブクエリはインデックスを使用できないのですか?あるいは、私の投稿されたクエリは 'JOIN'を過ぎてしまうことはありませんか? – chrisb2244

答えて

1

データ取得シリーズ内のエントリのインデックスをサブクエリで計算できますが、それは遅くなります。

不要な行をフィルタリングする最も効率的な方法は、おそらくプログラムでこれを行うことです。つまり、すべてを正しい順序で照会し、それぞれnth以外のすべてを処理します。 (これはソートが必要ですが、結果は既にによるインデックスにソートされているので、何もORDER BY TimeID, TimeOffsetかかりません。)

あなたはcovering indexを使用してクエリーをさらに向上させますが、このテーブルの可能性があり、clustered index(PKと最初の3つの列の上で)より良いでしょう。 TimeID, SensorID, TimeOffsetonly the right-most used column in an index can optimize inequalitiesなので、列順を作ってください。

+0

私は 'SELECT'文を使うとき、' TimeID、SensorID、TimeOffset'の順番で制約を使うべきですが、私はただチェックしたいと思っています。列は 'CREATE TABLE'によって格納され、パフォーマンスにも影響を与えますか?私は 'WITHOUT ROWID'テーブルを使ってみて、どうやっているのか見てみましょう。これはあなたが言うように(配列インデックスを使うことができるので)データベースではなくアプリケーションで処理できる限り可能です。 – chrisb2244

+0

SELECTステートメントでの順序は重要ではなく、インデックス内の順序のみです。 (クラスタ化されたインデックスでは、それがテーブルの順序です。) –

+0

よくチェックしてみました。クラスタ化されたインデックスを再読み込みします。 – chrisb2244

関連する問題