Есть несколько вещей, которые вы можете сделать, если вы уверены, что это SqlParameter, который сохраняет последнюю ссылку.
Сначала попробуйте передать ваш XML в виде строки (и использовать OPENXML в sproc для его обработки), чтобы посмотреть, поможет ли использование простого объекта и большего количества элементов управления.
Во-вторых, создайте свои собственные SqlParameter-s, сохраните их в словаре, а затем сделайте что-то вроде:
foreach (SqlParameter param in parameters.Values)
command.Parameters.Add(param);
Затем, после того, как вы закончите выполнение команды, удалите команду, закройте (если все еще открыто) и утилизируйте соединение, перейдите в свой словарь, явно присвойте значение null как SqlParameter.Value (или возьмите строку ref из .Value в local var, присвойте String.Empty .Value и затем присвойте null локальному var - это только если SqlParameter.Value жалуется на прямое значение null. Затем присвойте null элементу словаря (который был ссылкой на SqlParameter) и затем назначьте значение null в словарь.
В более простом случае вы можете сохранить ссылку только на этот критический SqlParameter и пропустить словарь. Ключевым моментом является сохранение явного присвоения нулей - последнего ссылки на строку, а затем - последнего ссылки на SqlParameter, который ее содержал.
Помните, что здесь есть несколько вещей. Он начинается с того, что вообще не разбирает XML на среднем уровне - просто отправляет его в SQL и заканчивается явно обнуляющими ссылками. Если ваш код таков, что он на самом деле создает этот XML на лету, создайте его как большую прямую строку, чтобы попробовать.
Если это само по себе не снижает нагрузку на память, вам придется форсировать явные коллекции GC, но для этого вы должны сделать небольшое чтение и планировать разумные интервалы, так как GC стоит дорого, т.е. если вы запускаете GC-in после каждого запроса, как сумасшедший кролик, вы будете много платить в циклах процессора.
Кроме того, поскольку вы не сказали, насколько большими на самом деле являются ваши данные и на каком оборудовании вы работаете, и если ваш средний уровень работает под управлением IIS, трудно рассуждать о возможных дополнительных параметрах, например, о том, чтобы IIS запускал несколько рабочих процессов. и просто перерабатывать их, когда они слишком раздуты. Для действительно огромного потребления памяти и подлинного промежуточного уровня (т.е. без наращивания кэша) это может быть быстрее, чем возиться с gc, но мы говорим действительно огромные данные, чтобы войти в эту область.