質問

私は統計のプロジェクトのためのテーブルを持っています。

構造は次のようになります。

CREATE TABLE NewStatHistory (
    StatHistoryID uniqueidentifier PRIMARY KEY NOT NULL,
    DateEntered dateTime NOT NULL,
    DateApplies dateTime NOT NULL,
    WhoEnteredID uniqueIdentifier NOT NULL,
    PostingID uniqueIdentifier NULL,
    EnteredValue decimal(19,5) NOT NULL,
    StatID uniqueIdentifier NOT NULL,
    StatStatus int NOT NULL,
    Notes varchar(500) NULL,
    CampusID uniqueidentifier NOT NULL,
    IsTarget bit NOT NULL DEFAULT 0
)

私は、それぞれ「DateApplies」のための最も最近入力された値を引く必要があります。

このクエリは、のSQLServerにほぼ瞬時に実行されますが、SQLiteのうち、それだけの時間とで、私はそれを動作させるために最適化する方法を見つけ出すことはできません。

SELECT NewStatHistory.* 
FROM NewStatHistory
INNER JOIN (
  SELECT MAX(DateEntered) entered, statID, DateApplies
  FROM NewStatHistory
  WHERE StatID = @statID 
    AND campusID = @campusID
    AND IsTarget = 0
  GROUP BY DateApplies, statID
) summary 
ON summary.entered = newstathistory.dateEntered AND
  summary.statID = newStatHistory.statID AND 
  summary.DateApplies = newStatHistory.DateApplies
WHERE NewStatHistory.StatID = @statID AND
  IsTarget = 0 AND
  campusID = @campusID
ORDER BY NewStatHistory.DateApplies DESC

誰もが、それは仕事を得る方法についての任意のアイデアを持っています。そうでなければ、私が使用する別の組み込みDBを検索するために持っているつもりです。このクエリ以外に、SQLiteは私はそれを求めているすべてのものを行っています。

限りインデックスが行くように、のSQLServer上で、私は唯一のインデックスを作成、主キーを持っています。 SQLiteの上で、私は、主キーで試してみましたが、その後無駄にいくつかの他の列に追加しました。

サブクエリもSQLiteの上で時間がないの実行、遅いの原因となるものに参加のようです。

役に立ちましたか?

解決 2

私はそれが実際に参加するのこのタイプはよくサポートされていないことをマニュアルで指定されていますが分かりました。それを回避する方法は、サブクエリの代わりに別のテーブルを使用することです。そして、それは驚くほど速いものに戻っています。

他のヒント

あなたのクエリの実行EXPLAIN QUERY PLANが、それはこのクエリの2回のテーブルスキャンを行っていることを示唆しています。

あなたはどのようにオプティマイザの動作の詳細については、 SQLiteのクエリオプティマイザの概要のページを読むことをお勧めします

これに似た何かが(それが使用されて見て以外、テストされていない)を助けることがあります:

CREATE INDEX foo ON NewStatHistory(statID, campusID, IsTarget, DateApplies);
ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top