SQLite查询优化(子查询和加入)

问题描述:

我有一个统计项目表。SQLite查询优化(子查询和加入)

结构是这样的:

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上执行,所以它似乎是导致速度慢的连接。

+0

表中有哪些索引,无论是在SqlServer版本中查询速度快,还是在SQLite版本中超时?我怀疑索引的差异可能有助于解释和解决问题。 – 2009-06-28 15:56:04

我发现它实际上在文档中指定了这种类型的连接不被很好的支持。解决它的方法是使用另一个表而不是子查询。然后它回到了快速的速度。

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

您可能要在优化的工作原理相似,这可能有助于

东西(未经测试,比看到它正在使用其他)阅读The SQLite Query Optimizer Overview页面了解更多信息:

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