powered by simpleCommunicator - 2.0.53     © 2025 Programmizd 02
Форумы / Firebird, InterBase [игнор отключен] [закрыт для гостей] / Статья об использовании Interbase в мобильном Delphi-приложении
14 сообщений из 14, страница 1 из 1
Статья об использовании Interbase в мобильном Delphi-приложении
    #39320313
Калям
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Мной была опубликована статья , посвящённая сравнению SQLite и Interbase по некоторым аспектам. Просьба к экспертам по IB просмотреть её на наличие ошибок или неточностей, особенно раздел о проблеме с нестабильным курсором; если у Вас нет возможности сообщить о найденном на Хабре, то можно сделать это здесь.
...
Рейтинг: 0 / 0
Статья об использовании Interbase в мобильном Delphi-приложении
    #39320334
Фотография Симонов Денис
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Калям,

тут не так много спецов по IB, придёт kdv скажет подробней что там да как.

Хотя по поводу CTE ты прав. По поводу стабильного курсора тоже, но вот только суть проблемы не разъяснил. Непонятно что же там за такое неожиданное поведение. Проблема с полнотекстовым поискам на таблице с 700 записями какая-то хрень, я конечно не пробовал как оно на мобильном устройстве работает, но не думаю что сильно медленно.

Кстати в Firebird 3.0 есть CTE и стабильность курсора исправлена, правда официальной сборки под мобильные платформы пока нет (есть beta).
...
Рейтинг: 0 / 0
Статья об использовании Interbase в мобильном Delphi-приложении
    #39320357
Dimitry Sibiryakov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Калямособенно раздел о проблеме с нестабильным курсором
Учитывая в начале этого раздела фразы "автор даже не пробовал проделать то же извращение
над SQLite", этот раздел можно вообще выкинуть. Хотя можно и оставить: он хорошо
вписывается в общую идею статьи "SQLite УГ, но остальные ещё хуже".
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
Статья об использовании Interbase в мобильном Delphi-приложении
    #39320361
Filippov Dmitry
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Калям,

статья интересная. Спасибо!
По поводу тормозов при поиске с CONTAINING, весьма странно, но поскольку не приведен ни запрос ни скрипты на таблицы (с индексами), участвующие в запросах - сложно что то советовать и комментировать.

Было бы неплохо (на мой субъективный взгляд) также указать ингредиенты, что использованы для проекта:
- версия Delphi, (версия компонентов доступа и прочих если вопросы по ним также желательны)
- версия Interbase.

Объем базы, ну и ТТХ железа, на котором работало приложения и получены высказанные субъективные ощущения о скорости работы.
...
Рейтинг: 0 / 0
Статья об использовании Interbase в мобильном Delphi-приложении
    #39320363
Фотография Симонов Денис
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Dimitry Sibiryakov,

ну я так понял автор слышал звон, да не знает где он. Типа на форуме от Yo услышал о стабильности курсора вот и повторил его слова, а в суть проблемы даже вникнуть не пытался.
...
Рейтинг: 0 / 0
Статья об использовании Interbase в мобильном Delphi-приложении
    #39320369
Фотография Симонов Денис
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Filippov Dmitry,

интересная спору нет, но вот пункт про стабильность курсора я бы на месте автора удалил, тем более что он не понимает суть проблемы.
...
Рейтинг: 0 / 0
Статья об использовании Interbase в мобильном Delphi-приложении
    #39320382
Filippov Dmitry
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Симонов Денис,

согласен про часть "Проблема нестабильного курсора".
Вполне вероятно минимум мутно , но опять, нет структуры данных, примера данных ну и самого понятия, почему UPDATE должен быть именно ТАК написано, вывод: и комментировать сложно.

Ясно одно, что были сложности, и на форумах был совет: "... добавить ORDER BY..." и эта таблетка помогла. :-)
...
Рейтинг: 0 / 0
Статья об использовании Interbase в мобильном Delphi-приложении
    #39320442
Калям
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Симонов ДенисКстати в Firebird 3.0 есть CTE и стабильность курсора исправлена, правда официальной сборки под мобильные платформы пока нет (есть beta).Где можно узнать подробности про эти сборки?

Dimitry Sibiryakovэтот раздел можно вообще выкинуть. Хотя можно и оставить: он хорошо
вписывается в общую идею статьи "SQLite УГ, но остальные ещё хуже".Я, честно говоря, теряюсь в догадках как можно было выйти на такую идею. Цель статьи сформулирована в самом её начале, и она довольно нейтральна - задачи составлять рейтинг или советовать к применению конкретную СУБД не было - читатель должен сам определиться в каждом своём проекте, основываясь на приведённых минусах и плюсах обеих.

