2009-09-28 6 views
3

Stack Overflowers:Самая быстрая альтернатива Datatable.Select() для сужения кэшированных данных?

У меня есть функция поиска на веб-сайте моей компании (на основе .NET 2.0), которая позволяет сузить каталог товаров, используя до 9 различных полей. Прямо сейчас, после того, как вы сделаете свой выбор на интерфейсе, я создаю динамический запрос и ударяю по базе данных (SQL Server), чтобы получить полученный список номеров элементов.

Я бы хотел отойти от попадания в базу данных каждый раз и сделать все это в памяти для получения более быстрых результатов. В основном таблица «3500 - 4500 строк» ​​с 10 столбцами: номер позиции (который может быть первичным ключом) и 9 полей атрибутов (которые повторяют значения для многих строк). Там может быть любое количество различных запросов между 9 столбцов, чтобы получить элементы, которые вы хотите:

  • Столбец A = «Foo» и столбец D = «бар»
  • Колонка B = «Foo» и столбца C = 'бар' И Колонка I = 'я'
  • Колонка H = 'Foo'
  • и т.д ...

на основании своих исследований, функция .Select(), кажется, как самый медленный путь к выполните поиск, но мне это кажется самым быстрым и простым способом выполнить сужая поиск, чтобы получить список номеров позиций:

MyDataSet.Select("Column B = 'foo' AND Column E = 'bar' AND Column I = 'me'") 

В моем конкретном случае, какой метод вы предлагаете я использовать в качестве альтернативы, которая имеет такую ​​же функциональность сужающейся и лучшую производительность, вместо разрешения на datatable.select () метод?

ответ

2

Datatables не оптимально построены для запроса, я бы не рекомендовал идти по этому маршруту, если у вас действительно есть документально подтвержденная проблема с производительностью, которую вы, несомненно, улучшите, сделав это.

Если ваши динамические запросы медленные, это, вероятно, потому, что вы не указали таблицу правильно в своей базе данных. Базы данных предназначены для оптимального запроса ваших данных, поэтому моя догадка заключается в том, что небольшая работа на стороне базы данных должна заставить вас туда, куда вам нужно идти.

Если вам действительно нужно запрашивать данные ADO.Net, обязательно прочитайте Scaling ADO.Net DataTables. В нем рассказывается о том, что вы можете сделать, чтобы ускорить их работу, и дает вам некоторые ориентиры, чтобы вы могли видеть разницу.

+0

Извините, я должен был указать, что динамические запросы, которые я выполняю в настоящее время, довольно быстр, поскольку все индексируется правильно, я просто хочу, чтобы приложение запускалось еще быстрее, не переходя через провод вообще, если это мне не нужно , – NinjaBomb

+0

@NinjaBomb: вы все равно будете проходить через провод (между клиентом и сервером) с помощью этого подхода. Все, чего вам следует избегать, - это поездка между сервером и базой данных (что ни в коем случае не должно быть для вас узким местом), и это дорого стоит большой памяти сервера. – MusiGenesis

+0

Что думают эксперты о кэшировании наборов результатов, которые я получаю из базы данных, если кто-то повторяет тот же самый поиск за определенный промежуток времени? – NinjaBomb

3

Ваша лучшая альтернатива - позволить вашей базе данных делать то, что лучше: запросы и фильтрация данных.

Кэширование таблиц данных (особенно с 3500-4500 строк) - плохая идея для веб-приложений. Вызов Select() в DataTable не уменьшает количество строк в DataTable - он возвращает новую коллекцию строк (скопированных с оригинала), а это значит, что вы все равно будете иметь исходные 4000 строк, находящихся в кеше. Лучше вообще ничего не делать в кеше, и просто получите нужные вам строки , когда пользователь запрашивает их.

DataTables (и DataSets) лучше всего использовать с жирными клиентами (обычно приложениями Windows), которые должны работать с копиями данных базы данных в памяти в отключенном состоянии.

Смежные вопросы