Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Базы";
Текущий архив: 2009.09.20;
Скачать: [xml.tar.bz2];

Вниз

результат запроса в массив   Найти похожие ветки 

 
balepa   (2008-11-20 11:31) [0]

использую компаненты zeos. в zquery выполняю следующий запрос select f1,f2,f3 from table where...
затем zquery.open и в цикле _ldt[i]:=zquery.fields[1].value;
zquery.next; получается медленно,
а можно ли вернуть значения поля всех записей в массив без использования цикла. mysql4.1


 
Ega23 ©   (2008-11-20 11:32) [1]

а zquery - не массив?  :)


 
Сергей М. ©   (2008-11-20 11:39) [2]


> можно ли вернуть значения поля всех записей в массив без
> использования цикла


Нельзя.


> получается медленно


Цикл в этом не виноват.


 
balepa   (2008-11-20 11:58) [3]

так я на цикл не наговариваю.


 
Сергей М. ©   (2008-11-20 12:04) [4]

Ну ты же сказал что "без использовния цикла", это и дало повод думать иначе)


 
ilshat   (2008-11-20 12:09) [5]

А zquery отображается в каком нить гриде? Ато народ частенько забывает о существовании DisableControls/EnableControls. Да и скажите для чего вам дата сет в массиве?


 
azamat ©   (2008-11-20 12:11) [6]

а массив(любой) вообще можно без цикла заполнить разве?


 
Сергей М. ©   (2008-11-20 12:12) [7]


> azamat ©   (20.11.08 12:11) [6]


Можно. Коран не запрещает)


 
Anatoly Podgoretsky ©   (2008-11-20 12:24) [8]

> Ega23  (20.11.2008 11:32:01)  [1]

Не массив, а множество в терминах реляционных БД


 
balepa   (2008-11-20 12:24) [9]

в gride неотображается, будет передаваться в excel и отображаться на форме в лабелах. бд на удаленном пк.


 
Sergey13 ©   (2008-11-20 12:27) [10]

> [9] balepa   (20.11.08 12:24)
> в gride неотображается, будет передаваться в excel и отображаться
> на форме в лабелах. бд на удаленном пк.

Т.е. ты собираешься удалять гланды электодрелью через.... Бог в помощь.


 
Сергей М. ©   (2008-11-20 12:30) [11]


> бд на удаленном пк


С этого и надо начинать при поисках "тормозов".
Ну и с архитектуры самой БД (даже в 1-ю очередь)


 
balepa   (2008-11-20 12:39) [12]

в принципе большая скорость неважна, большой объем только в начале а потом будет подгружаться по ~800.


 
balepa   (2008-11-20 12:49) [13]

структура таблицы: key autoinc,pnp int,dt datetime,znach double. индексы на pnp и dt.


 
balepa   (2008-11-20 12:56) [14]

вы пока пишите задавайте вопросы, зайду попозже,а то заколебался с сотки писать


 
Сергей М. ©   (2008-11-20 12:57) [15]

А какое условие ты используешь в своем запросе в WHERE-статье ?


 
Сергей М. ©   (2008-11-20 12:59) [16]

А какое условие ты используешь в своем запросе в WHERE-статье ?

Давай уже конкретный текст запроса приводи ..


 
balepa   (2008-11-21 06:23) [17]

select dt,pnp,znach from t where ((pnp=number) and (dt between dateA And dateB))


 
balepa   (2008-11-21 06:33) [18]

сам запрос быстро результат возвращает (~60000  записей за 0.4-0.5 сек.,кол записей может быть больше в дальнейшем), проблема в том как за максимально короткое время перекинуть результат запроса в массив


 
Сергей М. ©   (2008-11-21 08:16) [19]

поля pnp и dt индексированы ?


 
Sergey13 ©   (2008-11-21 09:01) [20]

