Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2010.03.14;
Скачать: CL | DM;

Вниз

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

 
vlk32   (2009-03-03 13:27) [0]

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

Таблица 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й должен работать быстрее. В чем засада? И как сделать загрузку еще быстрее?


 
Ega23 ©   (2009-03-03 13:29) [1]

http://delphimaster.net/view/3-1235739432/


 
Sergey13 ©   (2009-03-03 13:39) [2]

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

А зачем?


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

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

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


 
vlk32   (2009-03-03 13:56) [4]

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

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

>А зачем?

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

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

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


 
Ega23 ©   (2009-03-03 14:10) [5]


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


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


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


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


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


 
Sergey13 ©   (2009-03-03 14:14) [7]

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

Что это?

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

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


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

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

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


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


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


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


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


 
Ega23 ©   (2009-03-03 14:38) [10]


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


TADOQuery = class (TCustomADODataSet = class (TDataSet))


 
vlk32   (2009-03-03 14:55) [11]

DB_Meas.DisableControls;

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

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


 
Petr V. Abramov ©   (2009-03-03 14:58) [12]

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


 
Ega23 ©   (2009-03-03 15:02) [13]


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


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


 
vlk32   (2009-03-03 15:03) [14]

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

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


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


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


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



Страницы: 1 вся ветка

Текущий архив: 2010.03.14;
Скачать: CL | DM;

Наверх




Память: 0.5 MB
Время: 0.018 c
2-1263335599
AntonioBanderas
2010-01-13 01:33
2010.03.14
Формат строки


2-1263309374
Евгений Р.
2010-01-12 18:16
2010.03.14
Работа с tAdoQuery


2-1263355369
Дмитрий С
2010-01-13 07:02
2010.03.14
Как правильно "захватить" исключение?


15-1261942786
Артур Пирожков
2009-12-27 22:39
2010.03.14
Какой компонент лучше выбрать для выполнения простой задачи?


8-1203602841
MBo
2008-02-21 17:07
2010.03.14
Демонстрация наклона