2013-09-11 2 views
0

У меня есть таблица базы данных, содержащая документы RTF. Мне нужно извлечь эти программные средства (я знаю, что могу использовать курсор для перехода по таблице - мне нужно сделать некоторые манипуляции с данными). Я создал программу на C#, которая сделает это, но проблема в том, что она не может загрузить всю таблицу (около 2 миллионов строк) в память.Лучший способ опубликовать результаты в SqlCommand?

a MSDN page here.

Это говорит о том, что в принципе два способа прокрутки данных.

  1. использовать метод DataAdapter.Fill для загрузки постранично
  2. запустить запрос много раз, перебор с помощью первичного ключа. В основном вы запускаете его один раз с максимальным лимитом 500 (или любым другим) и PK> (последний PK)

Я пробовал вариант 2, и, похоже, он работает. Но могу ли я быть уверенным, что я возвращаю все данные? Когда я делаю SELECT COUNT (*) FROM Document, он отбрасывает одинаковое количество строк. Тем не менее, я нервничаю. Любые советы по проверке данных?

И что быстрее? Запрос данных довольно медленный - я оптимизировал запрос как можно больше, но есть тонна данных для переноса по глобальной сети.

+1

Что вы измерили, чтобы уделить больше времени? Манипуляция или передача? Вы должны попытаться загрузить материал в один поток, чтобы у вас всегда были свежие данные, чтобы манипулировать и потянуть их обратно в другой. –

+0

http://www.codeproject.com/Articles/19058/A-Neat-Solution-to-GridView-Custom-Paging –

+0

Еще одна мысль - какие манипуляции требуются?Может ли это и/или проверка правильности быть сделана на сервере до вытягивания данных через WAN? Таким образом, было бы меньше данных как (a) в пути & (b) в памяти. –

ответ

1

Я думаю, что ответ требует гораздо большего понимания ваших истинных требований. Мне трудно представить себе повторяющийся процесс или требование, когда вам нужно регулярно извлекать 2 миллиона двоичных файлов, чтобы выполнить некоторую обработку на них! Если это одноразовая вещь, тогда хорошо, давайте сделаем это!

Вот некоторые начальные мысли:

  1. Не могли бы вы развернуть # рутина C в SQL непосредственно и выполнять все с помощью CLR?
  2. Не могли бы вы запустить свое приложение C# локально на поле и воспользоваться shared memory protocol?
  3. У вас есть обрабатывать каждый ряд строк? Если, например, вы проверяете структуру данных RTF, есть изменения в сравнении с другим файлом, вы можете создавать хэши каждого из них, которые можно сравнить?
  4. Если вы должно быть получить все данные, возможно, попробуйте exporting it на локальный диск и отправьте XCOPY в другое место.
  5. Если вы хотите получить кусок строк за раз, создайте таблицу, которая просто сохранит список всех обработанных идентификаторов. При захвате следующих 500 строк просто найдите строки, которые еще не находятся в этой таблице. Конечно, обновите эту таблицу с новыми идентификаторами, которые вы экспортировали.
  6. Если вы должны, все это может серьезно повлиять на производительность OLTP. Либо запустите его, либо отработайте часы, либо возьмите * .bak и обработайте его в отдельном окне. Фактически, если это одноразовая вещь, восстановите ее в том же поле, где работает SQL, и используйте протокол разделяемой памяти.
+0

Спасибо, я реализовал кучу этих предложений. Это одно время, спасибо Богу. В итоге я просто использовал TOP N для SELECT и WHERE PK> lastRecordPK, как описано в документе MSDN. Когда я запускал запрос из SSMS, потребовалось 18 часов, используя эту методологию с тем же запросом, это занимает всего 4 часа. Я бегу от времени производства, поэтому не так много воздействия на пользователя. Я запускаю программу не на серверной панели для тестирования, но для реальной вещи я обязательно это сделаю. – Rob

Смежные вопросы