1

数日前にこの件に関して質問がありましたが、このクエリのパフォーマンスをどのように調整すればよいかまだ疑問に思っています。

私はこのようなテーブルを持っています(SQLite)

CREATE TABLE ZONEDATA (
TIME INTEGER  NOT NULL,
CITY INTEGER  NOT NULL,
ZONE INTEGER  NOT NULL,
TEMPERATURE DOUBLE,
SERIAL INTEGER ,
FOREIGN KEY (SERIAL) REFERENCES ZONES,
PRIMARY KEY ( TIME, CITY, ZONE));

次のようなクエリを実行しています。

SELECT temperature, time, city, zone from zonedata
WHERE (city = 1) and (zone = 1) and (time BETWEEN x AND y);

x と y は変数で、その間に数十万の変数がある場合があります。

気温の範囲は -10.0 ~ 10.0、都市とゾーンの範囲は 0 ~ 20 (この場合は 1 と 2 ですが、別の値にすることもできます)。レコードは、さまざまなゾーンや都市から約 5 ~ 6 秒の間隔で継続的に記録されます。これにより大量のデータが作成され、すべてのレコードが正しい時間順に記録されるとは限りません。

問題は、大きな時間範囲 (レコードが時間によって 100% 正しくソートされていない場所) でレコードの取得を最適化する方法です。これには、特に複数の都市やゾーンから取得する場合に、かなりの時間がかかることがあります。つまり、上記のクエリを異なるパラメーターで数回実行することを意味します。私が探しているのは、クエリ、テーブル構造 (できればそうでない)、またはその他の変更可能な設定に対する特定の変更です。

これを使用する私のアプリケーションは、c ++で実装されています。

4

3 に答える 3

1

データはすでに。で並べ替えられていTimeます。

(Time, City, Zone)同じ値を持つすべてのレコードに主キーを設定することによりTime、互いに隣接します。 (他の場所でCLUSTER INDEXを指定していない限り、SQLiteに精通していないため、それが可能かどうかはわかりません。)

ただし、特定のケースでは、必要なレコードが隣り合っていないことを意味します。代わりに、彼らは束になっています。レコードの各束は(city=1, zone=1)、同じTime値を持ちます。Time1用の1つの束、Time2用の別の束など。

これは、すべてをExcelに入れて、時間、都市、ゾーンの順に並べるようなものです。

(同じ都市とゾーンの)必要なすべてのレコードをまとめるには、それをに変更し(City, Zone, Time)ます。


ただし、all cities and zones but a time = ???私が提案したキーのクエリも完全ではない場合は、元のキーの方が適していることに注意してください。

そのため、さまざまなクエリに対して、さまざまな順序でさまざまなインデックスを追加する必要がある場合があります。


これは、特定の推奨ソリューションを提供するために、実行する特定のクエリを知る必要があることを意味します。私が提案したキー/インデックスの順序は、単純化した例には理想的かもしれませんが、実際のシナリオは、まったく異なるインデックスを保証するのに十分異なる場合があります。

于 2012-06-22T10:47:10.020 に答える
0

これらの列にインデックスを付けることができます。クエリを高速化するために内部的に並べ替えられますが、表示されません。

于 2012-06-22T10:40:18.887 に答える
0

データベースのbetween最適化は困難です。これを解決する 1 つの方法は、追加のフィールドを追加betweenして、=. たとえば、dayフィールドを追加すると、次のクエリを実行できます。

where  city = 1 and zone = 1 and day = '2012-06-22' and 
       time between '2012-06-22 08:00' and '2012-06-22 12:00'

このクエリは、インデックスが にあるため、比較的高速city, zone, dayです。

これには、適切な追加フィールドを選択するための考慮が必要です。フィールドを維持するには、追加のコードが必要です。このクエリがアプリケーションの重要なパフォーマンス パスにある場合は、その価値があるかもしれません。

于 2012-06-22T10:50:52.297 に答える