Форум: "Базы";
Текущий архив: 2004.08.22;
Скачать: [xml.tar.bz2];
ВнизУскорение выполнения SQL - запросов Найти похожие ветки
← →
saNat © (2004-07-24 00:55) [0]Доброго времени суток.
Сейчас работаю над первым реальным проектом. Нужно написать БД. Не хотелось использовать визуальные компоненты bd*, поэтому использую запросы SQL. Однако при их выполнении возникают задержки, причем достаточно заметные.
Подскажите пожалуйста, что можно сделать для ускорения работы. Могу скинуть на Ваш E-Mail исходники (~90Kb в архиве)
С уважением, ЕВА
← →
GanibalLector © (2004-07-24 01:13) [1]>Сейчас работаю над первым реальным проектом
Реальные проекты на парадоксе не делаются.
>Не хотелось использовать визуальные компоненты bd*, поэтому использую запросы SQL
А вот тут я вообще ничего не понял...
>Могу скинуть на Ваш E-Mail исходники
Давай посмотрим...Talla2k#ukr.net
← →
Fay © (2004-07-24 18:37) [2]Кидай, поглядим.
← →
saNat © (2004-07-25 00:13) [3]to Fay: анкета недоступна...
← →
viktor (2004-07-25 00:18) [4]Запросы через ХП?
← →
DrPass © (2004-07-25 01:07) [5]
> Запросы через ХП?
Особенно в Парадоксе
← →
Fay (2004-07-25 03:26) [6]2saNat © (25.07.04 00:13) [3]
На ник нажать не судьба?
← →
saNat © (2004-07-25 10:49) [7]Именно - Paradox в ХР.
← →
saNat © (2004-07-25 11:00) [8]to GanibalLector, Fay: выслал исходники...
← →
GanibalLector © (2004-07-25 23:38) [9]2 saNat
Посмотрел я эти исходники... :(
Никак не могу понять,почему не использовать тот же DBGrid?У Вас нет ни одного .Вы,по непонятным мне причинам,после выполнения запросов результаты перебрасываете в StringGrid и подобные.И,именно на этом,и получаете задержки от которых хотите избавиться.
З.Ы. ИМХО меняйте StringGrid-ы на DBGrid-ы.И пора уже забыть Парадокс.Фиб,Интербес бесплатны и намного лучше.
← →
saNat © (2004-07-25 23:59) [10]to GanibalLector: Сомневаюсь, что дело в использовании StringGrid вместо DBGrid. Мне показалось, что тормоза в момент вызова SQL.Open... Хотя может быть я не прав.
Не знаю я преимуществ InterBase перед Paradox"ом. У меня был выбор между Oracle и Paradox - для данной задачи все очевидно. После завершения обращу внимание на IB.
← →
Fay © (2004-07-26 02:26) [11]2saNat © (25.07.04 23:59) [10]
1) Чем Вам Oracle не угодил?!
2) Не стоит заканчивать под рагадохом. Переход займёт не больше одного дня. И сразу счастье! 8)
← →
saNat © (2004-07-26 07:27) [12]> Fay © (26.07.04 02:26) [11]
> 1) Чем Вам Oracle не угодил?!
Может я ошибаюсь, но Oracle требует неплохую машину для работы. А у меня клиентское приложение может работать на машинах типа P-II
← →
Fay © (2004-07-26 09:19) [13]1) Клиент может стоять на машине и попроще.
2) А какой объём данных предвидится?
← →
Sergey13 © (2004-07-26 09:39) [14]2saNat © (25.07.04 23:59) [10]
>У меня был выбор между Oracle и Paradox
Я тащусь. 8-) Ты не то выбрал! 8-)))))
А чем был обусловлен выбор? Наличием левых компактов, знаниями или еще чем?
← →
bushmen © (2004-07-26 09:41) [15]>У меня был выбор между Oracle и Paradox
Никаких других СУБД не знаешь? :)
← →
DenK_vrtz © (2004-07-26 09:45) [16]>Sergey13 © (26.07.04 09:39) [14]
>А чем был обусловлен выбор?
а на денюжке всего две стороны, не той стороной упала :)
← →
saNat © (2004-07-27 15:39) [17]А как связан Paradox и XP? [4][5]
← →
Sandman25 © (2004-07-27 15:40) [18][17] saNat © (27.07.04 15:39)
В данном контексте XP - это хранимые процедуры, а не Windows XP :)
← →
saNat © (2004-07-27 15:41) [19]Один из моих знакомых выдвинул версию - каждый раз при выполнении SQL.Open происходит загрузка и выгрузка драйвера и на это уходит время - та самая задержка. На сколько это верно и если это так, то как можно держать драйвер в памяти на время работы приложения?
← →
Sandman25 © (2004-07-27 15:45) [20][19] saNat © (27.07.04 15:41)
Это неверно.
← →
sniknik © (2004-07-27 16:18) [21]Sandman25 © (27.07.04 15:45) [20]
> [19] saNat © (27.07.04 15:41)
> Это неверно.
ну не всегда, в случае когда движок реализован как COM обьект, именно так и происходит, первый вызов. только не на SQL.Open а на конект.Open (и при условии что ктото гдето не работает с ним).
ADO это ком обьект.
> то как можно держать драйвер в памяти на время работы приложения?
в общем случае, без указания движка, говорить не о чем.
но даже в случае когда это так и есть главное не закрывать конект. (хотя даже закрытие еще не все, оно не выгружается сразу а только после какогото таймаута)
← →
Sergey13 © (2004-07-27 16:30) [22]2saNat ©
ИМХО, у тебя в голове каша приличная.
>"Драйверы в памяти"
>"Не хотелось использовать визуальные компоненты bd*, поэтому использую запросы SQL."
>У меня был выбор между Oracle и Paradox
Ты наверное про индексы только слышал и запросы пишешь только типа select * from Table. Будь попроще, спрашивай поконкретнее.
← →
saNat © (2004-07-28 19:24) [23]Попробовал я сделать базу в Access - скорости не прибавилось... Почему тормозит на SQL.Open?
← →
Fay © (2004-07-28 19:34) [24]Уважаемый автор! Вы ваще уже совсем офигели, что-ли?!
>> Почему тормозит на SQL.Open?
Да потому! Много здесь кто видел структуру базы и примеры запросов? Не очень. Вы бы ещё спросили - "А почему (желательно поподробней!) моя программа работает не совсем так, как я хочу?".
Всё уже сказано, и с Вашей стороны, видимо, ничего предпринято не было.
Творческих Вам успехов.
← →
bushmen © (2004-07-28 20:04) [25]> Творческих Вам успехов.
Которых, как я предвижу, в ближайшем будущем не предвидется.
← →
Fay © (2004-07-28 20:16) [26]2bushmen © (28.07.04 20:04) [25]
Может быть. Но вдруг, после завершения первого реального проекта, автор продолжит разработку нереальных? 8)
← →
bushmen © (2004-07-28 20:22) [27]> Fay © (28.07.04 20:16) [26]
Все может быть в этом мире бушующем :)
← →
sniknik © (2004-07-28 20:44) [28]> Почему тормозит на SQL.Open?
а почему бы ему не потормозить в удовольствие? ведь это вам надо чтобы было быстро а ему абсолютно пофигу, оно делает то что ты написал а не то что тебе хочется.
ответь на это и я отвечу на твой (с определенной степенью вероятности, придется ведь догадыватся).
← →
saNat © (2004-07-28 22:15) [29]to Fay уж у кого, а у Вас все исходники имеются и претензии по этому поводу мне непонятны [24]
P.S. С уважением...
← →
GanibalLector © (2004-07-29 00:49) [30]2 saNat
Уважаемый ,Вы бы успокоились и попробовали сделать так как я говорил.Замочить все StringGrid-ы и вместо них поставить DBGrid-ы.Дальше,замочить ТОТ класс и вообще забыть про классы...а использовать DataSourсe и связанные с ним гриды.
← →
saNat © (2004-07-29 07:34) [31]to GanibalLector ну да я сильно и не нервничаю [30] :-) а переделать, конечно, можно, но смысл терять время - ведь действия выполняемые мной с помощью методов ReadBD и WriteBD по сути аналогичны компонентам DBGrid и т.п. с той лишь разницей, что я хотел сделать их заточенными под выполнение конкретных действий в своем приложении. переделать не поленюсь.
С уважением...
← →
ЮЮ © (2004-07-29 07:53) [32]GanibalLector © (29.07.04 00:49) [30]
Вот только SQL.Open это никак не ускорит, если, конечно, заполненме StringGrida не стоит в обработчике SQL.OnAfterOpen.
>поставить DBGrid-ы.Дальше,замочить ТОТ класс и вообще забыть про классы...а использовать DataSourсe и связанные с ним гриды.
Я только через многие годы понял, насколько слаб DBGrid и стал разрабатывать и использовать собственные классы, а тут человек с первого реального проекта взялся за творчество!!!
>замочить ТОТ класс и вообще забыть про классы...
Вам пора в Президенты, молодой человек :-)
← →
ЮЮ © (2004-07-29 07:57) [33]автору
если вы по-прежнему стесняетесь опубликовать текст запроса и структуры используемых таблиц, шлите уж и сюда
Kolesov <ухо> msun <тчк> ru
← →
sniknik © (2004-07-29 08:09) [34]> ведь действия выполняемые мной с помощью методов ReadBD и WriteBD по сути аналогичны компонентам DBGrid и т.п.
наверняка нет (незнаю что ты там делаеш), но отличия скорее всего координальные.
1 ты перегоняеш весь рекордсет в стринггрид (предположение) а дбгрид работает с отображаемой областью only.
2 преобразований данных в строки (длительныя операция) в дбгриде не требуется (во всяком случае для всех записей, а только для того минимума что будет отображен)
3 скорее всего еще есть, но предположения уже достали.
SQL.Open также не ускорит безпочвенный треп здесь, можеш не заморачиваться, никто тебе не даст готового рещения без исходных данных и твоего активного участия, а этого ты похоже делать не собираешся. (еще одно предположение ;)
← →
saNat © (2004-07-29 13:28) [35]Угу... Ок, сегодня после работы выложу: метод чтения из БД и структуры таблиц - всё?
С уважением...
← →
Term (2004-07-29 14:37) [36]
> сегодня после работы выложу: метод чтения из БД и структуры
> таблиц
а что тянуть до конца рабочего дня, делов то пару кликов мышой
← →
Rule © (2004-07-29 15:56) [37]2Автор
Не обижайтесь на нападки моих коллег, просто не надо было использовать такие громкие слова как "я работаю над реальным проектои" и " у меня был выбор между такими СУБД", я бы посоветовал эти фразы поменять на такие : " вот только начал пробовать писать программы и мне показалось что лучше было бы использовать вот такие СУБД ... , подскажите пожалуйста, в чем я заблуждаюсь и где можна взять литературу"
со своей стороны я бы хотел вам посоветовать обратится за информацией на сайтик ibase.ru так как считаю что наиболее универсальной и простой является именно интербейз (фаерберд) и причем абсолютно бесплатная, на сайте достаточно информации, чтобы от азов дойти до профессионала ...
От дужи вам желаю творческой удачи и не сдавайтесь, скоро и вы будете смеятся над начинающими :)
← →
sniknik © (2004-07-29 22:20) [38]> скоро и вы будете смеятся над начинающими :)
смысл не в этом, и кстати редко кто над ними смеется, чаше досада на чела который обшатся не умеет. а ведет себя как партизан про свое сказать как можно меньше (уж если совсем припрут) но тем не менее выбить/выциганить/выпросить/... ответ на вопрос.
не понимая что ответ с вопросом взяимосвязаны.
а когда вопросы больще на развод похожи, естественно в ответ только насмешки.
← →
saNat © (2004-07-30 00:16) [39]Ну вот только добрался до Internet"а... Он у меня дома, а не на рабочем месте и обеденный перерыв лимитирован [36]
Ну по поводу "реального проекта" , то имелось ввиду приложение, которое должен работать, принося пользу и т.п., а не решение школьных задачек и экспериментов с чем-либо (что то же не плохо, но все же разные вещи). "Выбор между Paradox и Oracle" - ну так оно и было - с Paradox"ом начинал изучать БД, а Oracle "изучали" в университете... Больше ни чем ни пользовался. Был вариант с Access, но не знаю... склонился к первому. Спасибо Rule www.IBase.ru [37]. Будем знать.-------------
По поводу того, что нет кода - мне не всегда удается найти проблему, если она вырезана из общей массы и ты не знаешь как оно работает в целом... С другой стороны, понятно, что навязывать копаться в своих исходниках - не дело. Поэтому сразу было предложено скинуть исходники желающим... В любом случае исправляюсь.-------------
Идея состоит в передаче данных из филиалов в управление посредством e-mail. Данные представляют собой отчеты о деятельности за сутки. На данный момент все передается по телефону - лорого. Однако филиалы нужно оборудовать машинами, убедить начальство что проект выгоднее экономически и т.п. в конце-концов отладить саму программу. Поэтому на первом этапе предполагается ввод данных по телефону, но не в стандартные бумажные формы, а посредством приложения-сервера. Одновременно с этим решается задача резервирования - на случай если нет возможности доставки данных по эл. почте. Для решения вопроса со скоростью передачи я использую списки с данными - набирать текст гораздо дольше чем шелкать мышью по спискам. Сюда входят стандартные типы работ, список филиалов, персонал, а/м. Все эти данные разнесены по таблицам вида:
Филиалы
PhilialTable
------------
ID
Name
Address
PhoneCode
Персонал
PeopleTable
-----------
ID
FIO
Post
Автотранспорт
AutoTable
---------
ID
AutoType
AutoNumber
PhilialID
Таблица-связка для определения принодлежности персонала к филиалу
PhilialPeopleTable
------------------
PhilialID
PeopleID
← →
saNat © (2004-07-30 00:31) [40]На рабочей форме лежит компонент PageControl. Его вкладки разбиты по темам. Например, информация о филиале, аварийные заявки, опасные заявки...
Ну вот не лежит у меня душа со времен университета к компонентам DB* (Grid и подобные)... Мне показалось что будет лучше написать свой модуль для чтения/записи БД, работающий со "стандартными" компонентами
Получилось нечто следующее:
//Чтение данных
Procedure TBDModule.ReadBD(Component:TObject; FieldsList:String;TablesList:String;WheresList:String;WhereOn:Boolean);
Var
RowPosition:Integer;
ColPosition:Integer;
Begin
//Определение количества полей запроса
FieldsCount:=SetFieldsCount(FieldsList);
With MySQL Do
Begin
//Деактивация компонента
Close;
//Очистка текста запроса
SQL.Clear;
//Добавление текста запроса
SQL.Add("Select "+FieldsList+" From "+TablesList);
If WhereOn
Then SQL.Add("Where "+WheresList);
//Выполнение запроса
Open;
//Установка указателя на первую запись
First;
//Вывод данных в компонент типа "TListBox"
If Component.ClassName="TListBox"
Then
Begin
//Очистить
(Component As TListBox).Items.Clear;
//Пока не закончатся данные
While Not EOF Do
Begin
//Вывести значение
(Component As TListBox).Items.Add(FieldByName(SetFieldsByNumber(FieldsList,1)).AsString);
//Перейти к следующей записи
Next;
End;
End;
//Вывод данных в компонент типа "TCheckListBox"
If Component.ClassName="TCheckListBox"
Then
Begin
//Очистить
(Component As TCheckListBox).Items.Clear;
//Пока не закончатся данные
While Not EOF Do
Begin
//Вывести значение
(Component As TCheckListBox).Items.Add(FieldByName(SetFieldsByNumber(FieldsList,1)).AsString);
//Перейти к следующей записи
Next;
End;
End;
//Вывод данных в компонент типа "TEdit"
If Component.ClassName="TEdit"
Then
Begin
//Очистить
(Component As TEdit).Text:="";
//Вывести значение
(Component As TEdit).Text:=FieldByName(SetFieldsByNumber(FieldsList,1)).AsString;
End;
//Вывод данных в компонент типа "TLabel"
If Component.ClassName="TLabel"
Then
Begin
//Очистить
(Component As TLabel).Caption:="";
//Пока не закончатся данные
While Not EOF Do
Begin
//Вывести значение
(Component As TLabel).Caption:=(Component As TLabel).Caption+FieldByName(SetFieldsByNumber(FieldsList,1)).AsString+", ";
//Перейти к следующей записи
Next;
End;
(Component As TLabel).Caption:=Copy((Component As TLabel).Caption,1,Length((Component As TLabel).Caption)-2);
End;
//Вывод данных в компонент типа "TIDField"
If Component.ClassName="TIDField"
Then
Begin
//Очистить
(Component As TIDField).Code:="";
//Вывести значение
(Component As TIDField).Code:=FieldByName(SetFieldsByNumber(FieldsList,1)).AsString;
End;
//Вывод данных в компонент типа "TStringGrid"
If Component.ClassName="TStringGrid"
Then
Begin
(Component As TStringGrid).RowCount:=2;
ColPosition:=0;
While ColPosition<=((Component As TStringGrid).ColCount-1) Do
Begin
(Component As TStringGrid).Cells[ColPosition,1]:="";
Inc(ColPosition);
End;
RowPosition:=1;
While Not EOF Do
Begin
ColPosition:=0;
While ColPosition<=((Component As TStringGrid).ColCount-1) Do
Begin
(Component As TStringGrid).Cells[ColPosition,RowPosition]:=FieldByName(SetFieldsByNumber(FieldsList,ColPosition+1)).AsString;
Inc(ColPosition);
End;
Next;
If Not EOF
Then
Begin
(Component As TStringGrid).RowCount:=(Component As TStringGrid).RowCount+1;
Inc(RowPosition);
End;
End;
End;
If Component.ClassName="TComboBox"
Then
Begin
(Component As TComboBox).Items.Clear;
While Not EOF Do
Begin
(Component As TComboBox).Items.Add(FieldByName(SetFieldsByNumber(FieldsList,1)).AsString);
Next;
End;
End;
End;
End;
Внутрь я передаю объект, в который собираюсь выводить данные, список полей, список таблиц и список условий отбора (если требуется - последний параметр). Т.К. с TStrings я до конца не разобрался (пока), то параметры передаются строкой и пришлось сделать метод для поиска метода по его порядку в списке... После самого запроса следует реализация вывода в различные "объекты-приемники."
Страницы: 1 2 вся ветка
Форум: "Базы";
Текущий архив: 2004.08.22;
Скачать: [xml.tar.bz2];
Память: 0.58 MB
Время: 0.04 c