2011-04-26 83 views
1

背景:我在我的flex應用程序中使用SQLite數據庫。該數據庫的大小是4 MB和具有5代表其是如何提高SQLite數據庫的性能?

  1. 表1具有2500點的記錄
  2. 表2有8700條記錄
  3. 表3有3000條記錄
  4. 表4有5000條記錄
  5. 表5有2000條記錄。

問題:每當我運行任何表選擇查詢,它需要大約(約50秒),以從數據庫表中獲取數據。這使得應用程序在從表中提取數據時非常緩慢且無響應。

如何提高SQLite數據庫的性能,以便從表中獲取數據所需的時間減少?

感謝

+5

也許你可以告訴我們**表格有什麼結構**以及**你遇到了什麼疑問?可能的答案將是:*「使用索引」*,或*「對您的查詢進行返工」*。還要注意,SQLite拼寫爲一個L和三個大寫字母。 – Benoit 2011-04-26 11:48:10

回答

4

正如我告訴你一個評論,不知道你的數據庫由什麼結構和運行對數據的查詢是什麼,有什麼我們可以推斷暗示爲什麼你的查詢需要太多的時間。

但是,這裏有一個關於索引的有趣閱讀:Use the index, Luke!。它告訴你什麼是索引,你應該如何設計你的索引以及你可以獲得什麼好處。此外,如果您可以發佈查詢和表格模式和基數(而不是內容),它可能會有所幫助。

+0

索引作品..感謝大家.. – Nidhi 2011-04-28 06:02:48

3

您使用異步或同步執行模式嗎?它們之間的區別在於當應用程序繼續運行時異步執行在後臺運行。然後,您的應用程序將不得不聽取派發的事件,然後執行任何後續操作。但是,在同步模式下,用戶將無法與應用程序交互,直到數據庫操作完成,因爲這些操作的運行順序與應用程序的執行順序相同。同步模式在概念上更容易實現,但異步模式將產生更好的可用性。

SQLStatement.execute()第一次在SQLStatement實例上,該語句在執行前自動準備。只要SQLStatement.text屬性沒有改變,後續的調用就會更快地執行。使用相同的SQLStatement實例比一次又一次創建新實例要好。如果您需要更改查詢,請考慮using parameterized statements

您還可以使用諸如推遲在運行時需要的數據等技術。如果您只需要一部分數據,請先將其拉回,然後根據需要檢索其他數據。這可能取決於您的應用程序範圍以及您需要滿足哪些需求。

如果您有多個數據庫,使用表名指定數據庫將阻止運行時檢查每個數據庫以查找匹配的表。如果沒有指定,它還有助於防止運行時選擇錯誤的數據庫。即使您只有一個數據庫,也可以使用SELECT email FROM main.users;而不是SELECT email FROM users;。 (當您致電SQLConnection.open時,main將自動分配爲數據庫名稱。)

如果您碰巧正在對數據庫進行大量更改(多個INSERTUPDATE語句),則可以考慮將其包裝在事務中。運行時會在內存中進行更改,然後寫入磁盤。如果您不使用事務,則每條語句都會導致對數據庫文件進行多次磁盤寫入,這可能會很慢且耗費大量時間。

儘量避免任何模式更改。表定義數據保存在數據庫文件的開始處。運行時會在數據庫連接打開時加載這些定義。添加到表中的數據保存在數據庫文件中的表定義數據之後。如果更改(如添加列或表),新的表定義將與數據庫文件中的表數據混合在一起。這樣做的效果是,運行時將不得不從文件的不同部分讀取表定義數據,而不是從頭開始。 SQLConnection.compact()方法重新構造表定義數據,以便它位於文件的開始位置,但其缺點是,如果數據庫文件很大,則此方法也會消耗大量時間,更多。

最後,由於Benoit在他的評論中指出,請考慮改進您自己的SQL查詢和您正在使用的表結構。知道你的數據庫結構會有幫助,查詢是性能下降的真正原因。我的猜測是你正在使用同步執行。如果你切換到異步模式,你會看到更好的性能,但這並不意味着它必須停在那裏。

在線Adobe Flex文檔有關於improving database performancebest practices working with local SQL databases的更多信息。

0

您可以嘗試索引SELECT語句的WHERE子句中使用的某些列。您也可以嘗試最小化LIKE關鍵字的使用。

如果你將你的表連接在一起,你可以嘗試簡化表關係。

與其他人一樣,如果不知道更多關於您的架構和您正在使用的SQL的信息,就很難獲得具體的信息。

+0

索引作品..感謝大家.. – Nidhi 2011-04-28 06:03:16