C # WinForms самый быстрый способ запросить MS Access

#c# #winforms #ms-access

#c# #winforms #ms-доступ

Вопрос:

Возможно, это глупый вопрос, но я хотел быть уверенным. Я создаю приложение Winforms и использую c # oledbconnection для подключения к базе данных MS Access. Прямо сейчас я использую «ВЫБРАТЬ * ИЗ имя_таблицы» и перебираю каждую строку, чтобы увидеть, соответствует ли это строке с нужными мне критериями, а затем вырываюсь из цикла, если это так. Интересно, улучшилась бы производительность, если бы я использовал что-то вроде «SELECT * FROM table_name WHERE id=something», так что в основном используйте оператор «WHERE» вместо перебора каждой строки?

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

1. Вы пробовали это?

2. Без WHERE этого база данных передает больше данных в ваше приложение. Это будет более очевидно по мере увеличения количества строк или если ваша база данных размещена в облаке или где-то еще, кроме локальных устройств. Загрузка всех данных на клиент может занять 10 минут, но база данных, вероятно, будет выполнять поиск намного быстрее.

Ответ №1:

Лучший способ проверить производительность чего-либо — это протестировать. В противном случае делается много предположений о том, что является лучшим по сравнению с реальностью производительности.

С учетом сказанного, в 100% случаев использование предложения WHERE будет лучше, чем извлечение данных с последующей фильтрацией через цикл. Это происходит по нескольким разным причинам, но в конечном итоге вы фильтруете данные в столбце перед извлечением всех столбцов, а не извлекаете все столбцы и затем отфильтровываете данные. С реляционными данными следует обращаться в соответствии с логикой set, то есть так, как работает предложение WHERE, в соответствии с набором данных. Цикл не имеет заданной логики и сравнивает каждую отдельную строку, что обходится дорого, отбрасывая те, которые не соответствуют критериям.

Однако не верьте мне на слово. Попробуйте. Особенно попробуйте это, когда в вашем приложении много данных в таблице.

Ответ №2:

Да, конечно.

если у вас есть файл базы данных access — скажем, общий в папке. Затем вы развертываете свое настольное приложение .net на каждой рабочей станции?

И, кроме того, скажем, в таблице 1 миллион строк.

Если вы сделаете это:

 SELECT * from tblInvoice WHERE InvoiceNumber = 123245
 

Затем ТОЛЬКО одна строка перемещается по сетевому каналу — и это справедливо, ДАЖЕ если в таблице 1 миллион строк. Для обхода и извлечения 1 миллиона строк потребуется ОГРОМНОЕ количество времени, но если вы добавите критерии к своему выбору, то в этом случае будет примерно в 1 миллион раз быстрее извлекать одну строку, а не всю таблицу.

И скажите, является ли это / было многопользовательским? Опять же, даже в сети — снова будет извлечена ТОЛЬКО ОДНА запись, соответствующая вашим критериям. Единственное требование для этого «однократного извлечения» по сети? Механизм доступа к данным должен иметь пригодный для использования индекс по этому критерию. Конечно, по умолчанию столбец PK (ID) всегда имеет этот индекс — так что не беспокойтесь. Но если, как указано выше, мы извлекаем номера счетов-фактур из таблицы, то для того, чтобы механизм обработки данных извлекал только одну строку, требуется иметь индекс в этом столбце (InvoiceNumber). Если индекс не может быть использован — тогда все строки за кулисами извлекаются до тех пор, пока не произойдет совпадение — и по сети, то это означает, что значительные объемы данных будут извлекаться без этого индекса по этой сети (или, если локально, затем извлекаются из файла на диске).