2

所以,我有一个带有乡镇列表的自动完成下拉列表。最初我只有数据库中的 20 个左右……但最近,我们注意到我们的一些数据位于其他县……甚至其他州。因此,答案是购买美国所有城镇的数据库之一(是的,我知道,地理编码是答案,但由于时间限制,我们会这样做,直到我们有时间使用该功能)。

因此,当我们有 20-25 个城镇时,自动完成功能非常出色……现在有 80,000 个城镇,这并不容易。

当我打字时,我认为最好的方法是默认为这种状态,那么就会少得多。我将在默认为 NJ 的页面上添加一个状态选择器,然后您可以根据需要选择另一个状态,这会将列表缩小到 < 1000。不过,我可能有同样的问题?有谁知道使用大量数据自动完成的工作?

我应该发布我的网络服务的代码吗?

4

6 回答 6

10

您是否尝试在仅输入 1 个字符后自动完成?也许等到2个或更多......?

另外,你可以只返回前 10 行吗?

于 2008-10-07T00:26:09.957 回答
2

听起来您的应用程序因返回的数据量而窒息,然后尝试由浏览器呈现。

我假设您的数据库具有正确的索引,并且您在那里没有性能问题。

我会将您的服务结果限制为不超过 100 个结果。用户不会再看任何其他方法。

一旦输入 2 或 3 个字符,我也只会从服务中检索数据,这将进一步缩小查询范围。

祝你好运!

于 2008-10-07T00:27:08.287 回答
1

可能是愚蠢的问题,但是...您是否检查过以确保您在城镇名称列上有索引?我不认为 80K 名字应该给你的数据库带来压力......

于 2008-10-07T00:26:10.940 回答
1

我认为你在正确的轨道上。使用一系列级联输入,州 -> 县 -> 乡镇,其中每个后续输入根据前一个的值获取潜在人口。每个输入都将根据其潜在人口进行验证,以避免虚假输入。我建议缓存中间结果并针对它们进行查询以进行自动完成,而不是每次都返回数据库。

于 2008-10-07T00:28:57.300 回答
1

如果您可以控制底层 SQL,您可能需要尝试多个“UNION”查询,而不是一个在 where 子句中包含多个“OR like”行的查询。

查看这篇关于优化 SQL 的文章。

于 2008-10-07T00:43:40.017 回答
0

我只是用一个 TOP 子句来限制 SQL 查询。我也喜欢使用“小于”而不是类似:

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

那个“Ce”会给你“Cedar Grove”和“Cedar Knolls”,还有“Chatham”和“Cherry Hill”,所以你总是得到十个。

在 LINQ 中:

var q = (from c in db.Cities
        where partialname < c.Name
        orderby c.Name
        select c.Name).Take(10);
于 2008-10-07T03:58:42.400 回答