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

2 dimitr: сабж... ибо ужос.
зы. И не такая уж редкость, задача эта: "найти тех, кому нет пары", т.е. full join + where coalesce(x,y) is null
...
Рейтинг: 0 / 0
FB-3.x: full join - будет ли переделываться алгоритм ?
    #38489081
dimitr
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
где примеры ужоса?
...
Рейтинг: 0 / 0
FB-3.x: full join - будет ли переделываться алгоритм ?
    #38489141
Таблоид
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
dimitr,

Код: 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.
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.
SQL> show table t1;
X                               INTEGER Nullable
SQL> show table t2;
X                               INTEGER Nullable

SQL> delete from t1; insert into t1 select row_number()over()*3 from rdb$types,rdb$types rows 1000; commit;
SQL> delete from t2; insert into t2 select row_number()over()*4 from rdb$types,rdb$types rows 1000; commit;
SQL> select count(*) from t1 full join t2 on t1.x=t2.x where t1.x is null or t2.x is null;               
                COUNT
=====================
                 1500

SQL> set stat on; set explain on;
SQL> select count(*) from t1 full join t2 on t1.x=t2.x where t1.x is null or t2.x is null;

Select Expression
    -> Aggregate
        -> Filter
            -> Full Outer Join
                ->  Nested Loop Join (outer)
                    -> Table "T2" Full Scan
                    -> Filter
                        -> Table "T1" Full Scan
                ->  Nested Loop Join (anti)
                    -> Table "T1" Full Scan
                    -> Filter
                        -> Table "T2" Full Scan

                COUNT
=====================
                 1500

Current memory = 2453051016
Delta memory = 0
Max memory = 2468754464
 Elapsed time= 4.40 sec 
Cpu = 0.00 sec
Buffers = 524288
Reads = 0
Writes = 0
 Fetches = 3753454 


SQL> select count(*) from (select x from (select x from t1 union all select x from t2) group by x having count(*)=1);

Select Expression
    -> Aggregate
        -> Filter
            -> Aggregate
                -> Sort
                    -> Union
                        -> Table "T1" Full Scan
                        -> Table "T2" Full Scan

                COUNT
=====================
                 1500

Current memory = 2453072064
Delta memory = 21048
Max memory = 2468754464
 Elapsed time= 0.01 sec 
Cpu = 0.00 sec
Buffers = 524288
Reads = 0
Writes = 0
 Fetches = 4062 

ЗЫ. Также - посмотри, плз, письмо в личке от сегодня, 13:55. Я тот запрос не имею права публиковать. Но помирает он именно от этого full join'а.
...
Рейтинг: 0 / 0
FB-3.x: full join - будет ли переделываться алгоритм ?
    #38489448
dimitr
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ок, разберусь
...
Рейтинг: 0 / 0
FB-3.x: full join - будет ли переделываться алгоритм ?
    #38492376
Фотография Симонов Денис
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Таблоид,

когда сделают hash outer join будет намного лучше
...
Рейтинг: 0 / 0
FB-3.x: full join - будет ли переделываться алгоритм ?
    #38492386
Dimitry Sibiryakov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Симонов Денискогда сделают hash outer join будет намного лучше

Оно может работать для FULL? Я как-то полагал, что там максимум MERGE (который сейчас
тоже, впрочем, недоступен).
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
FB-3.x: full join - будет ли переделываться алгоритм ?
    #38492399
Фотография Симонов Денис
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Dimitry Sibiryakov,

оно же может работать для LEFT и RIGHT, почему бы не работать и для FULL.

Select Expression
-> Aggregate
-> Filter
-> Full Outer Join
-> Nested Loop Join (outer)
-> Table "T2" Full Scan
-> Filter
-> Table "T1" Full Scan
-> Nested Loop Join (anti)
-> Table "T1" Full Scan
-> Filter
-> Table "T2" Full Scan

Раз уж здесь оно раскладывается на два Nested Loop Join. то может раскладываться и на два Hash Join.

Проверял в PostgeSQL там как раз в плане показано HASH OUTER JOIN
...
Рейтинг: 0 / 0
FB-3.x: full join - будет ли переделываться алгоритм ?
    #38492400