> [18] balepa   (21.11.08 06:33)
> сам запрос быстро результат возвращает (~60000  записей за 0.4-0.5 сек.,

то, что ты видишь первые записи набра данных еще не значит, что весь НД уже на клиенте.


 
Anatoly Podgoretsky ©   (2008-11-21 09:02) [21]

> balepa  (21.11.2008 6:33:18)  [18]

Зачем?


 
balepa   (2008-11-21 09:40) [22]

Сергей М.:
pnp и dt индексированы.
Анатолий Подг:
1)данные будут передаваться в excel в подготовленый шаблон с графиком,для этого в принципе большая скорость ненужна;
2)будут отображаться графики за 10 мин,1 час, 24 часа вот тут для первонач. загр. даных и надо бы побыстрее передовать в массив (mas:aray[2,800,600]),где 800 кол парам; 600 данные за 10 мин,1 час и 24 часа потом с ним проще работать, потом данные будут подгружаться по мере поступления (не менее 2x800 записей в сек.)


 
Сергей М. ©   (2008-11-21 09:52) [23]


> balepa   (21.11.08 09:40) [22]


1. Курсор клиентский или серверный ?
2. Запрос только для чтения ?
3. Запрос однонаправленный ?


 
balepa   (2008-11-21 09:54) [24]

графики за час: 300 чисел с мин змачениями и 300 с макс знач в из даных в промежутке 12 сек; 24 часа промежуток 4 мин n сек. Пока писал пришел к выводу что формировать данные для графиков 10 мин,1 час,24 часа нужно на сервере в отдельных таблицах. вроде вопрос теоретически решен, но если будут какието др. идеи пишите.


 
balepa   (2008-11-21 10:01) [25]

Сергей М. [23]
Запросы только на чтение с клиентских пк, на добавление на "серв пк" каждую сек 800 зап.


 
Сергей М. ©   (2008-11-21 10:07) [26]


> balepa   (21.11.08 10:01) [25]


Модифицирующие запросы пока не интересуют.

Еще раз спрашиваю про селективный запрос (тот самый который якобы возвращает ~60000 записей):

1. Курсор результирующего НД клиентский или серверный ?
2. Результирующий НД однонаправленный ?


 
Anatoly Podgoretsky ©   (2008-11-21 10:19) [27]

> balepa  (21.11.2008 9:40:22)  [22]

Скорость загрузки массива несоизмерима со скорость выполнения запрос и со скорость его передачи клиенту, даже при локальной базе.
Если у тебя долго, то значит ты что то неправильно делаешь.


 
balepa   (2008-11-21 10:26) [28]

1.недопонял. наверно на клиенте.
2. да


 
Сергей М. ©   (2008-11-21 10:41) [29]


> balepa   (21.11.08 10:26) [28]


> наверно на клиенте


Выясняй. Это важно.


 
balepa   (2008-11-21 10:53) [30]

поставил bp после zquery.activ:=true "выдернул сетку" данные считываются из zquery.fields[n].value.


 
Anatoly Podgoretsky ©   (2008-11-21 11:00) [31]

mas:aray[2,800,600]) = 800*600 = 480 000, ну ни как не стыкуется с утверждением 60 000 записей. А количесто ячеек 960 000

Сколько уже сообщений - 30, а информации до сих пор почти 0


 
Сергей М. ©   (2008-11-21 11:15) [32]


> balepa   (21.11.08 10:53) [30]


Это ты о чем ?)


 
balepa   (2008-11-21 11:22) [33]

анатолий это максимальное колво а пока 60000


 
Anatoly Podgoretsky ©   (2008-11-21 11:38) [34]

> balepa  (21.11.2008 11:22:33)  [33]

Да не оправдание нужны, а демонстрирование кодом и сообещением технических потребностей, а пока только треп. И благодари бога, что мы пока еще на тебя не плюнули, в переносном смысле конечно.


 
Sergey13 ©   (2008-11-21 11:40) [35]

И все таки, после 30 с лишним постов, непонятен сам смысл перегонки датасета в массив.

Т.е.
> [1] Ega23 ©   (20.11.08 11:32)


 
balepa   (2008-11-21 11:41) [36]

о том что все записи после выполнения запроса на клиентской стороне


 
Anatoly Podgoretsky ©   (2008-11-21 11:45) [37]

