| Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате |
| Форум программистов > Базы данных под .NET > Постраничаня загрузка DataSet |
| Автор: EgoBrain 9.6.2008, 10:37 |
| Кто-нить знает алгоритм, как организовать постраичную загрузку DataSet, или поэтапное выполнение ExecuteReader()? Когда выполняю полнотью чтение ли заполнение прога виснет из-за недостатка памяти при рабте с болшиме таблицами (более 600000 записей). |
| Автор: akizelokro 9.6.2008, 11:54 |
| Гамильтон "ADO.NET для профессионалов" 9.4. Повышение производительности при листании. посмотри. может, поможет. |
| Автор: EgoBrain 10.6.2008, 01:28 | ||
Мб дашь ссылку? Спотоками неумею работать :( |
| Автор: unicuum 11.6.2008, 19:39 |
Вот здесь велось обсуждение http://forum.vingrad.ru/topic-183692.html. Про потоки кратко скажу так, нужно использовать BackgroundWorker или если в используемой версии фреймворка его нет, то что внутри пространства имён System.Threading. Второе, запись в бд и чтение из бд совершенно разные вещи, и некоторые из приёмов улучшающие чтения данных замедляют запись. Раз тебе нужна быстрая скорость чтения, значит нужно индексировать поля по которым происходит выборка. Вот как раз там остановился на том, что запись 10.5 млн записей несколькими задаваемыми параметрами (в том обсуждении некоторые не посмотрели на мой код, что они не однотипны и могут меняться с каждой новой строкой, просто ради чистоты эксперимента не хотелось тратить время на генерацию) осуществляется 11 минут. Замечу, ключевые поля индексированы. Скорость записи улучшают транзакции, но для чтения это не нужно, то есть просто делаешь индексированными те поля по которым хочешь фильтровать. Обязательно почитай обсуждение Если у тебя в таблице 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 чучуть почитал... Но книжку скачать надо, так как с Оркалом в С# недавно работать начал. Потом почитаю темку
Короче прочел таки тему
И еще хотелось бы получить ответ в ближайшие 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 | ||
А я про что?
если при изменении группировки не менять запросы для выборки, то у тебя просто отобразятся не все данные. это как бы если ты с самого начала не всю таблицу загрузил, а некоторую часть ее. Ты почти спросил, - я почти ответил |
| Автор: jonie 14.6.2008, 14:02 | ||
|
| Автор: Idsa 14.6.2008, 16:01 | ||||
Посетите вот эту страничку: http://demos.devexpress.com/ASPxGridViewDemos/Rows/FocusedRow.aspx Это демонстрация работы Devexpress'овского веб-грида. Каждое действие там выполняется через Callback'и, поэтому при группировке просто заново будут запрошены только те данные, которые нужны. Думаю, примерно так же действует и их WinForms грид.
Собственные решения этой проблемы зачастую получаются заточенными под определенную задачу и гибкостью не отличаются. Если уж есть возможность воспользоваться компонентами DevExpress, то по-моему это лучший выход. |