Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Базы данных под .NET > Постраничаня загрузка DataSet


Автор: EgoBrain 9.6.2008, 10:37
Кто-нить знает алгоритм, как организовать постраичную загрузку DataSet, или поэтапное выполнение ExecuteReader()? Когда выполняю полнотью чтение ли заполнение прога виснет из-за недостатка памяти при рабте с болшиме таблицами (более 600000 записей).

Автор: unicuum 9.6.2008, 10:58
Цитата(EgoBrain @  9.6.2008,  10:37 Найти цитируемый пост)
Когда выполняю полнотью чтение ли заполнение прога виснет из-за недостатка памяти при рабте с болшиме таблицами (более 600000 записей). 

Уже обсуждалось, используй потоки.

Автор: akizelokro 9.6.2008, 11:54
Гамильтон "ADO.NET для профессионалов"
9.4. Повышение производительности при листании.
посмотри. может, поможет.

Автор: EgoBrain 10.6.2008, 01:28
Цитата

Уже обсуждалось, используй потоки.


Мб дашь ссылку? Спотоками неумею работать :(

Автор: unicuum 11.6.2008, 19:39
Цитата(EgoBrain @  10.6.2008,  01:28 Найти цитируемый пост)
Мб дашь ссылку? Спотоками неумею работать :( 

Вот здесь велось обсуждение http://forum.vingrad.ru/topic-183692.html.

Про потоки кратко скажу так, нужно использовать BackgroundWorker или если в используемой версии фреймворка его нет, то что внутри пространства имён System.Threading.

Второе, запись в бд и чтение из бд совершенно разные вещи, и некоторые из приёмов улучшающие чтения данных замедляют запись. Раз тебе нужна быстрая скорость чтения, значит нужно индексировать поля по которым происходит выборка.

Вот как раз там остановился на том, что запись 10.5 млн записей несколькими задаваемыми параметрами (в том обсуждении некоторые не посмотрели на мой код, что они не однотипны и могут меняться с каждой новой строкой, просто ради чистоты эксперимента не хотелось тратить время на генерацию) осуществляется 11 минут. Замечу, ключевые поля индексированы.

Скорость записи улучшают транзакции, но для чтения это не нужно, то есть просто делаешь индексированными те поля по которым хочешь фильтровать.

Цитата(EgoBrain @  9.6.2008,  10:37 Найти цитируемый пост)
с болшиме таблицами (более 600000 записей)

Обязательно почитай обсуждение smile это не очень большие таблицы, другое дело в способе работы. Вот когда я брал 10.5 млн записей из БД (не из кеша коим является DataSet, DataTable и.т.д.), то время выборки зависело от количества выбираемых записей. Если их мало, то результат получался сразу, а когда их было несколько сотен тысяч (из таблицы в 10.5 млн записей), то приходилось подождать некоторое время (они сначала грузились в кеш и потом выводились на экран). Благодаря потокам моя программа не висла, просто писала загружаются данные.

Если у тебя в таблице 600000 записей, что меньше того над чем я проводил эксперименты, и тем не менее не мало для кеша, то смысла загонять всё это туда нет. По идее в кеш нужно загонять лишь то, что используется в данный момент, но не более. Так или иначе, но если ты всё сделал правильно, то подвисание должно быть кратковременным, но чтобы программа не подавало виду, что подвисла даже на доли секунды, нужно создавать для операции выборки отдельный поток (читай книгу описанную ниже).

По поводу ExecuteReader могу сказать так, есть случаи когда нужно использовать его, то есть DataReader, есть когда нужен DataAdapter, ко вторым кстати относится заливка в кеш (DataSet, DataTable).

В общем, можно долго разглагольствовать и хотя книг по базам данных в ADO.NET достаточно много, я рекомендую скачать из сети "Дэвид Сеппа -  Microsoft ADO.NET.pdf" и ещё примеры к этой книге "Дэвид Сеппа -  Microsoft ADO.NET Setup_VCSharp.exe" и "Дэвид Сеппа -  Microsoft ADO.NET Setup_VB.exe". В ней содержится практически все ответы. Там и потоки в БД, и постраничная загрузка, ускоренное чтение, ускоренная запись и очень много всего. Как бы переписывать сюда на форум то, что уже разжёвано специалистом высокого уровня думаю бессмысленно.

Автор: EgoBrain 12.6.2008, 13:29
Спасибо, про потоки я уже в RSDN чучуть почитал... Но книжку скачать надо, так как с Оркалом в С# недавно работать начал. Потом почитаю темку 
Цитата
Вот здесь велось обсуждение http://forum.vingrad.ru/topic-183692.html.
 То что загружать данные в кеш (представление) в фоновом режиме это понятно, но опять же фоновый режим не спасает, так как оперативки мало в персональных компьютерах, то есть данные нужно по порциям загружать в нее... 

Короче прочел таки тему 
Цитата
http://forum.vingrad.ru/topic-183692.html.
 , но нифига не понял, где конкретно в кодах постраничная загрузка из базы? Хотелось бы пример на Сришотке, а не на VB  smile  smile 

И еще хотелось бы получить ответ в ближайшие 1,5 суток, так как на работе нету инета всвязи с секретностью данных...

Автор: akizelokro 12.6.2008, 19:41
найди в интернете ссылку на книгу Гамильтона и посмотри статью. В ней приведен код примерной хранимой процедуры для постраничной загрузки данных и как он  используется.

еще можешь посмотреть в MSDN  статью под нахванием "Implementing Virtual Mode with Just-In-Time Data Loading in the Windows Forms DataGridView Control"  ms-help://MS.MSDNQTR.v90.en/dv_fxmclictl/html/c2a052b9-423c-4ff7-91dc-d8c7c79345f6.htm . Там другой вариант оформления постраничной загрузки данных

Автор: jonie 12.6.2008, 22:46
к сожалению у постраничной загрузки есть и проблемы.. например : пусть мы используем гламурные девэкпресовкие гриды (они поддерживаю группировку).
если делать постраничную загрузку, то что будет с группами непонятно вообще....

Автор: akizelokro 12.6.2008, 23:40
Цитата

то что будет с группами непонятно вообще.... 

Очень даже понятно. Все должно быть нормально (ну, не совсем. часть данных не отобразится, если не переформировать запросы для выборки). Потому что если ты не отключишь в DataSet проверку ограничений, сообщение об ошибке вывалится раньше.
Другой вопрос, что уже который год в форуме говорится, что привязка к датагриду больших таблиц не имеет смысла, это не улучшает визуальное восприятие данных. Еще от себя добавлю, что, возможно, к еще даже большему ухудшению зрительного восприятия приводит большое количество столбцов.

Так что ставьте над датагридом комбобох для выбора значения из справочника и его значение передавайте в запрос, по которому происходит выборка данных.

Автор: EgoBrain 13.6.2008, 02:26
Ночью ходил к другу (у него безлемитка с часа), зарядил ему на скачку ссылку http://m1wm.spb.ru/ebooks/microsoft_adonet_20_dlja_professionalov_saxil_malik.rar
Ну там тож название "ADO.NET для профессионалов", вот только автора непомню, сегодня днем зайду к нему, посмотрю что он мне накачал... А в этих книгах "ADO.NET для профессионалов" на сришотке примеры?

Автор: jonie 13.6.2008, 10:35
akizelokro я не про те группы. а про группировку средставами грида ).

Автор: akizelokro 13.6.2008, 13:51
А я про что? 
Цитата

а про группировку средставами грида )

