powered by simpleCommunicator - 2.0.61     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / Firebird, InterBase [игнор отключен] [закрыт для гостей] / Оптимизация запроса
25 сообщений из 42, страница 1 из 2
Оптимизация запроса
    #38423395
Fly`
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Уважаемые, подскажите чайнику как оптимизировать запрос.
БД Firebird 2.1

есть запрос:
Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
select
  GS."SHIFT",
  GS.DT,
  (SELECT shift_enter FROM GET_SHIFT_PERSON(:PERSON_ID, GS."SHIFT", GS.DT)),
  (SELECT shift_exit FROM GET_SHIFT_PERSON(:PERSON_ID, GS."SHIFT", GS.DT)),
  (SELECT shift_delay FROM GET_SHIFT_PERSON(:PERSON_ID, GS."SHIFT", GS.DT)),
  (SELECT shift_work FROM GET_SHIFT_PERSON(:PERSON_ID, GS."SHIFT", GS.DT)),
  (SELECT warning FROM GET_SHIFT_PERSON(:PERSON_ID, GS."SHIFT", GS.DT))
FROM GET_SHIFTS_IN_MONTH(:DATE) GS
where (SELECT shift_enter FROM GET_SHIFT_PERSON(:PERSON_ID, GS."SHIFT", GS.DT)) is not null


В запросе обращение к двум процедурам. Одна процедура выдает перечень смен (Дату, Смена) в месяце.
Во второй процедуре идут циклические подсчеты опозданий, выходов и уходов.
К GET_SHIFT_PERSON обращаемся много раз с одним и тем же параметром...
Как мне оптимизировать, чтоб обращений было одно?

Спасибо.
...
Рейтинг: 0 / 0
Оптимизация запроса
    #38423414
Фотография Симонов Денис
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Fly`,

Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
WITH S AS (
select
  GS."SHIFT",
  GS.DT,
  GSP.shift_enter As shift_enter,
  GSP.hift_exit,
  GSP.shift_delay,
  GSP.shift_work,
  GSP.warning 
FROM GET_SHIFTS_IN_MONTH(:DATE) GS
LEFT JOIN GET_SHIFT_PERSON(:PERSON_ID, GS."SHIFT", GS.DT) GSP ON 1=1)
SELECT *
FROM S
WHERE shift_enter is not null
...
Рейтинг: 0 / 0
Оптимизация запроса
    #38423416
Фотография kdv
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Fly`,

а зачем вообще нагородили этот кошмар из процедур? я ни одной таблицы в запросе не вижу.
...
Рейтинг: 0 / 0
Оптимизация запроса
    #38423420
Фотография Симонов Денис
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Fly`,

только одного обращения добиться всё равно не удастся, если конечно GET_SHIFTS_IN_MONTH не даёт одну запись
...
Рейтинг: 0 / 0
Оптимизация запроса
    #38423505
afgm
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Симонов Денис, а давно стало безопасно писать такие джойны?
...
Рейтинг: 0 / 0
Оптимизация запроса
    #38423510
Dimitry Sibiryakov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
afgmа давно стало безопасно писать такие джойны?
А когда их было опасно писать?

http://ibase.ru/devinfo/dataaccesspaths.htm
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
Оптимизация запроса
    #38423543
Drag
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Dimitry Sibiryakov,

Что НЕ надо делать в InterBase и Firebird
14. Не рекомендуется использовать связку "таблица+ХП"
, т.е. явный или неявный join таблицы с хранимой процедурой. В некоторых ситуациях наблюдалось неправильное выполнение запроса (Например, от пеpемены мест слагаемых, "сумма" иногда меняется.). Также ситуации сильно зависят от версий IB (4.x, 5.x, 6.x) - в одной из версий это может привести к падению сервера, в другой не выполнится, а в третьей - пройдет.
...
Рейтинг: 0 / 0
Оптимизация запроса
    #38423549
Dimitry Sibiryakov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
DragНе рекомендуется использовать связку "таблица+ХП"
А если мозг включить?.. Вопрос звучал "писать такие джойны". Между "такими
джоинами" и "джоинами вообще" - дистанция огромного размера. Описанная в статье по ссылке,
которую я привёл.
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
Оптимизация запроса
    #38423564
Drag
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Dimitry Sibiryakov,

"грубиян и не воспитанный тип"
(с) Капитан Зелёный

А чем отличается данный join от приведенного по моей ссылке? (статью перечитал)
...
Рейтинг: 0 / 0
Оптимизация запроса
    #38423566
Фотография kdv
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Drag,

я сейчас тот документ вообще удалю. Уже говорил, что мне не очень интересно поправлять подобные древние "сборники рецептов" под современные реалии.
Когда-то - да, глючило. Теперь вроде бы не глючит, можно, но определенным образом. В итоге получится сборник рецептов + туча поправок к нему. Мне это не надо.
А вам советую обращать внимание на информацию в заголовках статей - когда статья была создана, и когда она последний раз была обновлена.
...
Рейтинг: 0 / 0
Оптимизация запроса
    #38423567
Dimitry Sibiryakov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Dragчем отличается данный join от приведенного по моей ссылке?
По твоей ссылке вообще нет никаких джоинов. А статью перечитал видимо плохо. Ограниченным
набором планов он отличается.
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
Оптимизация запроса
    #38423574
Фотография Симонов Денис
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Drag,

я не знаю про что данный пункт. Ни разу не видел случаев падения при такой связке. И уж никогда не боялся делать такие JOIN если это оправдано. Единственное прошу обратить внимание, что именно LEFT JOIN. Обычный JOIN до тройки работать не будет если в процедуру передаётся параметр из соединяемого потока.
...
Рейтинг: 0 / 0
Оптимизация запроса
    #38423577
