2009-06-16 76 views
1

我打算以此爲基準,但由於它的工作量很大,我想檢查一下,如果我以前沒有錯過任何明顯的答案。Sqlite子查詢:在一個大的查詢或在for循環?

我有一個巨大的查詢,獲取與子查詢每行的一些更多的細節。

然後,每行被用在插入ListView的ListAdapter中,因此另一個循環將逐一取出每一行以使其成爲ListItem。

你覺得更重要的是有效的:

  • 保持子查詢的SQL一塌糊塗,在SQL引擎計數做出優化。
  • 取出ListAdapter循環中的子查詢,所以我們懶加載顯示的細節:更可讀,但恐怕太多的命中會減慢過程。

兩個重要的事情:

  • 我不能重寫大SQL塊擺脫子查詢。我知道這會更好,但我沒有這樣做。
  • 據我所知,一個列表不會包含超過1000個項目,而且它是一個桌面應用程序,所以沒有併發性。這與在這種情況下關心perf有關嗎?如果沒有,我仍然有興趣回答一個高交通網站。很高興知道...

回答

2

SQlite是一個出人意料的好引擎,但它不是真正的額外的聰明的優化,我不會認爲它是一個「高流量的網站」。一個重要的優點是它可以在進程內運行,因此與一個大查詢相比,多個查詢的開銷非常小;如果這是最簡單的代碼,對於您的特定用例,我真的會考慮它(並且以「延遲加載」的方式執行,就像您提示的那樣,實際上可能會使數據的第一個屏幕顯得更快!)。正如你懷疑的那樣,在你的用例中,這不太可能成爲性能瓶頸,所以更簡單,因此更可靠的編碼是一個重要的優點。

如果我正在做一個高流量的站點,並使用更豐富的「重」引擎,如PosgtreSQL,Oracle,SQL Server或DB2,我會更信任優化器。然而,我注意到的一件事是,我經常(可能並非總是)將子查詢轉換爲連接,並且往往會提高性能(連接使優化器可以更容易地使用好的索引,我認爲 - - 我自己從來沒有編寫過SQL優化器,但是我的印象是從許多引擎的查詢執行計劃中尋找替代形式的查詢......當然,假設你有很好的索引! - ) - 這個會當然,必須用特定案例的基準來證實,但這將是我最初的工作假設。

1

如何使用遊標?

我寧願使用一個大的查詢,讓我的SQL引擎優化我的查詢。 另外我想不出一個例子,最好是在SQL外執行循環,而不是使用「大」查詢或使用遊標。

但是要知道最好的方法是以基準作爲基準。

祝你好運!

+0

我已經在使用光標,但我沒有意識到它會解決部分問題。 :-) – 2009-06-16 08:08:38