Как я могу получить процент от количества запросов LINQ to SQL? - PullRequest
2 голосов
/ 15 марта 2009

Интересно, кто-нибудь еще задавал подобный вопрос?

По сути, у меня есть огромное дерево, которое я строю в ОЗУ с использованием объектов LINQ, а затем я делаю все это за один раз, используя DataContext.SubmitChanges().

Это работает, но я не могу найти, как дать пользователю своего рода визуальную индикацию того, как далеко продвинулся запрос. Если бы я смог в конечном итоге реализовать своего рода индикатор выполнения, это было бы здорово, даже если бы производительность была минимальной.

Обратите внимание, что у меня достаточно большое количество строк для размещения в БД, более 750 000 строк. Я точно не рассчитал время, но это заняло много времени.

Редактировать: Я подумал, что лучше дать некоторое представление о том, что я делаю.

По сути, я строю дерево суффиксов из Властелина колец. Таким образом, существует много узлов, и определенные узлы имеют связанные с ними позиции (узлы, которые оказываются в конце суффикса). Я строю объекты Linq по этим направлениям.

suffixTreeDB.NodeObjs.InsertOnSubmit(new NodeObj()
{
    NodeID = 0,
    ParentID = 0,
    Path = "$"
});

После того, как дерево суффиксов было полностью сгенерировано в ОЗУ (что занимает всего несколько секунд), я затем вызываю suffixTreeDB.submitChanges();

Мне интересно, есть ли более быстрый способ сделать это? Спасибо!

Редактировать 2: Я сделал секундомер, и, по-видимому, запись БД занимает ровно 6 минут.

Ответы [ 4 ]

1 голос
/ 02 января 2011

Мне удалось получить процентный прогресс для ctx.submitchanges () с помощью ctx.Log и ActionTextWriter

ctx.Log = new ActionTextWriter(s => {
if (s.StartsWith("INSERT INTO"))
    insertsCount++;
    ReportProgress(insertsCount);
});

подробности доступны в моем блоге http://epandzo.wordpress.com/2011/01/02/linq-to-sql-ctx-submitchanges-progress/

и вопрос stackoverflow LINQ to SQL: прогресс SubmitChangess ()

1 голос
/ 15 марта 2009

Я предлагаю вам разделить звонки, которые вы делаете, так как они в любом случае отправляются отдельными звонками в БД. Это также уменьшит размер транзакции (что делает linq при вызове submitchanges).

Если вы разделите их на 10 блоков по 75 000, вы можете получить приблизительную оценку по шкале 1/10.

Обновление 1: После перечитывания вашего поста и ваших новых комментариев, я думаю, вам стоит взглянуть на SqlBulkCopy. Если вам нужно улучшить время операции, это путь. Проверьте этот связанный вопрос / ответ: Какой самый быстрый способ массовой вставки большого количества данных в SQL Server (клиент C #)

0 голосов
/ 16 марта 2009

Мне действительно нужна форма Bulk-Insert, однако, похоже, что Linq ее не поддерживает.

0 голосов
/ 15 марта 2009

Это не идеально, но вы можете создать другой поток, который периодически запрашивает таблицу, которую вы заполняете, чтобы посчитать количество записей, которые были вставлены. Я не уверен, как / если это будет работать, если вы выполняете транзакцию, так как может быть блокировка / и т.д.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...