> Sergey13  (21.11.2008 11:40:35)  [35]

Там еще речь стоит и об Экселе, а тут уже проблема, если Эксель ниже 2007 - не влезет ни линейно 480 000xN, ни в виде 2d таблицы 800x600


 
Сергей М. ©   (2008-11-21 11:50) [38]


> balepa   (21.11.08 11:41) [36]


Если на клиентской, то никаких тормозов при выполнении допустимых методов навигации быть не должно.

А что такое "выдернул сетку" ?)


 
Sergey13 ©   (2008-11-21 12:01) [39]

> [37] Anatoly Podgoretsky ©   (21.11.08 11:45)
> Там еще речь стоит и об Экселе

Там речь шла еще и об отображении на форме в лабелах.
> [9] balepa   (20.11.08 12:24)


 
balepa   (2008-11-21 14:49) [40]

по поводу excel"a: в excel будут передаваться не все 480000, а только те которые нах в промежутке datea-dateb и в зависимости от промежутка м/у датами,не повсем параметрам а по выбраным в разные таблицы и только по запросу пользователя
про сетку: выдернул сетевой кабель


 
balepa   (2008-11-21 14:54) [41]

я понял всю бредовость мо3й затеи и думаю сделать передачу данных клиентам через сокеты, а базу оставил для случая описаного в предыд7щем посте


 
Сергей М. ©   (2008-11-21 15:02) [42]


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


Т.е. ты проделал следующее

Query.Active := True;
// <- здесь ты "выдернул сетку"
MyValue := Query.Fields[n].Value;
ShowMessage("Урааа ! Я вижу это сгообщение и верю в то, что в этот момент мой клиент загрузил все 60000 записей и сервер больше не нужен !");

Так ?


 
Сергей М. ©   (2008-11-21 15:04) [43]


> думаю сделать передачу данных клиентам через сокеты


А MySQL-сервер с твоим MySQL-клиентом, по-твоему, сейчас через шмокеты общается, потому и "тормоза" ?)


 
balepa   (2008-11-21 15:19) [44]

Сергей М. ©   (21.11.08 15:02) [42]
Да.

Сергей М. ©   (21.11.08 15:04) [43]
мне будет проще передать массив байт через сокеты чем мучаться с запросами.


 
Сергей М. ©   (2008-11-21 15:50) [45]


> balepa   (21.11.08 15:19) [44]
> [42]
> Да.


А на самом-то деле это совсем не так.
То что ты успешно обратился к 1-й записи, вовсе не говорит загруженности всех записей.


> проще передать массив байт через сокеты


Это как ?


 
balepa   (2008-11-21 15:55) [46]

Сергей М. ©   (21.11.08 15:50) [45]

> balepa   (21.11.08 15:19) [44]
> [42]
> Да.

А на самом-то деле это совсем не так.
То что ты успешно обратился к 1-й записи, вовсе не говорит загруженности всех записей.
Не к первой, а к 6000. Просто сразу не посмотрел что цикл в результате всяческих экспериментов был установлен 6000.

> проще передать массив байт через сокеты

Это как ?

TSocket, Indy


 
Сергей М. ©   (2008-11-21 16:41) [47]


> сразу не посмотрел что цикл


Какой нафих цикл ?
Где в коде в [42] ты видишь цикл ?


> Не к первой, а к 6000


И что ?
С чего ты взял, что 6001-я запись и все последующие вплоть до последней загружены ?


> TSocket, Indy


И каким же образом ты с их помощью (без использования SQL-запросов !) намерен обратиться к БД под управлением MySQL ?

Данные-то, которые ты собрался в массив перегнать, лежат именно там, и достать их оттуда можно только передав MySQL-серверу запрос и получив результат ..


 
balepa   (2008-11-21 18:52) [48]

Сергей М. ©   (21.11.08 16:41) [47]
> сразу не посмотрел что цикл
Какой нафих цикл ?
Где в коде в [42] ты видишь цикл ?

