2015-05-08 48 views
1

在高端設備(Lumia 930)上,Windows Phone上的簡單SQLite SELECT查詢非常緩慢。Windows Phone上的SQLite SELECT非常慢

select * from tableName 

它獲取大約15000條記錄(是的,我需要它們),通常我希望它不會這麼慢。但是,獲取所有記錄需要大約12-13秒。我正在使用SQLite.Net-PCL客戶端。

什麼可能導致它?它確實是due to the very slow wrapper?有沒有解決辦法,有什麼方法可以改進它?

編輯:我嘗試使用SQLite PCL from Microsoft Open Technologies和我手動映射屬性的屬性,我得到了更好的結果。所以看起來,行數,列數和反射的總數都會導致事物減速。我現在正在嘗試通過SQLite.NET-PCL(我正在使用的庫)公開類似的功能來了解它將如何實現。

編輯2:我標記了彼得的答案作爲我的問題的答案,因爲我能夠通過使用Prepare調用逐行手動逐個類型地手動映射類型來顯着提高性能。

+0

爲什麼你一口氣需要他們,你需要所有的專欄。我不會這樣做,除非我在高端服務器上根本沒有選擇... –

+0

您的應用程序能夠一次顯示手機屏幕上所有15000條記錄的信息嗎? –

回答

1

的SQLite可以輕鬆地從一個簡單的表格在幾分之一秒內就返回了Windows Phone(在的Lumia 920測試)15000分的記錄。

還有其他的事情導致你的糟糕表現。如果您的列數很大,那可能是個問題。根據SQLite包裝器的實現方式(我不知道),兩個可能的元兇是使用Reflection來填充結果對象或每行開銷。但是,我不知道這個包裝器是如何實現的。

加快速度(除了返回更少的數據)的方式是用C++編寫代碼並將其包裝在WinRT組件中,以便由託管應用程序調用。

+0

你能告訴我哪些庫和哪些包裝(確切版本,如果可能的話)是否用來驗證你能如此快速地獲得15000個查詢?我也想嘗試一下,看看這些是否對我造成了問題。我嘗試將列數減少到只有2,但仍然需要3秒,這仍然很糟糕(並且我沒有我需要的所有數據:)) –

+0

獲得最佳性能的方法是不使用一個包裝 - 直接針對C API寫入。我使用我自己的定製庫運行在SQLite上3.8.7.4 –

+0

我將此標記爲答案,因爲執行類型的手動映射有助於顯着提高性能。 –

0

取決於您希望從您的實體獲得哪些信息,您可以嘗試使用Query<>()方法,使您可以編寫原始SQL查詢,然後只選擇您感興趣的字段並將其映射到較輕的實體(如果可能的話)即使你讓你的所有領域Query<>()仍然應該更快。

還要檢查,如果你正在使用的SQLite鱸驅動程序WP

+0

我已經在使用'Query '執行原始查詢。我沒有使用最新的SQLite驅動程序,因爲最新的一個在執行UpdateAll/InsertAll時會拋出SQLite邏輯錯誤,但我試圖僅用於查詢,並且它需要相同的時間來獲取實體。 –