Симонов Денисну я так понял автор слышал звон, да не знает где он. Типа на форуме от Yo услышал о стабильности курсора вот и повторил его слова, а в суть проблемы даже вникнуть не пытался.Filippov DmitryЯсно одно, что были сложности, и на форумах был совет: "... добавить ORDER BY..." и эта таблетка помогла. :-)Автор лично столкнулся с этой проблемой, потратил на неё много времени и был бы крайне рад вернуться в прошлое, прочесть о ней где-то заранее и сэкономить почти неделю. Кстати, решение с ORDER BY получено как раз на этом форуме.
...
Рейтинг: 0 / 0
Статья об использовании Interbase в мобильном Delphi-приложении
    #39320446
Фотография kdv
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
КалямСамым горьким, даже ошарашивающим недостатком Interbase (особенно учитывая какой сегодня год) стала невозможность применять производные (derived) таблицы:

Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
SELECT ...
FROM
  TABLE_1
  JOIN
    (
    SELECT ...
    FROM TABLE_2
    ) ON ...



... стыд. :-) ну хоть бы пример получше сделал, или написал select ... from (select...).
Вот за этот пример я бы по столу кулаком треснул, как минимум :-) Нафига джойн через derived tables, если можно написать нормальный join? Но да, в IB нет derived tables.

Калямлибо применять ХП, изменив тип соединения

Код: sql
1.
2.
3.
4.
SELECT ...
FROM
  TABLE_1 T_1
  LEFT JOIN SP_NAME(T_1.FIELD_NAME) ON 0 = 0



это вообще из другой оперы. Смешались в кучу кони...

КалямДругим серьёзным доводом за ХП являются требования фонового выполнения операции (без блокировки интерфейса)
ээээ. Сама по себе процедура никакой "фоновости" не добавляет, по определению. Что запрос, что процедура - по барабану. Выполнение процедуры, кстати - это тоже запрос. В FireDAC, видимо (что и следует из описания), есть возможность разделить выполнение в треды для GUI и коннекта. Это специфика FireDAC, он такое умеет для всех поддерживаемых СУБД, в т.ч. и SQLite.
Поэтому текст
КалямВ случае SQLite сложность решения такой задачи много больше, т. к. требуется вынести все многочисленные запросы к БД и обработку их результатов в отдельный поток и самостоятельно реагировать на флаг отмены.
совершенно не в кассу.
Калямбезындексный перебор которых на iPhone 5c занимает, в худшем случае, 240 мс, что заметно при наборе, но ещё находится в зоне комфорта.
хрен знает. на моем Xperia V (андроид) select count по 10к записей занимал 0 времени.
КалямСамым горьким, даже ошарашивающим недостатком Interbase
кстати, у SQLite есть куда больше "ошарашивающих недостатков". InterBase это все же сервер, целиком перенесенный на мобилу. Т.е. идентичный. А SQLite... просто движок доступа к данным. Для мобил и однопользовательских приложений на десктопах хорош, а дальше - увы и ах.
Калям во-первых, FireDAC обязывает устанавливать новое соединение к БД, которое станут использовать компоненты, работающие в неосновном потоке
замучили уже. НИКТО не обеспечивает параллельные операции в одном коннекте.
КалямПереход на EUA, кроме всего прочего, даёт возможность исключить файл admin.ib из состава приложения
я не уверен, может это как-то поменяли со времен IB 7.5, или это специфика IBLite/IBToGo, но исходно включение EUA не отменяет необходимости в admin.ib.

что-то еще хотел прокомментировать, но или забыл или пока не стал.
...
Рейтинг: 0 / 0
Статья об использовании Interbase в мобильном Delphi-приложении
    #39320450
Dimitry Sibiryakov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
КалямЯ, честно говоря, теряюсь в догадках как можно было выйти на такую идею.

Прочтением статьи. Которая написана так: "я взял что-то отличное от SQLite и там были
следующие проблемы", а дальше идёт список проблем, которые вообще непонятно как
соотносятся с разрабатываемым приложением или проистекают из криво (без учёта приложения)
спроектированной БД. То есть читателя прямо наводят на мысль "а если бы использовался
SQLite, проблем могло и не быть".
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
Статья об использовании Interbase в мобильном Delphi-приложении
    #39320460
Фотография Симонов Денис
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
КалямГде можно узнать подробности про эти сборки?

как обычно почти ни где. В fbdevel об этом было. Я не уверен что стоит ссылку давать на предрелизную версию, хотя я нашёл .

