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

标签 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 上立即执行,所以它似乎是导致缓慢的连接。

最佳答案

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

您可能想阅读 The SQLite Query Optimizer Overview有关优化器如何工作的更多信息的页面

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

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

关于optimization - SQLite 查询优化(子查询和连接),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1055132/

相关文章:

php - MySQL一行中的几个ID与另一张表连接

r - 在 R 中使用字符和列总和约束的 lpSolve

mysql - 如何使用左连接获取所有行并获取第二个表中的最新行

javascript - Require JS 优化/串联网站文件的部署策略

java - 删除 android 数据库后 getReadableDatabase() 不会创建新数据库

ios - 对象引用未设置到对象的实例 - Select 语句 Sqlite Xamarin iOS

node.js - Node.js 中的异步编程排序问题

Mysql连接查询;它是什么以及我如何实现它?

c# - 优化两个非常大的列表的 C# 循环比较

多个表上的 MySQL 共享 key