Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/sqlite/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Optimization SQLite查询优化(子查询和联接)_Optimization_Sqlite_Join_Subquery - Fatal编程技术网

Optimization SQLite查询优化(子查询和联接)

Optimization SQLite查询优化(子查询和联接),optimization,sqlite,join,subquery,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

我有一个统计项目的表格

结构如下:

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上立即执行,因此似乎是连接导致了速度变慢。

在查询上运行
EXPLAIN QUERY PLAN
表明它正在为此查询执行两次表扫描

您可能需要阅读第页以了解有关优化器如何工作的更多信息

类似于此的内容可能会有所帮助(未经测试,而不是看到它正在使用):


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

表中有哪些索引,在查询速度快的SqlServer版本中,以及在查询超时的SQLite版本中?我怀疑索引的不同可能有助于解释和解决这个问题。
CREATE INDEX foo ON NewStatHistory(statID, campusID, IsTarget, DateApplies);