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