Конференция "Базы" » результат запроса в массив [D7, MySQL]
 
  • balepa (20.11.08 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 © (20.11.08 11:32) [1]
    а zquery - не массив?  :)
  • Сергей М. © (20.11.08 11:39) [2]

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


    Нельзя.


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


    Цикл в этом не виноват.
  • balepa (20.11.08 11:58) [3]
    так я на цикл не наговариваю.
  • Сергей М. © (20.11.08 12:04) [4]
    Ну ты же сказал что "без использовния цикла", это и дало повод думать иначе)
  • ilshat (20.11.08 12:09) [5]
    А zquery отображается в каком нить гриде? Ато народ частенько забывает о существовании DisableControls/EnableControls. Да и скажите для чего вам дата сет в массиве?
  • azamat © (20.11.08 12:11) [6]
    а массив(любой) вообще можно без цикла заполнить разве?
  • Сергей М. © (20.11.08 12:12) [7]

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


    Можно. Коран не запрещает)
  • Anatoly Podgoretsky © (20.11.08 12:24) [8]
    > Ega23  (20.11.2008 11:32:01)  [1]

    Не массив, а множество в терминах реляционных БД
  • balepa (20.11.08 12:24) [9]
    в gride неотображается, будет передаваться в excel и отображаться на форме в лабелах. бд на удаленном пк.
  • Sergey13 © (20.11.08 12:27) [10]
    > [9] balepa   (20.11.08 12:24)
    > в gride неотображается, будет передаваться в excel и отображаться
    > на форме в лабелах. бд на удаленном пк.

    Т.е. ты собираешься удалять гланды электодрелью через.... Бог в помощь.
  • Сергей М. © (20.11.08 12:30) [11]

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


    С этого и надо начинать при поисках "тормозов".
    Ну и с архитектуры самой БД (даже в 1-ю очередь)
  • balepa (20.11.08 12:39) [12]
    в принципе большая скорость неважна, большой объем только в начале а потом будет подгружаться по ~800.
  • balepa (20.11.08 12:49) [13]
    структура таблицы: key autoinc,pnp int,dt datetime,znach double. индексы на pnp и dt.
  • balepa (20.11.08 12:56) [14]
    вы пока пишите задавайте вопросы, зайду попозже,а то заколебался с сотки писать
  • Сергей М. © (20.11.08 12:57) [15]
    А какое условие ты используешь в своем запросе в WHERE-статье ?
  • Сергей М. © (20.11.08 12:59) [16]
    А какое условие ты используешь в своем запросе в WHERE-статье ?

    Давай уже конкретный текст запроса приводи ..
  • balepa (21.11.08 06:23) [17]
    select dt,pnp,znach from t where ((pnp=number) and (dt between dateA And dateB))
  • balepa (21.11.08 06:33) [18]
    сам запрос быстро результат возвращает (~60000  записей за 0.4-0.5 сек.,кол записей может быть больше в дальнейшем), проблема в том как за максимально короткое время перекинуть результат запроса в массив
  • Сергей М. © (21.11.08 08:16) [19]
    поля pnp и dt индексированы ?
  • Sergey13 © (21.11.08 09:01) [20]
    > [18] balepa   (21.11.08 06:33)
    > сам запрос быстро результат возвращает (~60000  записей за 0.4-0.5 сек.,

    то, что ты видишь первые записи набра данных еще не значит, что весь НД уже на клиенте.
  • Anatoly Podgoretsky © (21.11.08 09:02) [21]
    > balepa  (21.11.2008 6:33:18)  [18]

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

    > balepa   (21.11.08 09:40) [22]


    1. Курсор клиентский или серверный ?
    2. Запрос только для чтения ?
    3. Запрос однонаправленный ?
  • balepa (21.11.08 09:54) [24]
    графики за час: 300 чисел с мин змачениями и 300 с макс знач в из даных в промежутке 12 сек; 24 часа промежуток 4 мин n сек. Пока писал пришел к выводу что формировать данные для графиков 10 мин,1 час,24 часа нужно на сервере в отдельных таблицах. вроде вопрос теоретически решен, но если будут какието др. идеи пишите.
  • balepa (21.11.08 10:01) [25]
    Сергей М. [23]
    Запросы только на чтение с клиентских пк, на добавление на "серв пк" каждую сек 800 зап.
  • Сергей М. © (21.11.08 10:07) [26]

    > balepa   (21.11.08 10:01) [25]


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

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

    1. Курсор результирующего НД клиентский или серверный ?
    2. Результирующий НД однонаправленный ?
  • Anatoly Podgoretsky © (21.11.08 10:19) [27]
    > balepa  (21.11.2008 9:40:22)  [22]

    Скорость загрузки массива несоизмерима со скорость выполнения запрос и со скорость его передачи клиенту, даже при локальной базе.
    Если у тебя долго, то значит ты что то неправильно делаешь.
  • balepa (21.11.08 10:26) [28]
    1.недопонял. наверно на клиенте.
    2. да
  • Сергей М. © (21.11.08 10:41) [29]

    > balepa   (21.11.08 10:26) [28]


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


    Выясняй. Это важно.
  • balepa (21.11.08 10:53) [30]
    поставил bp после zquery.activ:=true "выдернул сетку" данные считываются из zquery.fields[n].value.
  • Anatoly Podgoretsky © (21.11.08 11:00) [31]
    mas:aray[2,800,600]) = 800*600 = 480 000, ну ни как не стыкуется с утверждением 60 000 записей. А количесто ячеек 960 000

    Сколько уже сообщений - 30, а информации до сих пор почти 0
  • Сергей М. © (21.11.08 11:15) [32]

    > balepa   (21.11.08 10:53) [30]


    Это ты о чем ?)
  • balepa (21.11.08 11:22) [33]
    анатолий это максимальное колво а пока 60000
  • Anatoly Podgoretsky © (21.11.08 11:38) [34]
    > balepa  (21.11.2008 11:22:33)  [33]

    Да не оправдание нужны, а демонстрирование кодом и сообещением технических потребностей, а пока только треп. И благодари бога, что мы пока еще на тебя не плюнули, в переносном смысле конечно.
  • Sergey13 © (21.11.08 11:40) [35]
    И все таки, после 30 с лишним постов, непонятен сам смысл перегонки датасета в массив.

    Т.е.
    > [1] Ega23 ©   (20.11.08 11:32)
  • balepa (21.11.08 11:41) [36]
    о том что все записи после выполнения запроса на клиентской стороне
  • Anatoly Podgoretsky © (21.11.08 11:45) [37]
    > Sergey13  (21.11.2008 11:40:35)  [35]

    Там еще речь стоит и об Экселе, а тут уже проблема, если Эксель ниже 2007 - не влезет ни линейно 480 000xN, ни в виде 2d таблицы 800x600
  • Сергей М. © (21.11.08 11:50) [38]

    > balepa   (21.11.08 11:41) [36]


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

    А что такое "выдернул сетку" ?)
  • Sergey13 © (21.11.08 12:01) [39]
    > [37] Anatoly Podgoretsky ©   (21.11.08 11:45)
    > Там еще речь стоит и об Экселе

    Там речь шла еще и об отображении на форме в лабелах.
    > [9] balepa   (20.11.08 12:24)
  • balepa (21.11.08 14:49) [40]
    по поводу excel'a: в excel будут передаваться не все 480000, а только те которые нах в промежутке datea-dateb и в зависимости от промежутка м/у датами,не повсем параметрам а по выбраным в разные таблицы и только по запросу пользователя
    про сетку: выдернул сетевой кабель
  • balepa (21.11.08 14:54) [41]
    я понял всю бредовость мо3й затеи и думаю сделать передачу данных клиентам через сокеты, а базу оставил для случая описаного в предыд7щем посте
  • Сергей М. © (21.11.08 15:02) [42]

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


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

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

    Так ?
  • Сергей М. © (21.11.08 15:04) [43]

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


    А MySQL-сервер с твоим MySQL-клиентом, по-твоему, сейчас через шмокеты общается, потому и "тормоза" ?)
  • balepa (21.11.08 15:19) [44]
    Сергей М. ©   (21.11.08 15:02) [42]
    Да.

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

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


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


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


    Это как ?
  • balepa (21.11.08 15:55) [46]
    Сергей М. ©   (21.11.08 15:50) [45]

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

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

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

    Это как ?

    TSocket, Indy
  • Сергей М. © (21.11.08 16:41) [47]

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


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


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


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


    > TSocket, Indy


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

    Данные-то, которые ты собрался в массив перегнать, лежат именно там, и достать их оттуда можно только передав MySQL-серверу запрос и получив результат ..
  • balepa (21.11.08 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 по запросу пользователя и хранения данных, а там высокая скорость не требуется.
  • Сергей М. © (21.11.08 18:58) [49]

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


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


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


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

    Пока никто не жаловался. Просто сделал пока для экспериментов программку которая кидает по 800 записей/с в БД.
    В данный момент реализовано на файлах, т.е. все что надо скидывается в файлы, а с них уже клиентские программы считывают то что им нужно. А я тут решился переделать что бы обойтись без файлов (а то последнее время часто доступов до них нет иногда по 1 минуте, а это ни есть хорошо) и первая мысль была о какой нибудь БД, а теперь сокеты ).
  • Сергей М. © (21.11.08 21:13) [51]

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


    Пока , значит, пронесло)
  • Slym © (22.11.08 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);
    а тормоза вот тут :)
 
Конференция "Базы" » результат запроса в массив [D7, MySQL]
Есть новые Нет новых   [134477   +39][b:0][p:0.002]