КалямАвтор лично столкнулся с этой проблемой, потратил на неё много времени и был бы крайне рад вернуться в прошлое, прочесть о ней где-то заранее и сэкономить почти неделю. Кстати, решение с ORDER BY получено как раз на этом форуме.

Ну раз так пример нужно было нормальный давать а не FOR SELECT ... UPDATE чего-то там.
...
Рейтинг: 0 / 0
Статья об использовании Interbase в мобильном Delphi-приложении
    #39320466
Мимопроходящий
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
статья из серии "я потыкал в него палочкой"

зы: я видел в зоопарке живого слона.
на оленя не похоже.
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
Статья об использовании Interbase в мобильном Delphi-приложении
    #39320564
Калям
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
kdv... стыд. :-) ну хоть бы пример получше сделал, или написал select ... from (select...).В чём стыд? Разве пример не отражает один из способов использования производной таблицы? Я специально приведу запрос, в котором они органично применяются именно в таком виде (правда написано для SQL Server, но сути это не меняет):
Код: sql
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.
70.
71.
72.
73.
74.
75.
76.
77.
78.
79.
80.
81.
82.
83.
84.
85.
86.
87.
88.
89.
90.
91.
92.
93.
94.
95.
96.
97.
98.
99.
100.
101.
102.
103.
104.
105.
106.
107.
108.
109.
110.
111.
112.
113.
114.
115.
116.
117.
118.
119.
120.
121.
122.
123.
124.
125.
126.
127.
128.
129.
130.
131.
132.
133.
134.
135.
136.
137.
138.
139.
140.
141.
142.
143.
144.
145.
146.
147.
148.
149.
150.
151.
152.
153.
154.
155.
156.
157.
158.
159.
160.
161.
162.
163.
164.
165.
166.
167.
168.
169.
170.
171.
172.
173.
174.
175.
176.
177.
178.
179.
180.
181.
182.
183.
184.
185.
186.
187.
188.
189.
190.
191.
192.
193.
194.
195.
196.
197.
198.
199.
200.
201.
202.
203.
204.
205.
206.
207.
208.
209.
210.
211.
212.
213.
214.
215.
216.
217.
218.
219.
220.
221.
222.
223.
224.
225.
226.
227.
228.
229.
230.
231.
232.
233.
234.
235.
236.
237.
238.
239.
240.
241.
242.
243.
244.
245.
246.
247.
248.
249.
250.
251.
252.
253.
254.
select
  ...
  
  tu_ct.CONTRACT_ID,
  tu_ct.CONTRACT_LS_NM,
  es_ct.ES_CONTRACT_KD,

  tu_ctg.CONTRAGENT_ID,
  tu_ctg.CONTRAGENT_NM,

  analytic.TARIF_ANALYTICS_ABBR,

  case
    when
      isnull(tso.CONTRAGENT_ID, 0) = isnull(es_delivery.ES_TSO_ID, 0)
      or isnull(es_delivery.ES_TSO_ID, 0) = -1
      or
        (
        es_delivery.ES_TSO_Code = '0'
        and tso.SUBJECT_TYPE_KD = 3
        )
      then isnull(tso.CONTRAGENT_NM, '')
    else isnull(es_delivery.ES_TSO_NM, '')
  end,

  case
    when
      isnull(ivs.CONTRAGENT_ID, 0) = isnull(es_delivery.ES_IVS_ID, 0)
      or isnull(es_delivery.ES_IVS_ID, 0) = -1
      then isnull(ivs.CONTRAGENT_NM, '')
    else isnull(es_delivery.ES_IVS_NM, '')
  end,

  null,

  sum
    (
    case
      when es_delivery.ES_TSO_ID = -1 then delivery.VN_Delivery
    end
    ),

  sum
    (
    case
      when
        (
          (
          isnull(tso.CONTRAGENT_ID, 0) = isnull(es_delivery.ES_TSO_ID, 0)
          and isnull(ivs.CONTRAGENT_ID, 0) = isnull(es_delivery.ES_IVS_ID, 0)
          )
          or
          (
          isnull(tso.CONTRAGENT_ID, 0) <> isnull(es_delivery.ES_TSO_ID, 0)
          or isnull(ivs.CONTRAGENT_ID, 0) <> isnull(es_delivery.ES_IVS_ID, 0)
          )
        )
        and isnull(es_delivery.ES_TSO_ID, 0) <> -1
      then es_delivery.VN_Delivery
    end
    ),

  ...