Drag
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
kdv,

Спасибо.

Но в любом случае, соглашусь с Дмитрием, что такое обращение к данным - "кошмар".
Кстати, а "(SELECT shift_enter FROM GET_SHIFT_PERSON(:PERSON_ID, GS."SHIFT", GS.DT)) is not null"
мультипл роу ин синглтон селект не ругнет? или GET_SHIFT_PERSON всегда дает одну запись?
...
Рейтинг: 0 / 0
Оптимизация запроса
    #38423584
Drag
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Симонов Денис,

на ошибки не натыкался. Просто запоминаю полезные советы при работе с FB.
А про JOIN тоже ловил такую штуку... вкурсе... значит в 3-ке уже можно?
...
Рейтинг: 0 / 0
Оптимизация запроса
    #38423605
Фотография Симонов Денис
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Drag,

пока не до конца

Код: sql
1.
2.
3.
select *
from t join proc1(t.id) p1 on 1=1
rows 1



FB 2.5

Код: plaintext
1.
The cursor identified in the UPDATE or DELETE statement is not positioned on a row.
no current record for fetch operation.

FB 3.0 Alpha

Код: plaintext
1.
ID	B
1	11

Однако

Код: sql
1.
2.
3.
select *
from proc1(t.id) p1 join t on 1=1
rows 1



В обоих версиях

Код: plaintext
1.
2.
3.
4.
5.
Column does not belong to referenced table.
Dynamic SQL Error.
SQL error code = -206.
Column unknown.
T.ID.
At line 3, column 1.
...
Рейтинг: 0 / 0
Оптимизация запроса
    #38423613
afgm
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Dimitry SibiryakovА когда их было опасно писать?
Это почти единственный случай, когда корелированная процедура будет работать "как ожидается".
В случае отсутствия связи процедура будет выполняться многократнно. В влучаях отличных от такого вообще ничего сказать нельзя.
В общем для нормального скрещивания процедурно-реляционного подхода не хватает ручного указания детерминированности (и для будущих функций тоже), кеширования результата выполнения, вьюшек с параметрами (транзитные табличные функции или как ещё их называют) и, возможно, явного аналога cross apply/other apply.
...
Рейтинг: 0 / 0
Оптимизация запроса
    #38423635
Фотография Симонов Денис
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
afgm,

хватит чушь писать. То что процедура может выполняться многократно, а может не выполняться опасности не представляет. Просто надо это понимать и не писать такое когда это не оправдано.
...
Рейтинг: 0 / 0
Оптимизация запроса
    #38423646
afgm
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Симонов Денисхватит чушь писать. То что процедура может выполняться многократно, а может не выполняться опасности не представляет. Просто надо это понимать и не писать такое когда это не оправдано.
Чушь = неправда? Или как?
Я за запрет таких вещей со стороны сервера для устранения неоднозначности.
...
Рейтинг: 0 / 0
Оптимизация запроса
    #38423657
Фотография Симонов Денис
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
afgm,

запрет таких вещей теперь делать нельзя. У многих на такое поведение логика завязана. И вообще это select из процедуру с параметром это одна из самых востребованных фич, которые другие сервера не умеют.
...
Рейтинг: 0 / 0
Оптимизация запроса
    #38423667
afgm
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Симонов ДенисИ вообще это select из процедуру с параметром это одна из самых востребованных фич, которые другие сервера не умеют.
Сам считаю это одной из основных фич FB, но речь шла о джойнах с процедурами в спорных ситуациях.
...
Рейтинг: 0 / 0
Оптимизация запроса
    #38423670
Фотография Симонов Денис
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
afgm,

покажи пример спорной ситуации.
...
Рейтинг: 0 / 0
Оптимизация запроса
    #38423674
Dimitry Sibiryakov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
afgmречь шла о джойнах с процедурами в спорных ситуациях.
Нет никаких спорных ситуаций.
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
Оптимизация запроса
    #38423701
afgm
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Симонов Денисafgm, покажи пример спорной ситуации.
Код: 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.
create or alter procedure PROC_TEST (
    ROWS_COUNT integer = null)
returns (
    ID integer,
    UUID char(36))
AS
BEGIN
  UUID = uuid_to_char(gen_uuid());
  ROWS_COUNT = coalesce(ROWS_COUNT, MOD(rand()*100, 4) );
  FOR
      with A(ID) as (
          select 1 from rdb$database
          union all
          select 2 from rdb$database
          union all
          select 3 from rdb$database
      )
    select first(:ROWS_COUNT) ID from A
    INTO :ID
  DO
  BEGIN
    SUSPEND;
  END
END

-----
 select * from proc_test(3) p1
  left join proc_test p2 on 1=1
...
Рейтинг: 0 / 0
Оптимизация запроса
    #38423709
Фотография Симонов Денис
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
afgm,

ага давай тогда запретим ещё и вот это

Код: sql
1.
2.
3.
select table1.id
from table1 
join table2 on rand()*table1.id = rand()*table2.id
...
Рейтинг: 0 / 0
Оптимизация запроса
    #38423715
afgm
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Симонов Денисага давай тогда запретим ещё и вот это
Не надо путать. Это разные вещи. RAND для примера недетерминированности и многократности вызова.
...
Рейтинг: 0 / 0
25 сообщений из 42, страница 1 из 2
Форумы / Firebird, InterBase [игнор отключен] [закрыт для гостей] / Оптимизация запроса
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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