-
использую компаненты zeos. в zquery выполняю следующий запрос select f1,f2,f3 from table where...
затем zquery.open и в цикле _ldt[i]:=zquery.fields[1].value;
zquery.next; получается медленно,
а можно ли вернуть значения поля всех записей в массив без использования цикла. mysql4.1
-
а zquery - не массив? :)
-
> можно ли вернуть значения поля всех записей в массив без
> использования цикла
Нельзя.
> получается медленно
Цикл в этом не виноват.
-
так я на цикл не наговариваю.
-
Ну ты же сказал что "без использовния цикла", это и дало повод думать иначе)
-
А zquery отображается в каком нить гриде? Ато народ частенько забывает о существовании DisableControls/EnableControls. Да и скажите для чего вам дата сет в массиве?
-
а массив(любой) вообще можно без цикла заполнить разве?
-
> azamat © (20.11.08 12:11) [6]
Можно. Коран не запрещает)
-
> Ega23 (20.11.2008 11:32:01) [1]
Не массив, а множество в терминах реляционных БД
-
в gride неотображается, будет передаваться в excel и отображаться на форме в лабелах. бд на удаленном пк.
-
> [9] balepa (20.11.08 12:24)
> в gride неотображается, будет передаваться в excel и отображаться
> на форме в лабелах. бд на удаленном пк.
Т.е. ты собираешься удалять гланды электодрелью через.... Бог в помощь.
-
> бд на удаленном пк
С этого и надо начинать при поисках "тормозов".
Ну и с архитектуры самой БД (даже в 1-ю очередь)
-
в принципе большая скорость неважна, большой объем только в начале а потом будет подгружаться по ~800.
-
структура таблицы: key autoinc,pnp int,dt datetime,znach double. индексы на pnp и dt.
-
вы пока пишите задавайте вопросы, зайду попозже,а то заколебался с сотки писать
-
А какое условие ты используешь в своем запросе в WHERE-статье ?
-
А какое условие ты используешь в своем запросе в WHERE-статье ?
Давай уже конкретный текст запроса приводи ..
-
select dt,pnp,znach from t where ((pnp=number) and (dt between dateA And dateB))
-
сам запрос быстро результат возвращает (~60000 записей за 0.4-0.5 сек.,кол записей может быть больше в дальнейшем), проблема в том как за максимально короткое время перекинуть результат запроса в массив
-
поля pnp и dt индексированы ?
-
> [18] balepa (21.11.08 06:33)
> сам запрос быстро результат возвращает (~60000 записей за 0.4-0.5 сек.,
то, что ты видишь первые записи набра данных еще не значит, что весь НД уже на клиенте.
-
> balepa (21.11.2008 6:33:18) [18]
Зачем?
-
Сергей М.:
pnp и dt индексированы.
Анатолий Подг:
1)данные будут передаваться в excel в подготовленый шаблон с графиком,для этого в принципе большая скорость ненужна;
2)будут отображаться графики за 10 мин,1 час, 24 часа вот тут для первонач. загр. даных и надо бы побыстрее передовать в массив (mas:aray[2,800,600]),где 800 кол парам; 600 данные за 10 мин,1 час и 24 часа потом с ним проще работать, потом данные будут подгружаться по мере поступления (не менее 2x800 записей в сек.)
-
> balepa (21.11.08 09:40) [22]
1. Курсор клиентский или серверный ?
2. Запрос только для чтения ?
3. Запрос однонаправленный ?
-
графики за час: 300 чисел с мин змачениями и 300 с макс знач в из даных в промежутке 12 сек; 24 часа промежуток 4 мин n сек. Пока писал пришел к выводу что формировать данные для графиков 10 мин,1 час,24 часа нужно на сервере в отдельных таблицах. вроде вопрос теоретически решен, но если будут какието др. идеи пишите.
-
Сергей М. [23]
Запросы только на чтение с клиентских пк, на добавление на "серв пк" каждую сек 800 зап.
-
> balepa (21.11.08 10:01) [25]
Модифицирующие запросы пока не интересуют.
Еще раз спрашиваю про селективный запрос (тот самый который якобы возвращает ~60000 записей):
1. Курсор результирующего НД клиентский или серверный ?
2. Результирующий НД однонаправленный ?
-
> balepa (21.11.2008 9:40:22) [22]
Скорость загрузки массива несоизмерима со скорость выполнения запрос и со скорость его передачи клиенту, даже при локальной базе.
Если у тебя долго, то значит ты что то неправильно делаешь.
-
1.недопонял. наверно на клиенте.
2. да
-
> balepa (21.11.08 10:26) [28]
> наверно на клиенте
Выясняй. Это важно.
-
поставил bp после zquery.activ:=true "выдернул сетку" данные считываются из zquery.fields[n].value.
-
mas:aray[2,800,600]) = 800*600 = 480 000, ну ни как не стыкуется с утверждением 60 000 записей. А количесто ячеек 960 000
Сколько уже сообщений - 30, а информации до сих пор почти 0
-
> balepa (21.11.08 10:53) [30]
Это ты о чем ?)
-
анатолий это максимальное колво а пока 60000
-
> balepa (21.11.2008 11:22:33) [33]
Да не оправдание нужны, а демонстрирование кодом и сообещением технических потребностей, а пока только треп. И благодари бога, что мы пока еще на тебя не плюнули, в переносном смысле конечно.
-
И все таки, после 30 с лишним постов, непонятен сам смысл перегонки датасета в массив.
Т.е.
> [1] Ega23 © (20.11.08 11:32)
-
о том что все записи после выполнения запроса на клиентской стороне
-
> Sergey13 (21.11.2008 11:40:35) [35]
Там еще речь стоит и об Экселе, а тут уже проблема, если Эксель ниже 2007 - не влезет ни линейно 480 000xN, ни в виде 2d таблицы 800x600
-
> balepa (21.11.08 11:41) [36]
Если на клиентской, то никаких тормозов при выполнении допустимых методов навигации быть не должно.
А что такое "выдернул сетку" ?)
-
> [37] Anatoly Podgoretsky © (21.11.08 11:45)
> Там еще речь стоит и об Экселе
Там речь шла еще и об отображении на форме в лабелах.
> [9] balepa (20.11.08 12:24)
-
по поводу excel'a: в excel будут передаваться не все 480000, а только те которые нах в промежутке datea-dateb и в зависимости от промежутка м/у датами,не повсем параметрам а по выбраным в разные таблицы и только по запросу пользователя
про сетку: выдернул сетевой кабель
-
я понял всю бредовость мо3й затеи и думаю сделать передачу данных клиентам через сокеты, а базу оставил для случая описаного в предыд7щем посте
-
> про сетку: выдернул сетевой кабель
Т.е. ты проделал следующее
Query.Active := True;
// <- здесь ты "выдернул сетку"
MyValue := Query.Fields[n].Value;
ShowMessage('Урааа ! Я вижу это сгообщение и верю в то, что в этот момент мой клиент загрузил все 60000 записей и сервер больше не нужен !');
Так ?
-
> думаю сделать передачу данных клиентам через сокеты
А MySQL-сервер с твоим MySQL-клиентом, по-твоему, сейчас через шмокеты общается, потому и "тормоза" ?)
-
Сергей М. © (21.11.08 15:02) [42]
Да.
Сергей М. © (21.11.08 15:04) [43]
мне будет проще передать массив байт через сокеты чем мучаться с запросами.
-
> balepa (21.11.08 15:19) [44]
> [42]
> Да.
А на самом-то деле это совсем не так.
То что ты успешно обратился к 1-й записи, вовсе не говорит загруженности всех записей.
> проще передать массив байт через сокеты
Это как ?
-
Сергей М. © (21.11.08 15:50) [45]
> balepa (21.11.08 15:19) [44]
> [42]
> Да.
А на самом-то деле это совсем не так.
То что ты успешно обратился к 1-й записи, вовсе не говорит загруженности всех записей.
Не к первой, а к 6000. Просто сразу не посмотрел что цикл в результате всяческих экспериментов был установлен 6000.
> проще передать массив байт через сокеты
Это как ?
TSocket, Indy
-
> сразу не посмотрел что цикл
Какой нафих цикл ?
Где в коде в [42] ты видишь цикл ?
> Не к первой, а к 6000
И что ?
С чего ты взял, что 6001-я запись и все последующие вплоть до последней загружены ?
> TSocket, Indy
И каким же образом ты с их помощью (без использования SQL-запросов !) намерен обратиться к БД под управлением MySQL ?
Данные-то, которые ты собрался в массив перегнать, лежат именно там, и достать их оттуда можно только передав MySQL-серверу запрос и получив результат ..
-
Сергей М. © (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]
> Так я с сотки писал
Понятно.
Чукча не читатель, чукча - писатель.
> практически теоретическую серверную часть
О Боже, упаси юзеров от встреч с таким вот Балепой !
Пока никто не жаловался. Просто сделал пока для экспериментов программку которая кидает по 800 записей/с в БД.
В данный момент реализовано на файлах, т.е. все что надо скидывается в файлы, а с них уже клиентские программы считывают то что им нужно. А я тут решился переделать что бы обойтись без файлов (а то последнее время часто доступов до них нет иногда по 1 минуте, а это ни есть хорошо) и первая мысль была о какой нибудь БД, а теперь сокеты ).
-
> Пока никто не жаловался
Пока , значит, пронесло)
-
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);
а тормоза вот тут :)