2012-02-28 199 views
-1

對不起,只是清除我的問題。擴展這一問題Optimizing sqlite query爲什麼第一個查詢比第二個查詢快?

我有一個表:

CREATE TABLE IF NOT EXISTS [app_status](
[id] INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL , 
[status] TEXT DEFAULT NULL, 
[type] INTEGER 
) 

我有兩個指標。一個在status上,另一個在type上。哪個查詢運行得更快,爲什麼?

SELECT COALESCE(min(type), 0) 
    FROM app_status 
WHERE status IS NOT NULL 
    AND type IN (1,2) limit 1 

查詢計劃O/P

0|0|0|SEARCH TABLE app_status USING INDEX idx_type (mailbox_type=?) (~10 rows) 
0|0|0|EXECUTE LIST SUBQUERY 1 

或者......

SELECT type FROM 
app_status WHERE 
status IS NOT NULL 
ORDER BY type limit 1 

查詢計劃O/P

0|0|0|SCAN TABLE app_status USING INDEX idx_type (~500000 rows) 
+3

你生成執行計劃? – Randy 2012-02-28 17:29:43

+0

@Randy我添加了查詢計劃o/p,但無法理解哪裏有太大差異bw /有兩個查詢計劃o/p – 2012-02-28 17:43:53

+1

查詢可能不會返回相同的結果,這可能會解釋計劃中的差異 – Sparky 2012-02-28 17:49:50

回答

2

第一個查詢返回零或一行匹配WHERE子句中的條件(where status is not null and type in (1,2),in未指定的順序。

第二個查詢查找符合WHERE子句中條件的所有行(where status is not null),按類型對它們進行排序,然後返回零或1行。

你應該注意兩個查詢,雖然他們可能返回相同的結果,不保證。特別是,第二個查詢返回的行將按照type的順序返回結果集的第一行,而不管type是什麼值。如果type的最低值是「狀態不爲空」,比如157,那麼這就是你將要獲得的行。在這種情況下,第一個查詢將返回0行。

但假設typestatus被索引,並且查詢可以使用一個或多個索引,那麼我的懷疑是第一個查詢會更快,因爲它可以直接查找所需的行。

不過這很大程度上取決於數據的形狀(有多少數據呢?它是如何分配的?等等),指數是否是「覆蓋」(如果索引沒有覆蓋中的所有列查詢的話,就必須做額外的I/O,以獲得覆蓋所有列所需的數據頁(S)。

編輯注意看着你張貼的執行計劃(不知道Sqllite),第一計劃說它應該返回約10行;第二約50,000行,你認爲哪一個可能會更快?

+0

我將在該表中只有2000行。 和問題標記我有類型和狀態的索引。 – 2012-02-28 18:04:33

2

你應該:

CREATE INDEX idx_app_staus ON app_status (status, type) 

這樣的數據庫angine將不必查找所有的行,它可以找到它所需要的where子句中的確切行。我不知道是哪個查詢速度更快becouse他們不返回相同的結果集,但以上所有這些類型的查詢的指數將是快速的。其他兩個指數可能會被丟棄。

+0

執行計劃中有完整的tablle掃描。我認爲你是對的,通過假設沒有索引的where子句是問題。 – 2012-02-28 18:35:03

相關問題