代码之家  ›  专栏  ›  技术社区  ›  Jared

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

  •  3
  • Jared  · 技术社区  · 17 年前

    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
    )
    

    我需要为每个“DateApplys”提取最近输入的值。

    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
    

    就索引而言,在SqlServer上,我只索引了主键。在SQLite上,我只尝试了主键,但后来添加了其他几个列,但无济于事。

    2 回复  |  直到 14 年前
        1
  •  4
  •   Hasturkun    17 年前

    跑步 EXPLAIN QUERY PLAN

    The SQLite Query Optimizer Overview 有关优化器工作原理的更多信息,请访问页面

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

    CREATE INDEX foo ON NewStatHistory(statID, campusID, IsTarget, DateApplies);
    
        2
  •  2
  •   Jared    17 年前

    推荐文章