2008-10-07 215 views
2

所以,我有一個自動完成下拉列表的鄉鎮名單。起初我只有20個左右的數據庫......但最近,我們注意到我們的一些數據存在於其他縣......甚至其他州。因此,答案就是在美國所有城鎮購買這些數據庫中的一個(是的,我知道,地理編碼是答案,但由於時間限制,我們正在這樣做,直到我們有時間完成此功能)。自動完成下拉菜單 - 太多的數據,超時

因此,當我們有20-25個城鎮時,自動完成功能非常出色......現在有80,000個並不容易。

正如我所鍵入的,我認爲最好的方法是默認這個狀態,那麼會少得多。我會添加一個狀態選擇器到默認爲NJ的頁面,如果需要的話你可以選擇另一個狀態,這將把列表縮小到< 1000.雖然,我可能有同樣的問題?有沒有人知道有很多數據的自動完成工作?

我應該發佈我的web服務的codez?

回答

10

您是否在嘗試自動完成後只鍵入1個字符?也許等到2或更多......?

此外,你可以只返回前10行,或什麼?

+0

我有它的一個,現在和測試改變。 – 2008-10-07 00:28:10

1

也許愚蠢的問題,但...你有檢查,以確保你有一個鎮名字欄索引?我不認爲80K名稱應該強調你的數據庫...

+0

我沒有想過要添加一個索引,因爲像你說的那樣,80k的名字不應該是一個緊張......但它不會傷害我想。 – 2008-10-07 00:27:25

2

聽起來像你的應用程序正在窒息正在返回的數據量,然後試圖由瀏覽器呈現。

我假設你的數據庫有合適的索引,並且你沒有性能問題。

我會將您的服務結果限制爲不超過100個結果。用戶不會只看到任何方式。

一旦輸入2或3個字符,我也只能從服務中檢索數據,這將進一步縮小查詢的範圍。

祝你好運!

1

我認爲你是在正確的軌道上。使用一系列級聯輸入,州 - >縣 - >鄉,其中每個成功的人根據前一個的值獲取潛在人口。每個輸入將根據其潛在人口進行驗證,以避免虛假輸入。我建議緩存中間結果並針對自動完成查詢它們,而不是每次都回到數據庫。

1

如果您擁有底層SQL的控制權,那麼您可能需要嘗試使用幾個「UNION」查詢,而不是使用where子句中的多個「OR」行來查詢一個查詢。

檢出this article關於優化SQL。

0

我只是用TOP子句限制SQL查詢。我也喜歡用「小於」,而不是像:

select top 10 name from cities where @partialname < name order by name; 

說,「策」給你「錫達格羅韋」和「雪松諾爾斯」,還要「查塔姆」 &「櫻桃山」,讓您始終得到十個。

在LINQ:

var q = (from c in db.Cities 
     where partialname < c.Name 
     orderby c.Name 
     select c.Name).Take(10);