powered by simpleCommunicator - 2.0.61     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / Firebird, InterBase [игнор отключен] [закрыт для гостей] / JOIN двух источников: если в одном есть оконная функция, то он становится ведущим. Why ?
4 сообщений из 4, страница 1 из 1
JOIN двух источников: если в одном есть оконная функция, то он становится ведущим. Why ?
    #38585342
Таблоид
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
hi all

Дано: таблица tmp(id int, x int), без индексов, 10 тыс строк.
И вот такой запросик и план его:
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
SQL> recreate table tmp(id int, x int); commit;
SQL> insert into tmp select row_number()over(),rand()*100 from rdb$types,rdb$types rows 10000; commit;
SQL> set list on;
SQL> select count(*) from tmp;

COUNT                            10000 

SQL> set planonly;
SQL> set explain on;
SQL> select d.id, b.rx
CON> from ( select id, row_number()over() rn from tmp ) d
CON> join ( select cast(round((0.5+rand()* 10000  ),0) as int) rx from rdb$database ) b
CON> on d.rn = b.rx
CON> ;

Select Expression
    -> Filter
        ->  Nested Loop Join (inner)
            ->  Window 
                -> Record Buffer (record length: 25)
                    -> Table "D TMP" Full Scan
            -> Table "B RDB$DATABASE" Full Scan

Объясните, плз, с какого будуна:
1) ведущей таблицей считается результат select id, row_number()over() rn from tmp, в котором 10 тыс строк;
2) применён nested loops вместо hash join'a.

PS-1. Судя по всему, любое упоминание over()-функций в одном из источников делает его ведущим. Даже если результат over()-функции вообще не используется на выходе, а не то что в условии соединения:

Код: plaintext
1.
2.
3.
4.
SQL> select d.id, b.rx
CON> from ( select id,s um(id)over() s  from tmp ) d
CON> join ( select cast(round((0.5+rand()*10000 ),0) as int) rx from rdb$database ) b
CON> on d.id = b.rx;
Код: plaintext
1.
2.
3.
4.
5.
6.
Select Expression
    -> Filter
        ->  Nested Loop Join (inner)
            ->  Window 
                -> Record Buffer (record length: 25)
                    -> Table "D TMP" Full Scan
            -> Table "B RDB$DATABASE" Full Scan


И для сравнения - запрос без оконной функции:

Код: plaintext
1.
2.
3.
SQL> select d.id, b.rx
CON> from ( select id from tmp ) d
CON> join ( select cast(round((0.5+rand()*10000 ),0) as int) rx from rdb$database ) b
CON> on d.id = b.rx;

План уже получше:
Код: plaintext
1.
2.
3.
4.
5.
Select Expression
    -> Filter
        ->  Nested Loop Join (inner)
            ->  Table "B RDB$DATABASE" Full Scan 
            -> Table "D TMP" Full Scan
...
Рейтинг: 0 / 0
JOIN двух источников: если в одном есть оконная функция, то он становится ведущим. Why ?
    #38585345
Таблоид
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
PPS. LI-T3.0.0.30967
...
Рейтинг: 0 / 0
JOIN двух источников: если в одном есть оконная функция, то он становится ведущим. Why ?
    #38585492
Фотография Симонов Денис
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Таблоид,

потому что сейчас не вычисляется кардинальность результирующей выборки для агрегатов и оконных функций. ДЕ обещал это сделать. Так что жди
...
Рейтинг: 0 / 0
JOIN двух источников: если в одном есть оконная функция, то он становится ведущим. Why ?
    #38585505
Таблоид
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Симонов Дениспотому что сейчас не вычисляется кардинальность результирующей выборки для агрегатов и оконных функций . ДЕ обещал это сделать. Так что жди (пришлось фигачить всё на PSQL)
...
Рейтинг: 0 / 0
4 сообщений из 4, страница 1 из 1
Форумы / Firebird, InterBase [игнор отключен] [закрыт для гостей] / JOIN двух источников: если в одном есть оконная функция, то он становится ведущим. Why ?
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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