Автозаполнение Dropdown - слишком много данных, тайм-аут - PullRequest
2 голосов
/ 07 октября 2008

Итак, у меня есть выпадающее меню автозаполнения со списком населенных пунктов. Первоначально у меня было только 20 или около того, что у нас было в базе данных ... но недавно мы заметили, что некоторые из наших данных находятся в других округах ... даже в других штатах. Таким образом, ответом на это была покупка одной из этих баз данных со всеми городами США (да, я знаю, геокодирование - это ответ, но из-за нехватки времени мы делаем это, пока у нас нет времени для этой функции).

Итак, когда у нас было 20-25 городов, автозаполнение работало звездно ... теперь, когда есть 80 000, это не так просто.

Когда я печатаю, я думаю, что лучший способ сделать это по умолчанию в этом состоянии, тогда будет намного меньше. Я добавлю на страницу селектор состояний, который по умолчанию установлен в Нью-Джерси, тогда вы можете выбрать другое состояние, если это необходимо, это сузит список до <1000. Хотя, возможно, у меня возникла та же проблема? Кто-нибудь знает об обходе автозаполнения с большим количеством данных? </p>

я должен опубликовать кодексы моего веб-сервиса?

Ответы [ 6 ]

10 голосов
/ 07 октября 2008

Вы пытаетесь выполнить автозаполнение после ввода только 1 символа? Может быть, подождать до 2 или более ...?

Кроме того, вы можете просто вернуть первые 10 строк или что-то еще?

2 голосов
/ 07 октября 2008

Похоже, ваше приложение задыхается от объема возвращаемых данных, а затем пытается их отобразить в браузере.

Я предполагаю, что ваша база данных имеет правильные индексы, и у вас нет проблем с производительностью там.

Я бы ограничил результаты вашего обслуживания не более, чем 100 результатами. Пользователи не будут смотреть на что-либо еще.

Я бы также извлекал данные из службы только после ввода 2 или 3 символов, что еще больше уменьшит объем запроса.

Удачи!

1 голос
/ 07 октября 2008

Если у вас есть контроль над базовым SQL, вы можете попробовать несколько запросов "UNION" вместо одного запроса с несколькими строками "как OR" в предложении where.

Ознакомьтесь с этой статьей по оптимизации SQL.

1 голос
/ 07 октября 2008

Я думаю, вы на правильном пути. Используйте серию каскадных входов, State -> County -> Township, где каждый последующий захватывает потенциальную популяцию, основываясь на значении предыдущего. Каждый вход будет проверяться относительно его потенциальной популяции, чтобы избежать ложных входов. Я бы предложил кэшировать промежуточные результаты и запрашивать у них автоматическое заполнение вместо того, чтобы каждый раз возвращаться к базе данных.

1 голос
/ 07 октября 2008

Может быть, глупый вопрос, но ... вы проверили, чтобы убедиться, что у вас есть индекс в столбце названия города? Я бы не подумал, что имена в 80 тыс. Должны подчеркивать вашу базу данных ...

0 голосов
/ 07 октября 2008

Я бы просто ограничил SQL-запрос предложением TOP. Мне также нравится использовать «меньше чем» вместо:

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);
...