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 回答