Фотография Симонов Денис
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
План из Postgresql

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
"Aggregate"
"  CTE r"
"    ->  Result"
"          ->  Append"
"                ->  Result"
"                ->  Result"
"  ->  Hash Full Join"
"        Hash Cond: (r1.n = r2.n)"
"        ->  CTE Scan on r r1"
"        ->  Hash"
"              ->  CTE Scan on r r2"
...
Рейтинг: 0 / 0
FB-3.x: full join - будет ли переделываться алгоритм ?
    #38492407
Таблоид
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Dimitry SibiryakovОно может работать для FULL?Может. Большой Брат так делает, начиная с 11г, применяя какой-то загадочный "native execution method": http://docs.oracle.com/cd/E16655_01/server.121/e15858/tgsql_join.htm#TGSQL94997 Starting with Oracle Database 11g, Oracle Database automatically uses a native execution method based on a hash join for executing full outer joins whenever possible. When the database uses the new method to execute a full outer join, the execution plan for the query contains HASH JOIN FULL OUTER
Как там устроен этот метод - хз, но таблицы он прокатывает через себя только по 1 разу:

Код: 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.
35.
36.
37.
38.
39.
40.
41.
42.
43.
44.
45.
46.
47.
48.
set feed off
create table t1 as select level*3 x from dual connect by level<=1000;
create table t2 as select level*4 x from dual connect by level<=1000;
set autot on
select count(*) from t1 full join t2 on t1.x=t2.x where t1.x is null or t2.x is null;

  COUNT(*)
----------
      1500

План выполнения
----------------------------------------------------------
Plan hash value: 612863728

-----------------------------------------------------------------------------------
| Id  | Operation              | Name     | Rows  | Bytes | Cost (%CPU)| Time     |
-----------------------------------------------------------------------------------
|   0 | SELECT STATEMENT       |          |     1 |    26 |     5  (20)| 00:00:01 |
|   1 |  SORT AGGREGATE        |          |     1 |    26 |            |          |
|*  2 |   VIEW                 | VW_FOJ_0 |  1000 | 26000 |     5  (20)| 00:00:01 |
|*  3 |     HASH JOIN FULL OUTER |          |  1000 | 26000 |     5  (20)| 00:00:01 |
|   4 |     TABLE ACCESS FULL  | T1       |  1000 | 13000 |     2   (0)| 00:00:01 |
|   5 |     TABLE ACCESS FULL  | T2       |  1000 | 13000 |     2   (0)| 00:00:01 |
-----------------------------------------------------------------------------------

Predicate Information (identified by operation id):
---------------------------------------------------

   2 - filter("T1"."X" IS NULL OR "T2"."X" IS NULL)
   3 - access("T1"."X"="T2"."X")

Note
-----
   - dynamic sampling used for this statement (level=2)


Статистика
----------------------------------------------------------
          0  recursive calls
          0  db block gets
          8  consistent gets
          0  physical reads
          0  redo size
        339  bytes sent via SQL*Net to client
        333  bytes received via SQL*Net from client
          2  SQL*Net roundtrips to/from client
          0  sorts (memory)
          0  sorts (disk)
          1  rows processed
...
Рейтинг: 0 / 0
FB-3.x: full join - будет ли переделываться алгоритм ?
    #38492408
Таблоид
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Симонов ДенисПлан из Postgresql

Код: plaintext
1.
2.
3.
4.
"Aggregate"
"  CTE r"
"    ->  Result"
"          ->   Append "
<...>
а чё это за аппенд у него там вверьху ?
...
Рейтинг: 0 / 0
FB-3.x: full join - будет ли переделываться алгоритм ?
    #38492410
Фотография Симонов Денис
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Таблоид,

Запрос там был такой

Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
with r(n) as (
  select 1
  union all
  select 2
)
select count(*)
from r r1
full join r r2 on r1.n = r2.n



очевидно append'ом он обозначил select 1 union all select 2
...
Рейтинг: 0 / 0
11 сообщений из 11, страница 1 из 1
Форумы / Firebird, InterBase [игнор отключен] [закрыт для гостей] / FB-3.x: full join - будет ли переделываться алгоритм ?
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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