powered by simpleCommunicator - 2.0.51     © 2025 Programmizd 02
Форумы / Firebird, InterBase [игнор отключен] [закрыт для гостей] / Почему разная скорость запроса из IBExpert и из программы?
25 сообщений из 33, страница 1 из 2
Почему разная скорость запроса из IBExpert и из программы?
    #39517964
Devillio
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Доброго времени суток, помогите разобраться?

Вот такой незамысловатый запрос
Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
select tc.ID,

(with N as (
  select NAME
    from
    TFIOS t inner join SPFIOS s on s.ID=t.IDFIO
  where t.IDCAT = tc.ID and t.idkind = 1
  order by NAME)
select list(NAME, ', ')
from N) as FIOS
from TCATALOG tc order by tc.ID



Из IBExpert выполняется отлично, все данные за несколько секунд.

Сбацал все это в поток в Делфи, вот так
Код: pascal
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
44.
45.
46.
47.
48.
49.
50.
51.
52.
53.
54.
55.
56.
57.
58.
59.
60.
61.
62.
63.
64.
65.
66.
67.
68.
69.
procedure TFillUpFIOsThread.Execute;
var D: TpFIBDataset;
  RecC: Integer;
begin
  inherited;
  try
    LaDB := TFIBDatabase.Create(nil);
    LaTRN := TFIBTransaction.Create(nil);

    LaDB.DefaultTransaction := LaTRN;

    D := TpFIBDataSet.Create(LaDB);
    D.Database := LaDB;
    D.Transaction := LaTRN;

    LaDB.LibraryName := DM.FIBDB.LibraryName;
    LaDB.UseLoginPrompt := False;
    LaDB.DatabaseName := DM.FIBDB.DatabaseName;
    LaDB.DBParams := DM.FIBDB.DBParams;
    LaDB.SQLDialect := DM.FIBDB.SQLDialect;
    LaDB.DefaultTransaction := LaTRN;
    LaTRN.DefaultDatabase := LaDB;
    LaTRN.TRParams := DM.TRNRead.TRParams;

    LaDB.Connected := True;

    with D do
    begin
      SelectSQL.Text := 'select count(ID) from TCATALOG';
      Open;
      RecC := Fields[0].AsInteger;
      Close; SelectSQL.Clear;
//      SelectSQL.Text := 'select c.ID, (SELECT FIOS FROM CONSTRUCTFIOSLIST(c.ID)) as AUTHLIST from TCATALOG c order by c.ID';
      SelectSQL.Add('select c.ID,');
      SelectSQL.Add('(with N as (');
      SelectSQL.Add('  select NAME');
      SelectSQL.Add('    from');
      SelectSQL.Add('    TFIOS t inner join SPFIOS s on s.ID=t.IDFIO');
      SelectSQL.Add('  where t.IDCAT = c.ID and t.idkind = 1');
      SelectSQL.Add('  order by NAME)');
      SelectSQL.Add('select list(NAME, '', '')');
      SelectSQL.Add('from N) as AUTHLIST');
      SelectSQL.Add('from TCATALOG c '); //order by c.ID
      Open;
      while not EOF do
      begin
        if Terminated then Exit;
        //mutex? ahz
        MainForm.FIOsList.Add(Fields[0].AsInteger, Fields[1].AsString);
        if RecNo mod 1000 = 0 then
        begin
          PBPos := Round(RecNo / RecC * 100);
          Synchronize(MainForm.DrawPBPos);
        end;
        Next;
      end;
      Close;
    end;

  finally
    FreeAndNil(D);
    FreeAndNil(LaTRN);
    FreeAndNil(LaDB);
    Synchronize(MainForm.HidePB);

    if not Terminated then
      FreeAndNil(MainForm.FillUpFIOsThread);
  end;
end;



скорость на пару порядков медленнее, чем из IBE, почему?
Есть процедура, делающая почти то же самое (заремаренная строчка). Если выгружать через нее, то скорость нормальная и из Делфи. Но хочется понять, почему запрос-то из программы так медленно работает?

Спасибо!
...
Рейтинг: 0 / 0
Почему разная скорость запроса из IBExpert и из программы?
    #39517980
Фотография Симонов Денис
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Devillio,