from
  dbo.RNC_CONTRACT_TU tu
  join dbo.RNC_CONTRACT_TU_PARAMS tu_p on tu_p.CONTRACT_TU_ID = tu.CONTRACT_TU_ID

  left join dbo.NSI_ADDRESS_PART tu_address on tu_address.ADDRESS_PART_ID = tu_p.address_part_id

  join dbo.RNC_CONTRACT tu_ct on tu_ct.CONTRACT_ID = tu.CONTRACT_ID
  join dbo.RNC_CONTRAGENT tu_ctg on tu_ctg.CONTRAGENT_ID = tu_ct.CONTRAGENT_ID

  join dbo.CALC_PERIOD period on 1 = 1

  left join
    (
    select
      calc_l.CALC_PERIOD_ID,
      ce.CONTRACT_TU_ID,

      sum( isnull(ce.CALC_DELIVERY, 0) ) as Sum_Delivery,

      sum
        (
        case @VoltageLevel
          when 1 then
            case ce.FACT_VOLT_LEVEL_KD
              when 1 then isnull(ce.CALC_DELIVERY, 0)
              else 0
            end
          else
            case (ce.CALC_VOLT_LEVEL_KD)
              when 1 then isnull(ce.CALC_DELIVERY, 0)
              else 0
            end
        end
        ) as VN_Delivery,

      ...
    from
      dbo.CALC_LIST calc_l
      join dbo.CALC_ELEMENT ce on ce.CALC_LIST_ID = calc_l.CALC_LIST_ID
    group by
      calc_l.CALC_PERIOD_ID,
      ce.CONTRACT_TU_ID
    ) delivery on delivery.CALC_PERIOD_ID = period.CALC_PERIOD_ID
                  and delivery.CONTRACT_TU_ID = tu.CONTRACT_TU_ID

  left join dbo.ES_CONTRACT es_ct on es_ct.CONTRACT_ID = tu_ct.CONTRACT_ID
                                     and es_ct.ES_CONTRACT_LAST_UPD_DT =
                                       (
                                       select
                                         max(last_es_ct.ES_CONTRACT_LAST_UPD_DT)
                                       from
                                         dbo.ES_CONTRACT last_es_ct
                                       where
                                         last_es_ct.CONTRACT_ID = es_ct.CONTRACT_ID
                                       )

  join dbo.NSI_TARIF tu_tarif on tu_tarif.Tarif_ID = tu_p.Tarif_ID
  join dbo.NSI_TARIF_ANALYTICS analytic on analytic.TARIF_ANALYTICS_KD = tu_tarif.TARIF_ANALYTICS_KD

  left join dbo.RNC_DELIVERY_POINT dp on dp.DELIVERY_POINT_ID = tu.DELIVERY_POINT_ID
  left join dbo.RNC_CONTRAGENT tso on tso.CONTRAGENT_ID = dp.CONTRAGENT_DELIV_ID
  left join dbo.RNC_CONTRAGENT ivs on ivs.CONTRAGENT_ID = dp.CONTRAGENT_NETWORK_ID

  left join
    (
    select
      null as CONTRACT_TU_ID,

      -1 as ES_TSO_ID,
      null as ES_TSO_Code,
      null as ES_TSO_NM,

      -1 as ES_IVS_ID,
      null as ES_IVS_Code,
      null as ES_IVS_NM,

      null as CALC_PERIOD_ID,

      null as Sum_Delivery,
      null as VN_Delivery,
      
      ...

    union all

    select
      es_calc.CONTRACT_TU_ID,

      tso.CONTRAGENT_ID as ES_TSO_ID,
      tso.CTG_REG_CODE as ES_TSO_Code,
      tso.CONTRAGENT_NM as ES_TSO_NM,

      ivs.CONTRAGENT_ID as ES_IVS_ID,
      ivs.CTG_REG_CODE as ES_IVS_Code,
      ivs.CONTRAGENT_NM as ES_IVS_NM,

      es_calc.CALC_PERIOD_ID,

      sum(es_calc.ALL_CONSUMPTION) as Sum_Delivery,

      sum
        (
        case isnull(es_volt_level.VOLTAGE_LEVEL_KD, tu_p.CALC_VOLT_LEVEL_KD)
          when 1 then es_calc.ALL_CONSUMPTION
        end
        ) as VN_Delivery,

      ...
    from
      dbo.ES_TU_Calcs es_calc

      join dbo.RNC_CONTRACT_TU_PARAMS tu_p on tu_p.CONTRACT_TU_ID = es_calc.CONTRACT_TU_ID
      left join dbo.NSI_VOLTAGE_LEVEL es_volt_level on es_volt_level.VOLTAGE_LEVEL_KD =
        (
        select top 1
          volt_level.VOLTAGE_LEVEL_KD
        from
          dbo.NSI_VOLTAGE_LEVEL volt_level
        where
          upper(volt_level.VOLTAGE_LEVEL_NM) = upper( ltrim(rtrim(es_calc.CALC_TARIF_LEV)) )
          or upper(volt_level.VOLTAGE_LEVEL_ABBR) = upper( ltrim(rtrim(es_calc.CALC_TARIF_LEV)) )
        )

      left join dbo.RNC_CONTRAGENT tso on tso.CONTRAGENT_ID =
        (
        select top 1
          ctg.CONTRAGENT_ID
        from
          dbo.RNC_CONTRAGENT ctg
        where
          ctg.CTG_REG_CODE <> ''
          and isnull(es_calc.TSO_Code, '') <> ''

          and ctg.CTG_REG_CODE = es_calc.TSO_Code
          and ctg.SUBJECT_TYPE_KD in (3, 31)
        )
        
      ...
    group by
      es_calc.CONTRACT_TU_ID,

      tso.CONTRAGENT_ID,
      tso.CTG_REG_CODE,
      tso.CONTRAGENT_NM,

      ivs.CONTRAGENT_ID,
      ivs.CTG_REG_CODE,
      ivs.CONTRAGENT_NM,

      es_calc.CALC_PERIOD_ID

    ) es_delivery on
     (
     es_delivery.CALC_PERIOD_ID is null
     or es_delivery.CALC_PERIOD_ID = period.CALC_PERIOD_ID
     )
     and
     (
     es_delivery.CONTRACT_TU_ID is null
     or es_delivery.CONTRACT_TU_ID = tu.CONTRACT_TU_ID
     )

