Гость
Целевая тема:
Создать новую тему:
Автор:
Форумы / Firebird, InterBase [игнор отключен] [закрыт для гостей] / FB-3.x: full join - будет ли переделываться алгоритм ? / 11 сообщений из 11, страница 1 из 1
04.12.2013, 15:32:30
    #38489044
Таблоид
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
FB-3.x: full join - будет ли переделываться алгоритм ?
hi all

2 dimitr: сабж... ибо ужос.
зы. И не такая уж редкость, задача эта: "найти тех, кому нет пары", т.е. full join + where coalesce(x,y) is null
...
Рейтинг: 0 / 0
04.12.2013, 15:49:33
    #38489081
dimitr
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
FB-3.x: full join - будет ли переделываться алгоритм ?
где примеры ужоса?
...
Рейтинг: 0 / 0
04.12.2013, 16:21:11
    #38489141
Таблоид
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
FB-3.x: full join - будет ли переделываться алгоритм ?
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
04.12.2013, 19:05:42
    #38489448
dimitr
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
FB-3.x: full join - будет ли переделываться алгоритм ?
ок, разберусь
...
Рейтинг: 0 / 0
06.12.2013, 20:35:16
    #38492376
Симонов Денис
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
FB-3.x: full join - будет ли переделываться алгоритм ?
Таблоид,

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

Оно может работать для FULL? Я как-то полагал, что там максимум MERGE (который сейчас
тоже, впрочем, недоступен).
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
06.12.2013, 21:07:32
    #38492399
Симонов Денис
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
FB-3.x: full join - будет ли переделываться алгоритм ?
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
06.12.2013, 21:08:13
    #38492400
Симонов Денис
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
FB-3.x: full join - будет ли переделываться алгоритм ?
План из 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
06.12.2013, 21:10:45
    #38492407
Таблоид
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
FB-3.x: full join - будет ли переделываться алгоритм ?
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
06.12.2013, 21:12:04
    #38492408
Таблоид
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
FB-3.x: full join - будет ли переделываться алгоритм ?
Симонов ДенисПлан из Postgresql

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

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

Код: 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
Форумы / Firebird, InterBase [игнор отключен] [закрыт для гостей] / FB-3.x: full join - будет ли переделываться алгоритм ? / 11 сообщений из 11, страница 1 из 1
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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