в IBExpert кнопочку FetchAll пробовал нажать?
...
Рейтинг: 0 / 0
Почему разная скорость запроса из IBExpert и из программы?
    #39517984
Devillio
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Симонов Денис, конечно ))
...
Рейтинг: 0 / 0
Почему разная скорость запроса из IBExpert и из программы?
    #39518009
rdb_dev
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Devillio, может посмотрим на план?
...
Рейтинг: 0 / 0
Почему разная скорость запроса из IBExpert и из программы?
    #39518017
Devillio
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
rdb_dev, это в IBExpert

План
PLAN SORT (JOIN (N T INDEX (TFIOS_IDX_COMMON), N S INDEX (PK_SPFIOS)))
PLAN (TC ORDER PK_TCATALOG)

------ Информация о производительности ------
Время подготовки запроса = 15ms
Время выполнения запроса = 16ms
Среднее время на получение одной записи = 0,55 ms

Как в делфи посмотреть - не знаю :(
...
Рейтинг: 0 / 0
Почему разная скорость запроса из IBExpert и из программы?
    #39518025
Фотография Exteris
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
А точно запрос тормозит, а не заполнение FIOsList?
...
Рейтинг: 0 / 0
Почему разная скорость запроса из IBExpert и из программы?
    #39518028
Devillio
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Exteris, есть процедура (заремаренная "CONSTRUCTFIOSLIST"), она собирает такой же список фамилий, как и запрос, только "перебором". Вот если выполнять ее, то она тоже работает быстро (из программы). Ну может чуть медленнее, чем запрос через List в IBE.
Т.о. разница только в работе самого запроса, делфийская составляющая, как мне кажется, работает правильно.
...
Рейтинг: 0 / 0
Почему разная скорость запроса из IBExpert и из программы?
    #39518059
Ivan_Pisarevsky
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Если запрос выполняется несколько секунд, то нахрена вся эта возня с тредами, ждалками и т.п.
Вот я разносил по тредам сборы отчетов, которые идут от 5 минут и дольше.

DevillioНо хочется понять, почему запрос-то из программы так медленно работает?Трассировку включи (предполагаю, что ФБ не ниже 2.5)
...
Рейтинг: 0 / 0
Почему разная скорость запроса из IBExpert и из программы?
    #39518064
Гаджимурадов Рустам
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Devillio> Т.о. разница только в работе самого запроса, делфийская
Devillio> составляющая, как мне кажется, работает правильно.

А замеры что показывают? Если всё это из потока вынести то же самое?
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
Почему разная скорость запроса из IBExpert и из программы?
    #39518078
Фотография kdv
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
DevillioВремя подготовки запроса = 15ms
Время выполнения запроса = 16ms
сильно сомневаюсь, что эти данные получены при FetchAll (кнопочка такая с ДВУМЯ треугольниками).
В первую очередь надо
- вытащить код из thread, и оформить его в тестовом приложении по кнопке
- замерить время полного выполнения, потом закомментировать FIOsList, и померять еще раз.

p.s. Как-то раз столкнулся с тем, что очень медленно грузились данные из текстового файла. Оказалось, что виноват TStringList. Пришлось переделать обработку на обычный textfile.
...
Рейтинг: 0 / 0
Почему разная скорость запроса из IBExpert и из программы?
    #39518081
Dimitry Sibiryakov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
DevillioТ.о. разница только в работе самого запроса, делфийская составляющая, как мне
кажется
, работает правильно.

Ты наивен.
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
Почему разная скорость запроса из IBExpert и из программы?
    #39518117
Arioch
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
kdv,

TStringList - вообще жутко тормозная вещь. Что, в общем, ппонятно - если посмотреть на его весьма больше список методов, свойства и даже событий.

Жаль в ранних Delphi не было TList<string>
...
Рейтинг: 0 / 0
Почему разная скорость запроса из IBExpert и из программы?
    #39518122
Arioch
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Сравнение с IBE сильно не честное

Devillio
Код: pascal
1.
   LaDB.Connected := True;



Вот этой дополнительной паузы у IBE нет.

Devillio
Код: pascal
1.
      SelectSQL.Text := 'select count(ID) from TCATALOG';



И этой нет. А это потенциально - считывание ВСЕЙ таблицы с диска и сборка мусора по ней.

Devillio
Код: pascal
1.
          Synchronize(MainForm.DrawPBPos);



И этой - нет.

Devillio
Код: pascal
1.
    Synchronize(MainForm.HidePB);



И этой - нет.


Devillio
Код: pascal
1.
2.
3.
4.
  finally
    FreeAndNil(D);
    FreeAndNil(LaTRN);
    FreeAndNil(LaDB);



А вот здесь ты просто выпрашиваешь access violation

Devillio
Код: pascal
1.
2.
3.
 
      FreeAndNil(MainForm.FillUpFIOsThread);
  end;



А здесь вообще тихий ужас и таймаут неопределенной длительности.
...
Рейтинг: 0 / 0
Почему разная скорость запроса из IBExpert и из программы?
    #39518133
Гаджимурадов Рустам
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Arioch> LaDB.Connected := True;
> Вот этой дополнительной паузы у IBE нет.
> А вот здесь ты просто выпрашиваешь access violation

Желаю чтобы все! (с)

Человек же русским по белому говорит, что
с процедурой у него всё нормально работает.
Тут выяснять надо, где и кто/что кому врёт,
а ты ему про перламутровые пуговицы.
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
Почему разная скорость запроса из IBExpert и из программы?
    #39518138
Devillio
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Благодарю всех за варианты и советы!!
Arioch, работает же, никаких violation уже с год у кучки народа. Просто ни разу. Т.е. с порядка нескольких десятков тысяч запусков.

если изменить вот так:
Код: pascal
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
      SelectSQL.Text := 'select c.ID, (SELECT FIOS FROM CONSTRUCTFIOSLIST(c.ID)) as AUTHLIST from TCATALOG c order by c.ID';
//      SelectSQL.Add('select c.ID,');
//      SelectSQL.Add('(with N as (');
//      SelectSQL.Add('  select NAME');
//      SelectSQL.Add('    from');
//      SelectSQL.Add('    TFIOS t inner join SPFIOS s on s.ID=t.IDFIO');
//      SelectSQL.Add('  where t.IDCAT = c.ID and t.idkind = 1');
//      SelectSQL.Add('  order by NAME)');
//      SelectSQL.Add('select list(NAME, '', '')');
//      SelectSQL.Add('from N) as AUTHLIST');
//      SelectSQL.Add('from TCATALOG c '); //order by c.ID


То все летает почти так же, как и из IBExpert.
CONSTRUCTFIOSLIST делает ровно то же самое, что и этот запрос с list, только без list, через перебор записей (через list в IBE чуть быстрее).

Т.о. вывод напрашивается - дельфийская составляющая, очень похоже, что ни при чем. То есть, естественно, при чем, но я имею ввиду весь орнамент, который Arioch выделил - он не при чем.

Никаких StringList там нет. Там TDictionary(Integer, String)
Зачем выделено в поток? Программа для библиотеки. Библиографы (их много) делают различные выборки постоянно. От пары-тройки публикаций до тысяч. Программа, получив один раз при запуске (в потоке, чтобы не было задержек запуска) списки авторов для всех публикаций, при запросах выборок очень быстро работает. Списки просто рисуются в OnGetDataText. Предыдущая версия собирала списки при каждом запросе, разница очень заметна.
Я тупо не знал про list, когда делал ))) недавно вот узнал, хотел "оптимизировать", а оно вононоче ))
...
Рейтинг: 0 / 0
Почему разная скорость запроса из IBExpert и из программы?
    #39518140