where
  tu.CONTRACT_TU_ID in (select TU_ID from @tu_list)
  and ( @CalcRangeBeg <= period.CALC_PERIOD_BEGIN and period.CALC_PERIOD_END <= @CalcRangeEnd )
  
  ...

group by
  tu_ct.CONTRACT_ID,
  tu_ct.CONTRACT_LS_NM,
  es_ct.ES_CONTRACT_KD,

  case
    when
      isnull(tso.CONTRAGENT_ID, 0) = isnull(es_delivery.ES_TSO_ID, 0)
      or isnull(es_delivery.ES_TSO_ID, 0) = -1
      or
        (
        es_delivery.ES_TSO_Code = '0'
        and tso.SUBJECT_TYPE_KD = 3
        )
      then isnull(tso.CONTRAGENT_NM, '')
    else isnull(es_delivery.ES_TSO_NM, '')
  end,

  ...

having
  count(delivery.CONTRACT_TU_ID) > 0
  or count(es_delivery.CONTRACT_TU_ID) > 1


kdvВот за этот пример я бы по столу кулаком треснул, как минимум :-) Нафига джойн через derived tables, если можно написать нормальный join?Я очень старался вникнуть в суть претензии, но так и не понял - что такое "нормальный join"?

kdvэто вообще из другой оперы. Смешались в кучу кони...Снова я в замешательстве - разве приведена не эквивалентная замена производной таблице? Селективная ХП возвращает записи, необходимые для соединения с T_1 - где криминал?

kdvя не уверен, может это как-то поменяли со времен IB 7.5, или это специфика IBLite/IBToGo, но исходно включение EUA не отменяет необходимости в admin.ib.Необязательность этого файла при EUA - факт, проверенный на мобильных устройствах.
...
Рейтинг: 0 / 0
Статья об использовании Interbase в мобильном Delphi-приложении
    #39320574
Фотография kdv
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
КалямРазве пример не отражает один из способов использования производной таблицы?
не отражает. в таком кастрированном примере я вижу, что разработчик не умеет писать обычный join.
Калямчто такое "нормальный join"?
стандартный join в соответствии с SQL-92. derived tables - это не джойны, не надо их в кучу мешать. Хотите пример, чего не поддерживает ИБ - напишите явно derived tables, только не с намеком на джойны.
КалямСнова я в замешательстве - разве приведена не эквивалентная замена производной таблице?
читатель спросит - а почему left join и бредовый 0=0? а потому что так происходит объединение таблицы и процедуры, в силу особенностей оптимизатора. Вы говорите А, но не говорите Б, и так по всей статье.
КалямНеобязательность этого файла при EUA - факт, проверенный на мобильных устройствах.
ну, слава богу.
...
Рейтинг: 0 / 0
14 сообщений из 14, страница 1 из 1
Форумы / Firebird, InterBase [игнор отключен] [закрыт для гостей] / Статья об использовании Interbase в мобильном Delphi-приложении
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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