Производительность: должен ли я сделать один или несколько запросов к базе данных
У меня есть программа на C #, которая должна обрабатывать около 100 000 элементов, а доступ ADO.NET к базе данных SQL Server, и в одной части программы мне нужно принять решение о производительности:
Обработка Durring, для каждого элемента я должен читать данные из базы данных:
должен ли я запрашивать базу данных один раз для каждого элемента, или я должен запрашивать один раз в начале для всех элементов и хранить это 100 000 строк данных (около 10 столбцов – int и string) в объекте c # в памяти и извлекать из него требуемые данные?
Если у вас достаточно статический набор данных и достаточная память для чтения всего, и сохранить результаты, кэшированные без голодания памяти, остальная часть вашей системы, ответ очень прост: вы должны это сделать.
Для каждой операции БД есть два основных компонента: стоимость передачи данных и стоимость поездки туда и обратно. В вашем случае стоимость передачи данных фиксирована, поскольку общее количество байтов не изменяется в зависимости от того, извлекаете ли вы их все сразу или получаете их по одному фрагменту за раз.
Стоимость поездки туда и обратно включает время, необходимое RDBMS для определения того, какие данные вам нужны из инструкции SQL, определения этих данных и всей блокировки, необходимой для обеспечения того, чтобы данные, которые она вам обслуживала, были согласованы. Один поезд туда-обратно не дорогой, но когда вы делаете это 100 000 раз, расходы могут очень сильно стать непомерно высокими. Поэтому лучше всего сразу прочитать данные, если это позволяет ваша конфигурация памяти.
Еще одна проблема заключается в том, насколько динамичны ваши данные. Если шансы на изменение ваших данных за время, затрачиваемое на обработку всего набора, высоки, вы можете принять дополнительные меры предосторожности, чтобы узнать, нужно ли вам перерабатывать что-либо после выполнения ваших вычислений.
Я не уверен, что вы подразумеваете под обработкой, но часто, если эта обработка может быть выполнена на сервере db, то предпочтительным вариантом будет запуск хранимой процедуры и передача ему аргументов. Затем вам не нужны круглые поездки и т. Д. Вы должны принять решение о том, хотите ли вы довести данные до обработки (от db до приложения) или довести обработку до данных (код обработки до хранимой процедуры).