Выпадающий список автозаполнения — слишком много данных, тайм-аут

#wpf #ajax #.net-3.5 #wsdl

Вопрос:

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

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

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

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

Ответ №1:

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

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

Комментарии:

1. У меня есть это в одном, сейчас меняюсь и тестирую.

Ответ №2:

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

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

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

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

удачи!

Ответ №3:

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

Комментарии:

1. Я не подумал добавить индекс, потому что, как вы сказали, 80 тысяч имен не должны быть проблемой… но, полагаю, это не повредит.

Ответ №4:

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

Ответ №5:

Если у вас есть контроль над базовым SQL, вы можете попробовать несколько запросов «ОБЪЕДИНЕНИЕ» вместо одного запроса с несколькими строками «ИЛИ как» в предложении where.

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

Ответ №6:

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

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

это «Ce» даст вам «Кедровую рощу» и «Кедровые холмы», а также «Чатам» и «Вишневый холм», поэтому вы всегда получаете десять.

В LINQ:

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