Гость
Целевая тема:
Создать новую тему:
Автор:
Форумы / Firebird, InterBase [игнор отключен] [закрыт для гостей] / Почему разная скорость запроса из IBExpert и из программы? / 25 сообщений из 33, страница 1 из 2
08.09.2017, 09:22
    #39517964
Devillio
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Почему разная скорость запроса из IBExpert и из программы?
Доброго времени суток, помогите разобраться?

Вот такой незамысловатый запрос
Код: 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
08.09.2017, 09:33
    #39517980
Симонов Денис
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Почему разная скорость запроса из IBExpert и из программы?
Devillio,

в IBExpert кнопочку FetchAll пробовал нажать?
...
Рейтинг: 0 / 0
08.09.2017, 09:41
    #39517984
Devillio
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Почему разная скорость запроса из IBExpert и из программы?
Симонов Денис, конечно ))
...
Рейтинг: 0 / 0
08.09.2017, 10:17
    #39518009
rdb_dev
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Почему разная скорость запроса из IBExpert и из программы?
Devillio, может посмотрим на план?
...
Рейтинг: 0 / 0
08.09.2017, 10:28
    #39518017
Devillio
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Почему разная скорость запроса из IBExpert и из программы?
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
08.09.2017, 10:38
    #39518025
Exteris
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Почему разная скорость запроса из IBExpert и из программы?
А точно запрос тормозит, а не заполнение FIOsList?
...
Рейтинг: 0 / 0
08.09.2017, 10:43
    #39518028
Devillio
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Почему разная скорость запроса из IBExpert и из программы?
Exteris, есть процедура (заремаренная "CONSTRUCTFIOSLIST"), она собирает такой же список фамилий, как и запрос, только "перебором". Вот если выполнять ее, то она тоже работает быстро (из программы). Ну может чуть медленнее, чем запрос через List в IBE.
Т.о. разница только в работе самого запроса, делфийская составляющая, как мне кажется, работает правильно.
...
Рейтинг: 0 / 0
08.09.2017, 11:54
    #39518059
Ivan_Pisarevsky
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Почему разная скорость запроса из IBExpert и из программы?
Если запрос выполняется несколько секунд, то нахрена вся эта возня с тредами, ждалками и т.п.
Вот я разносил по тредам сборы отчетов, которые идут от 5 минут и дольше.

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

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

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

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

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

Жаль в ранних Delphi не было TList<string>
...
Рейтинг: 0 / 0
08.09.2017, 12:58
    #39518122
Arioch
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Почему разная скорость запроса из IBExpert и из программы?
Сравнение с 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
08.09.2017, 13:13
    #39518133
Гаджимурадов Рустам
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Почему разная скорость запроса из IBExpert и из программы?
Arioch> LaDB.Connected := True;
> Вот этой дополнительной паузы у IBE нет.
> А вот здесь ты просто выпрашиваешь access violation

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

Человек же русским по белому говорит, что
с процедурой у него всё нормально работает.
Тут выяснять надо, где и кто/что кому врёт,
а ты ему про перламутровые пуговицы.
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
08.09.2017, 13:18
    #39518138
Devillio
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Почему разная скорость запроса из IBExpert и из программы?
Благодарю всех за варианты и советы!!
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
08.09.2017, 13:19
    #39518140
Devillio
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Почему разная скорость запроса из IBExpert и из программы?
Гаджимурадов Рустам, вот!! Спасибо ))) Да, так и есть
...
Рейтинг: 0 / 0
08.09.2017, 13:24
    #39518149
Гаджимурадов Рустам
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Почему разная скорость запроса из IBExpert и из программы?
Devillio> Программа, получив один раз при запуске (в потоке, чтобы не было задержек запуска) списки авторов для всех публикаций, при запросах выборок очень быстро работает.

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

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

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

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

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

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

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

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

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

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

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

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

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

Мнэээ... TStrings?

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

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

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

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


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