Гость
Целевая тема:
Создать новую тему:
Автор:
Форумы / Firebird, InterBase [игнор отключен] [закрыт для гостей] / Оптимизация запроса / 25 сообщений из 42, страница 1 из 2
10.10.2013, 17:51:02
    #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
10.10.2013, 18:00:43
    #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
10.10.2013, 18:01:46
    #38423416
kdv
kdv
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Оптимизация запроса
Fly`,

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

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

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

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

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

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

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

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

Спасибо.

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

на ошибки не натыкался. Просто запоминаю полезные советы при работе с FB.
А про JOIN тоже ловил такую штуку... вкурсе... значит в 3-ке уже можно?
...
Рейтинг: 0 / 0
10.10.2013, 20:56:29
    #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
10.10.2013, 21:09:26
    #38423613
afgm
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Оптимизация запроса
Dimitry SibiryakovА когда их было опасно писать?
Это почти единственный случай, когда корелированная процедура будет работать "как ожидается".
В случае отсутствия связи процедура будет выполняться многократнно. В влучаях отличных от такого вообще ничего сказать нельзя.
В общем для нормального скрещивания процедурно-реляционного подхода не хватает ручного указания детерминированности (и для будущих функций тоже), кеширования результата выполнения, вьюшек с параметрами (транзитные табличные функции или как ещё их называют) и, возможно, явного аналога cross apply/other apply.
...
Рейтинг: 0 / 0
10.10.2013, 21:26:51
    #38423635
Симонов Денис
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Оптимизация запроса
afgm,

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

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

покажи пример спорной ситуации.
...
Рейтинг: 0 / 0
10.10.2013, 22:09:48
    #38423674
Dimitry Sibiryakov
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Оптимизация запроса
afgmречь шла о джойнах с процедурами в спорных ситуациях.
Нет никаких спорных ситуаций.
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
10.10.2013, 22:44:22
    #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
10.10.2013, 22:50:10
    #38423709
Симонов Денис
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Оптимизация запроса
afgm,

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

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


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