2009-06-28 86 views
3

我有一個統計項目表。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

回答

2

我發現它實際上在文檔中指定了這種類型的連接不被很好的支持。解決它的方法是使用另一個表而不是子查詢。然後它回到了快速的速度。

4

在您的查詢上運行EXPLAIN QUERY PLAN表明它正在爲此查詢執行2個表掃描。

您可能要在優化的工作原理相似,這可能有助於

東西(未經測試,比看到它正在使用其他)閱讀The SQLite Query Optimizer Overview頁面瞭解更多信息:

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