powered by simpleCommunicator - 2.0.61     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / Firebird, InterBase [игнор отключен] [закрыт для гостей] / И снова об использовании оконными ф-циями индексов
7 сообщений из 32, страница 2 из 2
И снова об использовании оконными ф-циями индексов
    #38601111
Фотография Симонов Денис
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Таблоид,

и результат не тот
...
Рейтинг: 0 / 0
И снова об использовании оконными ф-циями индексов
    #38601124
Таблоид
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Симонов Денис,

"как прикажешь тебя понимать, Саид ?" (С)
ты бы в ИБЭ взял да выполнил, что ле...
Код: 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.
execute block returns (id int, f01_curr int, f01_next int, f01_prev int) as
  declare variable c cursor for (select id, f01 from t order by id);
  declare variable i int = 0;
  declare variable n int = 5;
  declare variable x int;
begin
  open c;
  while (n>0) do begin --
    if (i=0) then begin
       fetch c into id, f01_curr;
       if (row_count = 0) then leave;
       f01_prev = null;
       i=1;
    end
    fetch c into x, f01_next;
    if (row_count = 0) then leave;
    suspend;
    id=x;
    f01_prev=f01_curr;
    f01_curr=f01_next;
    n=n-1;
  end
  close c;
end


IDF01_CURRF01_NEXTF01_PREV0832916021160287878329287879640160239640560087874560071319640


Код: sql
1.
2.
3.
4.
5.
6.
select id, f01 f01_curr,
         lead(f01) over(order by id) f01_next,
         lead(f01) over(order by id desc)  f01_prev
from t 
order by id
rows 5;

IDF01_CURRF01_NEXTF01_PREV0832916021160287878329287879640160239640560087874560071319640
...
Рейтинг: 0 / 0
И снова об использовании оконными ф-циями индексов
    #38601194
Dimitry Sibiryakov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ТаблоидКакой именно ?
У тебя rows без order by. Сейчас он возвращает первые попавшиеся записи. Если использовать
индексную навигацию, это будут первые записи в индексе, т.е. совсем другие.
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
И снова об использовании оконными ф-циями индексов
    #38601200
Фотография Симонов Денис
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Таблоид,

с добавленным order by тот же самый, но это довольно простой случай

Код: sql
1.
2.
3.
4.
5.
6.
select id, f02, f01 f01_curr,
         lead(f01) over(order by id) f01_next,
         lead(f01) over(order by f02 desc)  f01_prev_by_f02
from t 
order by id
rows 5;



давай вот так
...
Рейтинг: 0 / 0
И снова об использовании оконными ф-циями индексов
    #38601248
Таблоид
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Dimitry SibiryakovТаблоидКакой именно ?У тебя rows без order by. Сейчас он возвращает первые попавшиеся записи. Если использовать индексную навигацию, это будут первые записи в индексе, т.е. совсем другие.Добавил order by в селект с оконной ф-цией. Всё стало еще трагичнее.
DDL:
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
SQL> recreate table t(id int primary key, f01 int); commit;
SQL> insert into t select * from (select row_number()over() r, rand()*10000 f from rdb$types,rdb$types,rdb$types rows 1000000) order by rand(); commit;
SQL> select min(id),max(id),count(*) from t;
-- проверяем для верности, сколько у нас строк и какоие там min/max ID:
         MIN          MAX                 COUNT
============ ============ =====================
           1      1000000               1000000

-- проверяем, что записи сидят в случайном порядке:
SQL> select * from t rows 5;

          ID          F01
============ ============
      165323          362
      726392         6955
      747089         3162
       41798         7210
      306615         3829

Поехали.

var-1.
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
SQL> set explain on; set plan on;
SQL> select id, f01,lead(f01)over(order by id) from t  order by id  rows 5;

Select Expression
    -> First N Records
        -> Sort (record length: 52, key length: 8)
            -> Window
                -> Record Buffer (record length: 49)
                    -> Sort (record length: 52, key length: 8)
                        -> Window
                            -> Record Buffer (record length: 25)
                                -> Table "T" Full Scan

          ID          F01         LEAD
============ ============ ============
           1         7313          750
           2          750          973
           3          973         5832
           4         5832         5656
           5         5656         7188
