После fair amount исследование и некоторые ошибки, Я модифицировал свой код так, чтобы он создавал новый DataContext каждый раз, когда запрашивается база данных или данные вставляются. Часто запрашивается база данных - для каждой из 250 000 транзакций, которые обрабатываются, запрашивается база данных для получения идентификатора клиента, идентификатора отдела и категории перед вводом транзакции.
Итак, теперь я пытаюсь оптимизировать код, поскольку он обрабатывает только 15 транзакций в секунду. Я удалил некоторые посторонние запросы и добавил некоторые индексы и получил его до 30/сек. Затем я понял, что, хотя каждый говорит, что DataContext является легким, ему стоило чего-то, чтобы создать новый 4 раза за транзакцию, поэтому я попытался повторно использовать DataContext. Я, к моему большому удивлению, обнаружил, что повторное использование контекста привело к снижению производительности до 10 транзакций в секунду!
Почему это так? Это связано с тем, что DataContext кэширует сущности в памяти и сначала выполняет поиск через свой список в памяти перед запросом базы данных? Так что, если, например, я ищу идентификатор клиента (первичный ключ) для клиента с именем "MCS", а столбец имени клиента имеет кластерный индекс, чтобы запрос базы данных был быстрым, встроенная память поиск будет медленнее?
И правда ли, что создание/удаление так много соединений db может замедлить работу, или это еще одна преждевременная оптимизация? И если это правда, существует ли способ повторно использовать DataContext, но он выполняет фактический запрос базы данных для каждого запроса linq-to-sql?