3

統計プロジェクト用のテーブルがあります。

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

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

誰でもそれを機能させる方法についてアイデアを持っています。それ以外の場合は、使用する別の組み込みデータベースを見つける必要があります。このクエリ以外に、SQLite は私が要求したすべてのことを実行しました。

インデックスに関する限り、SqlServer では主キーのみにインデックスを付けています。SQLite では、主キーのみを使用してみましたが、他のいくつかの列に追加しても無駄でした。

サブクエリはSQLiteでもあっという間に実行されるので、遅い原因はジョインのようです。

4

2 に答える 2

4

クエリを実行EXPLAIN QUERY PLANすると、このクエリに対して 2 つのテーブル スキャンが実行されていることがわかります。

オプティマイザーの仕組みの詳細については、SQLite クエリ オプティマイザーの概要ページをお読みください。

これに似たものが役立つ場合があります(使用されていることを除いて、テストされていません):

CREATE INDEX foo ON NewStatHistory(statID, campusID, IsTarget, DateApplies);
于 2009-06-28T16:13:20.623 に答える
2

このタイプの結合は十分にサポートされていないことがドキュメントで実際に指定されていることがわかりました。これを回避する方法は、サブクエリの代わりに別のテーブルを使用することです。その後、非常に高速に戻ります。

于 2009-07-24T23:24:53.847 に答える