2012-07-10 254 views
8

我需要根據關鍵字獲取一些數據,該查詢被測試爲100%準確,但問題是reader的加載速度很慢。我試圖用一個不包含inner join的查詢替換這個查詢,並且加載非常快。所以我想知道,因爲我只選擇一列作爲結果,爲什麼DataTable.Load()需要這麼多時間?加載整個結果的是SQLiteExecuteReader而不僅僅是一列嗎?DataTable讀取器加載速度很慢

在使用DataTable之前,執行每個reader.Read()的平均時間爲7秒。

這是我的代碼:

_database.Connect(); 

var selectCommand = new SQLiteCommand(
@"SELECT A.ID AS MY_ID FROM MD 
INNER JOIN TMD ON MD.ID = TMD.ID_MD 
INNER JOIN TR ON TR.ID = TMD.ID_TR 
INNER JOIN P ON P.ID = TR.ID_P 
INNER JOIN DP ON DP.ID_P = P.ID 
INNER JOIN CD ON CD.ID = DP.ID_CD 
WHERE CD.DESC = @desc" 
); 

selectCommand.Parameters.AddWithValue("@desc", value); 

using (DbDataReader reader = _database.ExecuteQuery(selectCommand)) 
{ 
    DataTable data = new DataTable("MyData"); 
    data.Load(reader); 
} 
_database.Disconnect(); 
+1

這聽起來像你的查詢是簡單的。有沒有不同的方式來訪問你的表,這樣你就不必做很多連接了? – Tejs 2012-07-10 13:53:34

+0

我知道這會傷人..不幸的是,我們需要根據其中一個字段連接2個表格。鑑於當前的數據庫架構,這些連接是它們之間的唯一連接。 – iCantSeeSharp 2012-07-10 13:55:25

+0

什麼是_database,爲什麼它有像Connect和Disconnect這樣的方法?不要重新發明輪子。您還應該爲連接使用'using-statement',以確保它儘快「關閉」。這是像ASP.NET這樣的多線程環境嗎? – 2012-07-10 13:55:55

回答

2

The SQLite Query Planner提供了關於SQLite查詢優化的一些提示。

可能適用於你的問題的一些項目:

1)由於SQLite的執行你可以嘗試重新排列多個聯接:

當前實現的SQLite只使用循環連接。也就是說, 說,聯接被實現爲嵌套循環。 嵌套循環在鏈接中的默認順序是FROM子句中最左邊的表格至 形成外部循環,最右邊的表格形成內部循環。

所以,根據JOIN的構造方式,可能會有性能差異。

的SQLite試圖自動優化這一點,但據我瞭解的文檔有成功不能保證(由我亮點):

然而,SQLite的將鳥巢,如果在做不同的順序循環所以 將幫助它選擇更好的指數。 [...] 加入重新排序是自動的,通常運行良好,程序員 不必考慮它,特別是如果ANALYZE已被用於收集有關可用索引的統計信息 。 但是偶爾需要 程序員的一些提示。

2)另外,請注意,內部連接在內部轉換爲WHERE子句,因此任何在表現技巧在文檔的部分可能適用,太:

的ON和內部聯接的USING子句在上述段落1.0中的WHERE子句分析 之前被轉換爲WHERE子句的附加項。因此,對於SQLite,沒有 計算優勢,可以使用較早的SQL89連接語法而不是較舊的SQL89逗號連接語法。他們最終都在內部連接上完成了相同的事情,完成了 。

3)你可能會考慮在你的語句來選擇多個列,如果上面有任何索引:

這是沒有必要爲索引的每列出現在WHERE 爲了使用該索引,使用子句術語。但是不能是 使用的索引列中的間隔。

+0

所有連接都建立在主鍵上,我認爲這解決了索引的問題,但我真的想要考慮1 + 2是否可以成爲我的案例的救星。 – iCantSeeSharp 2012-07-10 14:31:00

+0

我在我的sql命令之前使用了'ANALYZE',查詢執行得非常快。所以,考慮到你爲這個特定問題提供了正確的方向,你會得到答案。謝謝! – iCantSeeSharp 2012-07-10 14:53:03

3

我認爲出現這種情況的SQLite由於性質和大量的聯接。

嘗試重構數據庫方案,如使數據非規範化以加快訪問速度。

+0

「SQLite的性質」是否意味着預期結果與當前返回的不同? – iCantSeeSharp 2012-07-10 13:56:21

+0

@Souvlaki:我的意思是說,SQLite不支持這麼多的連接的良好加載,也可能有一個大文件會降低最終的持久性。 – abatishchev 2012-07-10 13:58:55

+0

儘管Navicat的查詢速度相當快? – iCantSeeSharp 2012-07-10 14:03:33