2012-12-27 45 views
4

我做了一個SQLite數據庫(〜700MB,3個表,3個索引 - 1個索引和2個主鍵)。我將它標記爲只讀文件(在Windows上)。在SQLite上執行SELECT命令

從多線程執行這個數據庫的SELECT命令是否安全和高性能?

如果是這樣,怎樣才能提高性能(任何選項或標誌啓用,任何微調)?

此應用程序在C#中使用System.Data.SQLite(1.0.82.0),在x64機器上爲.NET 4.0編譯。它工作正常(不一定表演或正確平行,因爲我不知道(如何)證明他們)。目前我沒有真正的瓶頸,但很快我就會!我需要儘可能快地搜索rtree。 (在我的機器上4GB,2個核心)搜索rtree有時需要超過5毫秒。我已經使這部分多線程來處理我的數據並行。根據R-Tree(或者我認爲R * -Tree在SQLite的情況下)的結構,如果我的數據庫增長到一些GB,它應該沒有問題,因爲這些樹的深度很低,並且在大型數據集上很快。但是,如果有任何改進是可能的,那麼它應該在這個應用程序中考慮。

我不能確定已並行的部分是否真的並行運行,例如SQLite(或System.Data.SQLite)沒有內部鎖定。事實上,在一些測試中,並行版本運行速度較慢!

回答

4

這應該是安全的,前提是每個線程都有自己的連接,或者使用鎖來防止多個線程同時使用相同的連接。

+0

「* .. provided .. *」對於您來說非常重要。 – 2012-12-27 20:05:51

1

您可以設置線程支撐位:http://www.sqlite.org/threadsafe.html

的SQLite支持三種不同的線程模式:

單線程。在這種模式下,所有的互斥鎖都被禁用,並且SQLite不安全,可以同時在多個線程中使用。

多線程。在這種模式下,如果兩個或多個線程中沒有同時使用單個數據庫連接,則SQLite可以安全地用於多個線程。

序列號。在序列化模式下,SQLite可以安全地由多個線程使用,沒有任何限制。

線程模式可以在編譯時(當SQLite庫從源代碼編譯時)或啓動時(打算使用SQLite的應用程序初始化時)或運行時(當一個新的SQLite數據庫連接正在創建中)。一般來說,運行時覆蓋了開始時間和開始時間,覆蓋了編譯時間。除非單線程模式一旦選擇就不能被覆蓋。

默認模式是序列化的。

您看到的放緩是請求的序列化。改變線程模型,事情會加快。請記住,「不安全」可能同時代表讀者和作者。我不確定只有讀者的最佳模式是什麼。

+0

我只使用多線程,因爲我認爲(從它的描述),這是我應該選擇。我也測試了其他選項。問題是我不確定是否使用單線程選項進行連接,它可以在多線程應用程序中正常工作。我如何測試它是否返回正確答案? (另一個將我的數據庫移植到另一個數據庫並使用另一個數據庫測試結果;)因爲我的測試實際上使用了SQLite本身)。 –

+0

你總是可以對線程安全的序列化模式進行測試 – devshorts

+0

有時在這些情況下,我嘗試在sqlite源代碼中找到一個單元測試來檢查。確保消除你的應用正在做的任何事情。 sqlite源代碼是開放的,所以你可以通過另一個單元測試來驗證你的結果 – devshorts

3

從多個線程執行這個數據庫的SELECT命令是否安全和高性能?

最有可能

怎麼能做出更好的性能(如果可能的話)?

你的瓶頸是什麼?磁盤I/O?處理器?記憶?

使應用程序更高性能最好通過以下方法來完成:1)識別表現不佳(可以改進)的部分; 2)使這些部分更高效。有很多工具可以識別代碼中最慢的部分,所以你首先知道該怎麼處理。當程序獲得該查詢的結果並花費10秒鐘將其寫入磁盤時,從查詢中刪除10ms是沒有意義的。

您可以在應用程序(尤其是數據庫驅動的應用程序)上運行並使其運行速度更快,而不是「魔術棒」。您需要知道首先要修復

+0

我已經添加了一些更多的描述。 Thaks –