我有一个统计项目的表。

结构是这样的:

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

我发现了它,这种类型的联接是不能很好地支持文档中实际确定的。要解决它的方法是使用另一个表,而不是一个子查询的。然后,它的回正极快。

其他提示

在查询运行EXPLAIN QUERY PLAN表明,它正在做2个扫描该查询。

您可能需要阅读 SQLite的查询优化概述页关于如何优化工作的更多信息

类似于这样可以帮助(未经测试,比看到它正在使用其他):

CREATE INDEX foo ON NewStatHistory(statID, campusID, IsTarget, DateApplies);
许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top