Так я с сотки писал и как-то ломы было.
А на самом деле так:



 ZReadOnlyQuery1.SQL.clear;
 ZConnection1.Connect;
 s:= "SELECT dt,pnp,znach FROM bl12009 WHERE ((pnp=1) AND (dt BETWEEN "+"""2008-11-17 9:00:00"+""" AND "+"""2008-11-18 9:00:00"+"""));";
 ZReadOnlyQuery1.SQL.Add(s);
 ZReadOnlyQuery1.Active:= true;
 k:= ZReadOnlyQuery1.RecordCount;
 SetLength(_ldt,k*sizeof(Variant));
 SetLength(_lzn,k*sizeof(Variant));
 ZReadOnlyQuery1.First;
 for i:= 0 to k-1 do begin
   _ldt[i]:= ZReadOnlyQuery1.Fields[1].Value;
   _lzn[i]:= ZReadOnlyQuery1.Fields[2].Value;
   ZReadOnlyQuery1.Next;
   Gauge1.Progress:= Round(i/k*100);
 end;
 ZReadOnlyQuery1.Active:= false;
 ZConnection1.Disconnect;


> Не к первой, а к 6000
И что ?
С чего ты взял, что 6001-я запись и все последующие вплоть до последней загружены ?

Так по недосмотру.


> И каким же образом ты с их помощью (без использования SQL-
> запросов !) намерен обратиться к БД под управлением MySQL
> ?
>
> Данные-то, которые ты собрался в массив перегнать, лежат
> именно там, и достать их оттуда можно только передав MySQL-
> серверу запрос и получив результат ..

Так, как говориться переделать пока только практически теоретическую серверную часть религия не запрещает ).
А БД останется только для передачи в Excel по запросу пользователя и хранения данных, а там высокая скорость не требуется.


 
Сергей М. ©   (2008-11-21 18:58) [49]


> Так я с сотки писал


Понятно.
Чукча не читатель, чукча - писатель.


> практически теоретическую серверную часть


О Боже, упаси юзеров от встреч с таким вот Балепой !


 
balepa   (2008-11-21 19:20) [50]

Сергей М. ©   (21.11.08 18:58) [49]
> Так я с сотки писал
Понятно.
Чукча не читатель, чукча - писатель.
> практически теоретическую серверную часть
О Боже, упаси юзеров от встреч с таким вот Балепой !

Пока никто не жаловался. Просто сделал пока для экспериментов программку которая кидает по 800 записей/с в БД.
В данный момент реализовано на файлах, т.е. все что надо скидывается в файлы, а с них уже клиентские программы считывают то что им нужно. А я тут решился переделать что бы обойтись без файлов (а то последнее время часто доступов до них нет иногда по 1 минуте, а это ни есть хорошо) и первая мысль была о какой нибудь БД, а теперь сокеты ).


 
Сергей М. ©   (2008-11-21 21:13) [51]


> Пока никто не жаловался


Пока , значит, пронесло)


 
Slym ©   (2008-11-22 09:08) [52]

balepa   (21.11.08 18:52) [48]
SetLength(_ldt,k*sizeof(Variant));

это чЁ? как массивы объявлены?

ZReadOnlyQuery1.Fields[1].Value
если нужна макс скорость можно вынести за цикл F1:=ZReadOnlyQuery1.Fields[1];
...
_ldt[i]:= F1.Value;

Gauge1.Progress:= Round(i/k*100);
а тормоза вот тут :)



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

Форум: "Базы";
Текущий архив: 2009.09.20;
Скачать: [xml.tar.bz2];

Наверх





Память: 0.58 MB
Время: 0.005 c
2-1247217291
Tneduts
2009-07-10 13:14
2009.09.20
Поле типа DATE при экспорте в ДБФ


2-1247646301
MZG
2009-07-15 12:25
2009.09.20
Форматирование диска


3-1227136044
Petr V. Abramov
2008-11-20 02:07
2009.09.20
forall и bulk collect into


2-1247658555
b/@.
2009-07-15 15:49
2009.09.20
Можно ли поместить на форме графикс поверх винконтрол ?


6-1206621682
Vikindos
2008-03-27 15:41
2009.09.20
clientSocket посылка строкой





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский