Top.Mail.Ru
Мастера DELPHI, Delphi programming community Титульная страница Поиск, карта сайта Написать письмо 
| Новости | Поиск | FAQ | Статьи | Книги | Новости VCL |
| Форумы ЧАТ | Орешник | KOL и MCK |
Форумы -» Основная («Начинающим»)/ Базы / WinAPI / Компоненты / Сети / Media / Игры / Corba и COM / KOL / FreePascal / .Net / Прочее / RSDN.ORG

« предыдущая ветвь | форум | следующая ветвь »

Как макс быстро выгрузить данные из БД в память?


vlk32 ©   (2009-03-03 13:27:00) 

Данные это двумерная таблица значений плоскостности полосы. В базе хранится так:

Таблица Coil
rulon_id - ключ + данные по рулону

Таблица Scan
scan_id - ключ
rulon_id - ссылка на рулон + данные по скану

Таблица Measures
measure_id - ключ
scan_id - ссылка на скан
zone_id - порядковый номер зоны изм (0..99) + данные по точке измерения

Скрипт кот. выбирает все измерения для рулона, а также добавляет поле scan_num - порядковый номер скана в рулоне:

select dense_rank() over (order by Scan_id) as scan_num,zone_id,tempr,flat2030,flatfact,flatdest
from Measures where scan_id in
(select Scan.scan_id from Scan,Coil where Coil.rulon_id=Scan.rulon_id and Coil.rulon_id=<номер рулона>)
order by scan_num, zone_id


Надо теперь данные загнать в динамический массив типа
array of array of Real;

1й способ кот. был опробован:
- выполнить скрипт через TADOQuery
- для каждого скана от 1 до N делать

     DB_Meas.Filter := Format('scan_num=%d',[i+1]);
     DB_Meas.First;
     for j:=0 to 99 do
      begin
       ScanStat[id_temp].Y[j] := DB_Meas.FieldValues['tempr'   ];
       ScanStat[id_2030].Y[j] := DB_Meas.FieldValues['flat2030'];
       ScanStat[id_fact].Y[j] := DB_Meas.FieldValues['flatfact'];
       ScanStat[id_dest].Y[j] := DB_Meas.FieldValues['flatdest'];
       DB_Meas.Next;
      end;

 
2й способ
- выполнить скрипт через TADOQuery

  for i:=0 to High(Coil.Scans) do
   begin
    for j:=0 to 99 do
      Coil.Scans[i].ScanStat[id_temp].Y[j] := DB_Meas.FieldValues['tempr'   ];
      Coil.Scans[i].ScanStat[id_2030].Y[j] := DB_Meas.FieldValues['flat2030'];
      Coil.Scans[i].ScanStat[id_fact].Y[j] := DB_Meas.FieldValues['flatfact'];
      Coil.Scans[i].ScanStat[id_dest].Y[j] := DB_Meas.FieldValues['flatdest'];
      DB_Meas.Next;
   end;


1й способ грузит рулон 17 сек, 2й способ - 34 сек.

Мне казалось что 2й должен работать быстрее. В чем засада? И как сделать загрузку еще быстрее?


vlk32   (2009-03-03 15:05:00) [1]


> Смотри ADODB.pas -> TCustomADODataSet. Думай.


Спасибо за совет. Проблема решена. На будущее учту энтот момент. Щаз другой работы полно. Так что копание в чужом коде отложу до лучших времен.


vlk32   (2009-03-03 15:03:00) [2]

> я б прям на сервере в BLOB загнал бы

дык проектировали "чтоб красиво и правильно" А красиво и правильно именно так как в первом посте описано. Хотя нам вьюшки делали так там данные все запыжованы в одну запись с полями типа FLAT_1 FLAT_2 итд


Ega23   (2009-03-03 15:02:00) [3]


> Но хучь убейте меня не могу понять каки-таки контролсы там
> были отключены.


Смотри ADODB.pas -> TCustomADODataSet. Думай.


Petr V. Abramov   (2009-03-03 14:58:00) [4]

я б прям на сервере в BLOB загнал бы


vlk32   (2009-03-03 14:55:00) [5]

DB_Meas.DisableControls;

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

зы. тему можно закрыть


Ega23   (2009-03-03 14:38:00) [6]


> ну нет у меня никаких датасетов и визуальных компонент тоже
> нет связанных с БД. есть адоконнекшн + адоквери. все. ничо
> больше нет.


TADOQuery = class (TCustomADODataSet = class (TDataSet))


Сергей М.   (2009-03-03 14:31:00) [7]


> ну нет у меня никаких датасетов


> есть .. адоквери


Да будет тебе открыта страшная тайна : TADOQuery есть непрямой потомок TDataSet и потому обладает всеми "правами и обязанностями" TDataSet.


vlk32   (2009-03-03 14:23:00) [8]

> Ссылку прочитал? Попробовал?

ну нет у меня никаких датасетов и визуальных компонент тоже нет связанных с БД. есть адоконнекшн + адоквери. все. ничо больше нет.


Сергей М.   (2009-03-03 14:14:00) [9]


> надо тупо все выбросить в оперативку


В "оперативку" не получится - у тебя нетк ней доступа.


Sergey13   (2009-03-03 14:14:00) [10]

> [4] vlk32   (03.03.09 13:56)
> блокирование датасета

Что это?

> Есть TADOQuery и надо тупо все выбросить в оперативку по быстрому

Так результат TADOQuery уже в ней, если все записи зафетчены.


Ega23   (2009-03-03 14:10:00) [11]


> Есть идеи или нет?


Ссылку прочитал? Попробовал?


vlk32   (2009-03-03 13:56:00) [12]

>Sergey13 ©   (03.03.09 13:39) [2]

>> [0] vlk32   (03.03.09 13:27)
>> Надо теперь данные загнать в динамический массив

>А зачем?

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

Хотел еще сказать что блокирование датасета и отображения на экран тут не актуальны. Есть TADOQuery и надо тупо все выбросить в оперативку по быстрому. Мож как то настроить тип курсора, размер кэша или еще что.

Есть идеи или нет?


Anatoly Podgoretsky   (2009-03-03 13:49:00) [13]

> vlk32  (03.03.2009 13:27:00)  [0]

Так быстрее и работает, для случая N > 1
100
и
100 * (High(Coil.Scans)+1)


Sergey13   (2009-03-03 13:39:00) [14]

> [0] vlk32   (03.03.09 13:27)
> Надо теперь данные загнать в динамический массив

А зачем?


Ega23   (2009-03-03 13:29:00) [15]

http://www.delphimaster.ru/cgi-bin/forum.pl?id=1235739432&n=1


Наверх

Титульная страница Поиск, карта сайта Написать письмо