1

sqliteで作成したこのようなテーブルがあります。

CREATE TABLE Cars ( 

POWER DOUBLE ,
CAPACITY DOUBLE,
SPEED DOUBLE,   
TIME INTEGER  NOT NULL,
TYPE INTEGER  NOT NULL, 
MODEL INTEGER  NOT NULL,

PRIMARY KEY ( TIME, TYPE, MODEL ));

TYPE には 15 の異なる値があり、各タイプには 20 の異なる MODEL の値があります。すべてのモデルについて、10 秒ごとに新しいレコードが挿入されます。

ちょっとした例:

POWER----TIME----TYPE----MODEL
45.6     2588     3       14
46.8     2588     3       15
44.7     2588     3       16

このテーブルは、何百万行もある非常に巨大です。

ご覧のとおり、主キーは(TIME, TYPE, MODEL)一意の識別子を作成しているためです。

私のアプリケーションは選択クエリを数回実行しますが、時間範囲が広い場合、または複数のモデルに対してクエリを実行すると、非常に長い時間がかかることがあります。

たとえば、私はこのタイプのクエリを頻繁に実行します。

SELECT power, time, type, model 
FROM CARS 
WHERE type = 3 AND model = 14 AND time BETWEEN 2588 and 13550;

いくつかの状況でパフォーマンスを向上させたような主キーを試してみました(TYPE, MODEL, TIME)が、大きな時間間隔ではありませんでした。

私の質問は、このレコードの取得を最適化する方法と、この状況に最適と思われる主キーはどれですか?

挿入と更新は、パフォーマンスの面では問題になりません。

4

2 に答える 2

1

主キーのフィールドの順序は、各フィールドの選択性を反映する必要があります (選択性の高いものが最初)。

特定の時間を選択すると、特定のタイプまたはモデルよりも少ないレコードが返されるため、表面的には時間が最初に来るように見えるはずです。

ただし、クエリのほとんどまたはすべてが時間の範囲を選択する場合は、範囲の選択は特定の値よりも選択性が低いため、主キーの最後に時間を指定することをお勧めします。

主キーを (モデル、タイプ、時間) の順に変更することをお勧めします。

于 2012-08-16T12:10:11.520 に答える
1

複合キーに関する MSDN で提供されている一般的なガイダンスは、キー/インデックスのルートにカーディナリティが最も高い (つまり、最もユニークな値) 列を配置することです。

したがって、あなたの場合、キーはあなたが持っているものでなければなりません-つまり:

CREATE TABLE Cars ( 
  PRIMARY KEY ( TIME, TYPE, MODEL ),
  POWER DOUBLE ,
  CAPACITY DOUBLE,
  SPEED DOUBLE,   
  TIME INTEGER NOT NULL,
  TYPE INTEGER NOT NULL, 
  MODEL INTEGER NOT NULL
);

これは、TIME の値がわかっているクエリでのみ適切に機能します。

于 2012-08-16T12:11:47.273 に答える