если при изменении группировки не менять запросы для выборки, то у тебя просто отобразятся не все данные. это как бы если ты с самого начала не всю таблицу загрузил, а некоторую часть ее.
Ты почти спросил, - я почти ответил smile 

Автор: jonie 14.6.2008, 14:02
Цитата

если при изменении группировки не менять запросы для выборки, то у тебя просто отобразятся не все данные. 
вот именно в этом и есть проблема. пользователь будет ожидать что "он уже просмотрел одну группу" при листании (нафига ему листать кудато еще, если он уже "все видел" что ему нужно)...

Автор: Idsa 14.6.2008, 16:01
Цитата(jonie @  12.6.2008,  22:46 Найти цитируемый пост)
к сожалению у постраничной загрузки есть и проблемы.. например : пусть мы используем гламурные девэкпресовкие гриды (они поддерживаю группировку).
если делать постраничную загрузку, то что будет с группами непонятно вообще....

Посетите вот эту страничку: http://demos.devexpress.com/ASPxGridViewDemos/Rows/FocusedRow.aspx
Это демонстрация работы Devexpress'овского веб-грида. Каждое действие там выполняется через Callback'и, поэтому при группировке просто заново будут запрошены только те данные, которые нужны. Думаю, примерно так же действует и их WinForms грид.

Цитата(akizelokro @  12.6.2008,  19:41 Найти цитируемый пост)
найди в интернете ссылку на книгу Гамильтона и посмотри статью. В ней приведен код примерной хранимой процедуры для постраничной загрузки данных и как он  используется.

еще можешь посмотреть в MSDN  статью под нахванием "Implementing Virtual Mode with Just-In-Time Data Loading in the Windows Forms DataGridView Control"  ms-help://MS.MSDNQTR.v90.en/dv_fxmclictl/html/c2a052b9-423c-4ff7-91dc-d8c7c79345f6.htm . Там другой вариант оформления постраничной загрузки данных

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

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)