Devillio
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Гаджимурадов Рустам, вот!! Спасибо ))) Да, так и есть
...
Рейтинг: 0 / 0
Почему разная скорость запроса из IBExpert и из программы?
    #39518149
Гаджимурадов Рустам
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Devillio> Программа, получив один раз при запуске (в потоке, чтобы не было задержек запуска) списки авторов для всех публикаций, при запросах выборок очень быстро работает.

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

Сначала поток, потом предварительный запрос к
TCATALOG (просто замени на число), потом всё
остальное по одному - пока не поймаешь разницу.
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
Почему разная скорость запроса из IBExpert и из программы?
    #39518188
Фотография kdv
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Devillio,

к слову, про LIST
https://www.ibase.ru/dbgrowth/
...
Рейтинг: 0 / 0
Почему разная скорость запроса из IBExpert и из программы?
    #39518218
Devillio
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
kdv, благодарю за наводку!

Исправил так:
SelectSQL.Add('select cast(list(NAME, '', '') as VARCHAR(4000))'); (4000 - просто что взбрело в голову, 2000 - не прошло, есть публикации где авторы не вместились о.о)

Все полетело, прям заметно ускорилось относительно скорости варианта с процедурой.
Что-то с блобами. Интересно, почему тот запрос без cast в IBE работает быстро
...
Рейтинг: 0 / 0
Почему разная скорость запроса из IBExpert и из программы?
    #39518241
