![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Как макс быстро выгрузить данные из БД в память?
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