Trace: 4597 ms
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
2014-03-31T18:20:55.0580 (6403:0x7f309ced8b48) EXECUTE_STATEMENT_FINISH
        sqlex30 (ATT_389, SYSDBA:NONE, NONE, TCPv4:127.0.0.1)
        /opt/fb30trnk/bin/isql:13542
                (TRA_12706, CONCURRENCY | WAIT | READ_WRITE)

Statement 980:
-------------------------------------------------------------------------
select id, f01,lead(f01)over(order by id) from t order by id rows 5
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
PLAN SORT (SORT (T NATURAL))
5 records fetched
   4597 ms, 13257 read(s), 2026698 fetch(es)

Table                             Natural     Index    Update    Insert  
*************************************************************************
T                                 1000000


var-2.
Код: plaintext
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.
SQL> set term ^;
SQL> execute block returns (id_curr int, f01_curr int, id_next int, f01_next int) as
CON>   declare variable c cursor for (select id, f01 from t order by id);
CON>   declare variable n int = 5;
CON>   declare variable i int = 0;
CON> begin
CON>   open c;
CON>   while (n>0) do begin
CON>     if (i=0) then begin
CON>       fetch c into id_curr, f01_curr;
CON>        if (row_count = 0) then leave;
CON>     end
CON>     fetch c into id_next, f01_next;
CON>     if (row_count = 0) then leave;
CON>     suspend;
CON>     id_curr=id_next; f01_curr=f01_next;
CON>     n=n-1;
CON>     i=i+1;
CON>   end
CON>   close c;
CON> end^

Select Expression
    -> Table "T" Access By ID
        -> Index "RDB$PRIMARY307" Full Scan

     ID_CURR     F01_CURR      ID_NEXT     F01_NEXT
============ ============ ============ ============
           1         7313            2          750
           2          750            3          973
           3          973            4         5832
           4         5832            5         5656
           5         5656            6         7188
Trace: 0 ms
Код: plaintext
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.
2014-03-31T18:21:32.0180 (6403:0x7f309ced8b48) EXECUTE_STATEMENT_FINISH
        sqlex30 (ATT_389, SYSDBA:NONE, NONE, TCPv4:127.0.0.1)
        /opt/fb30trnk/bin/isql:13542
                (TRA_12706, CONCURRENCY | WAIT | READ_WRITE)

Statement 982:
-------------------------------------------------------------------------------
execute block returns (id_curr int, f01_curr int, id_next int, f01_next int) as
  declare variable c cursor for (select id, f01 from t order by id);
  declare variable n int = 5;
  declare variable i int = 0;
begin
  open c;
  while (n>0) do begin
    if (i=0) then begin
      fetch c into id_curr, f01_curr;
       if (row_count = 0) then leave;
    end
    fetch c into id_next, f01_next;
    if (row_count = 0) then leave;
    suspend;
    id_curr=id_next; f01_curr=f01_next;
    n=n-1;
    i=i+1;
  end
  close c;
end
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
PLAN (T ORDER RDB$PRIMARY307)
5 records fetched
      0 ms, 1 read(s), 21 fetch(es)

Table                             Natural     Index    Update    Insert    Delete  
***********************************************************************************
T                                                 6
...
Рейтинг: 0 / 0
И снова об использовании оконными ф-циями индексов
    #38601249
Таблоид
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Симонов Денисдавай вот такПриведи DDL и скрипт заполнения, а то у тебя тут поле F02 появилось. Ну, и свои результаты тоже покажи, что ле...
...
Рейтинг: 0 / 0
И снова об использовании оконными ф-циями индексов
    #38601517
Фотография Симонов Денис
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Таблоид,

F02 того же типа что и F01, только заполнено случайными числами. Честно говоря не пробовал, но идея в том что когда оконная функция кэширует весь резалтсет, а потом его многократно сортирует по разным полям и в разном направлении производительность должна быть лучше чем на PSQL коде хотя бы из того что там невозможно сделать это в одном курсоре. Попозже может и проверю свою догадку
...
Рейтинг: 0 / 0
7 сообщений из 32, страница 2 из 2
Форумы / Firebird, InterBase [игнор отключен] [закрыт для гостей] / И снова об использовании оконными ф-циями индексов
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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