![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Запрос на выборку [D7, access]
Fedor © (2009-05-21 16:48:00)Как при помощи sql запроса отображать только то количество записей, которое убирается в область отображения DBGrid? Например пусть DBGrid может отображать 10 записей.
sniknik (2009-05-21 17:55:00) [21]> Просто думаю если отображать главную таблицу частями быстрее будет.
будет медленнее.
> В запрос может попасть тысяча записей.
> Если он привязан к гриду, то фетч идет до тех пор, пока не кончится место в его клиентской части.
1000 записей выбирается за 0,01 секунды максимум. одна отрисовка формы с гридом гораздо существеннее по времени.
и фетч при локальном курсоре отбирает все.
> Есть конечно подозрение, что лишние запросы при навигации съедят все увеличение скорости работы.
есть подозрения, что твои "тормоза" не имеют ничего общего с теми, что ты ищешь...
Медвежонок Пятачок (2009-05-21 17:32:00) [22]если вообще будет что съедать
Fedor (2009-05-21 17:31:00) [23]Эксперемент. Будет прирост скорости - очень хорошо. Есть конечно подозрение, что лишние запросы при навигации съедят все увеличение скорости работы.
Медвежонок Пятачок (2009-05-21 17:31:00) [24]Возможно так.
Оно и так уже "так"
В запрос может попасть тысяча записей.
Если он привязан к гриду, то фетч идет до тех пор, пока не кончится место в его клиентской части.
Ega23 (2009-05-21 17:29:00) [25]
> Просто думаю если отображать главную таблицу частями быстрее
> будет.
Нет. Ты отображай детали только по текущей записи. Т.е. когда ты в гриде перешёл на новую запись - отрабатывает маленький подзапрос, который вытаскивает только то, что принадлежит ей.
Короче, как пример.
Create MasterTable (MID int, MName varchar(32))
Insert into MasterTable (MID, MName) Values (1, 'M1');
....
Insert into MasterTable (MID, MName) Values (10, 'M10');
Create DetailTable (DID, MID (ключ на Master), Name)
Insert into DetailTable (DID, MID, Name) Values (1, 1, 'D11');
Insert into DetailTable (DID, MID, Name) Values (2, 1, 'D12');
....
Insert into DetailTable (DID, MID, Name) Values (10, 1, 'D110');
Insert into DetailTable (DID, MID, Name) Values (11, 2, 'D21');
....
Insert into DetailTable (DID, MID, Name) Values (100, 10, 'D1010');
Итого: в мастере - 10 записей, для каждой записи в мастере - 10 записей в детали.
Кладём 2 грида, 2 DataSet, 2 DataSource и настраиваем Master-Detail связку (об этом в книге почитай).
Получается, что в один момент времени загружено всего 20 записей: 10 в мастере, и 10 в детали, которая соответствует текущему значению Мастера.
Как-то так.
Виталий Панасенко (2009-05-21 17:21:00) [26]
> Просто думаю если отображать главную таблицу частями быстрее
> будет.
А овчинка вычинки стоит?
Fedor (2009-05-21 17:18:00) [27]
> Тут такая штука. У тебя на экране DBGrid отображает 10 записей.
> Потом ты окошко на весь экран развернул - и он начал отображать
> уже 40 записей. Потом поменял разрешение экрана - и уже
> 28 записей.На каждый такой раз "стрелять" в базу запросом.
> .. Ну не знаю. ИМХО, непродуктивно.Ты лучше задачу в целом
> опиши. Какие есть исходные данные, и что бы ты конкретно
> хотел бы получить. Тут народ опытный, может чего интересного
> посоветуют.
Пусть размер грида жесткий на 10 записей. В базе порядка 500 основных записей с фотками, плюс к каждой из в присоединенной таблице по несколько сотен записей. Сейчас вес базы около 40 мегов. А отображать нужно сразу все включая графику Chart по детальным таблицам.
Просто думаю если отображать главную таблицу частями быстрее будет.
Fedor (2009-05-21 17:12:00) [28]А пользователю и нужны те записи что отображены в гриде. Кроме того он еще и скролирует его. На вскидку, я думаю так: мы отображаем первые 10 записей.
select top 10 * from table order by id.
Затем пользователь начинает "бегать" по гриду изменяя позицию.
Когда он попадает на последнюю запись в гриде мы выполняем запрос типа:
select top 10 * from table where id>=:id order by id.
Пользователь в гриде получит следующие 10 записей с текущей.
Так же можно сделать и при переходе на первую запись в гриде:
select top 10 * from table where id<=:id order by id.
Где параметр :id - id текущей записи.
Возможно так.
Ega23 (2009-05-21 17:05:00) [29]
> Как при помощи sql запроса отображать только то количество
> записей, которое убирается в область отображения DBGrid?
> Например пусть DBGrid может отображать 10 записей.
Тут такая штука. У тебя на экране DBGrid отображает 10 записей. Потом ты окошко на весь экран развернул - и он начал отображать уже 40 записей. Потом поменял разрешение экрана - и уже 28 записей.
На каждый такой раз "стрелять" в базу запросом... Ну не знаю. ИМХО, непродуктивно.
Ты лучше задачу в целом опиши. Какие есть исходные данные, и что бы ты конкретно хотел бы получить. Тут народ опытный, может чего интересного посоветуют.
Sergey13 (2009-05-21 16:58:00) [30]Иди от обратного - запрашивай ТОЛЬКО те данные, которые нужны пользователю СЕЙЧАС.