Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2004.08.22;
Скачать: CL | DM;

Вниз

Ускорение выполнения 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
E-Mail

Персонал
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;
Скачать: CL | DM;

Наверх




Память: 0.59 MB
Время: 0.046 c
3-1090843450
AleXqwq
2004-07-26 16:04
2004.08.22
ADO+MySql


8-1085399920
ПсихЪ_клон
2004-05-24 15:58
2004.08.22
glColor4f в OpenGL под Delphi


1-1091620202
Anton777
2004-08-04 15:50
2004.08.22
Удаление файла при помощи реестра


1-1092039455
Леван
2004-08-09 12:17
2004.08.22
Как емулировать CONDENSED для шрифта


3-1090836150
MORA
2004-07-26 14:02
2004.08.22
Каскадное удаление вручную