SQLite查询优化(子查询和连接)

时间:2009-06-28 15:48:15

标签: optimization sqlite join subquery

我有一个统计项目表。

结构是这样的:

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上执行,因此它似乎是导致缓慢的连接。

2 个答案:

答案 0 :(得分:4)

在您的查询上运行EXPLAIN QUERY PLAN表明它正在为此查询执行2次表扫描。

您可能需要阅读The SQLite Query Optimizer Overview页面,了解有关优化程序如何工作的更多信息

类似于此的东西可能有所帮助(未经测试,除了看到它被使用):

CREATE INDEX foo ON NewStatHistory(statID, campusID, IsTarget, DateApplies);

答案 1 :(得分:2)

我发现在文档中实际指出这种类型的连接不受支持。绕过它的方法是使用另一个表而不是子查询。然后又回到了快速的状态。