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

Наверх





Память: 0.58 MB
Время: 0.03 c
9-1083477699
Smoke_Gomel
2004-05-02 10:01
2004.08.22
Анимированные спрайты в Delphix


4-1089626855
Help
2004-07-12 14:07
2004.08.22
Проблема с свойством "Stay On Top"


3-1091178014
Вика
2004-07-30 13:00
2004.08.22
проблема c updateSQL


14-1091688422
Slider007
2004-08-05 10:47
2004.08.22
Вопрос по поводу кабеля (витая пара)


14-1091719602
Cerberus
2004-08-05 19:26
2004.08.22
Хочяу в орешник





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
Английский Французский Немецкий Итальянский Португальский Русский Испанский