Гаджимурадов Рустам
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Если бы дело было с БЛОБами, то медленно было бы и с IBE.

Или у тебя IBE "на сервере", а поток - на клиенте "за тридевять земель"?
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
Почему разная скорость запроса из IBExpert и из программы?
    #39518254
Devillio
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Гаджимурадов Рустам, нет, конечно. И клиент, и IBE за тридевять земель.
Нет-нет, именно с блобами. Видите, если сделать на сервере в запросе cast и данные пойдут как строка - все хорошо.
Причем, при получении результата запроса с колонкой bloba не только безумно медленно приходят списки авторов в потоке, но и весь клиент явно работает тяжело - дергается как-то, медленно реагирует на мышь, комбобоксы видно как прорисовываются при открытии. А если запрос идет со строчкой - все как обычно, легко и пушисто.
...
Рейтинг: 0 / 0
Почему разная скорость запроса из IBExpert и из программы?
    #39518268
Arioch
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
DevillioArioch, работает же, никаких violation уже с год у кучки народа.

Привычка плохая. С этими объектами в этих условиях работает.
С другими объектами или даже с другой библиотекой - может перестать.
А у тебя такого кода будет по всей программе распихано, ищи потом где именно и почему именно поехало.

Ну хотя, если вовремя уйдешь на лучшее место, то это будут уже не твои проблемы

Devillioс порядка нескольких десятков тысяч

"select * from table" тоже по первому времени оооочень хорошо работает.
...
Рейтинг: 0 / 0
Почему разная скорость запроса из IBExpert и из программы?
    #39518271
Arioch
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
DevillioИнтересно, почему тот запрос без cast в IBE работает быстро

а ты уверен, что он реально сами блобы вычитывает? Я вот думаю, что нет - зачем ему это делать?
...
Рейтинг: 0 / 0
Почему разная скорость запроса из IBExpert и из программы?
    #39518399
Фотография kdv
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Ariochблобы вычитывает? Я вот думаю, что нет - зачем ему это делать?
а вот да. компоненты могут вытаскивать блобы по мере чтения записей, как это BDE делает. А могут не вытаскивать.
...
Рейтинг: 0 / 0
Почему разная скорость запроса из IBExpert и из программы?
    #39518436
Фотография Старый плюшевый мишка
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Ariochkdv,

TStringList - вообще жутко тормозная вещь. Что, в общем, ппонятно - если посмотреть на его весьма больше список методов, свойства и даже событий.

Жаль в ранних Delphi не было TList<string>

Мнэээ... TStrings?

Кстати. Будучи дремучим склеротиком и не заглядывая в Delphi c 26 мая, засомневался в наличии буквы s на хвосте. Не поленился запустить, набрать слово и нажать F1. Вылез хелп по MS Windows и стал объяснять
____________________________________________________________
Почему не удается получить справку по этой программе?

Справка для этой программы была создана в формате справки Windows, который зависит от компонента, не входящего в данную версию Windows. Для просмотра справки, созданной в формате справки Windows, можно загрузить специальную программу.

Дополнительные сведения см. на веб-сайте справки и поддержки Майкрософт.
______________________________________________________________

Поубывав бы...
...
Рейтинг: 0 / 0
25 сообщений из 33, страница 1 из 2
Форумы / Firebird, InterBase [игнор отключен] [закрыт для гостей] / Почему разная скорость запроса из IBExpert и из программы?
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]