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

Запрос-1.
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
SQL> set explain on; out /dev/null;
SQL> select count(*) from (select f.*, (select 1 from rdb$database x)  fx from rdb$database f);

Select Expression
    -> Singularity Check
        -> Table "X" Full Scan
Select Expression
    -> Aggregate
         -> Union 
            -> Table "F" Full Scan

                COUNT
=====================
                    1

Запрос-2.
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
SQL> select * from (select f.*, (select 1 from rdb$database x)  fx from rdb$database f);

Select Expression
    -> Singularity Check
        -> Table "X" Full Scan
Select Expression
     -> Union 
        -> Table "F" Full Scan

Если я правильно понимаю, 'Union' в extended-плане обозначает вовсе не объединение двух и более выборок, а просто наличие скалярного подзапроса.
Тогда почему бы просто не написать: 'compute scalar' ?

PS. LI-T3.0.0.30747
...
Рейтинг: 0 / 0
FB-3: 'Union' в extended-плане при наличии скалярного подзапроса. Зачем это слово ?
    #38482361
Фотография Симонов Денис
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Таблоид,

скалярный подзапрос здесь это -> Singularity Check
А вот Union фиг его знает, но если это то про что ты говоришь, то слово явно не удачное.
...
Рейтинг: 0 / 0
FB-3: 'Union' в extended-плане при наличии скалярного подзапроса. Зачем это слово ?
    #38482376
Таблоид
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Симонов ДенисА вот Union фиг его знает, но если это то про что ты говоришь, то слово явно не удачное.вот и я не понимаю.
Если этот скалярный подзапрос вытащить наружу, то 'Union' пропадает:
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
SQL> select f.* ,(select 1 from rdb$database) fx  from (select f.* from rdb$database f)f;

Select Expression
    -> Singularity Check
        -> Table "RDB$DATABASE" Full Scan
Select Expression
    -> Table "F F" Full Scan
Кажеццо, это слово появляется только при скалярном подзапросе внутри DT.
...
Рейтинг: 0 / 0
FB-3: 'Union' в extended-плане при наличии скалярного подзапроса. Зачем это слово ?
    #38482383
dimitr
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
план честно показывает что есть. Юнион из одного потока - это внутренний хак (читай: оптимизация) для материализации подзапросов в select-листе внутри derived table, чтобы не перевыполнять эти запросы при каждом обращении к соответствующим derived field.
...
Рейтинг: 0 / 0
FB-3: 'Union' в extended-плане при наличии скалярного подзапроса. Зачем это слово ?
    #38482403
Таблоид
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
dimitrплан честно показывает что есть. Юнион из одного потока - это внутренний хак (читай: оптимизация) для материализации подзапросов в select-листе внутри derived table, чтобы не перевыполнять эти запросы при каждом обращении к соответствующим derived field.Я правильно понимаю, что вот в этом примере:
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
SQL> recreate table t(x int, y int); commit;
SQL> insert into t values(1,2);
SQL> insert into t values(2,1);
SQL> commit;
SQL> out;
SQL> select x,y2,y2*2 z from (select c.x,(select d.y from t d where d.y>c.x rows 1) y2 from t c);        
Select Expression
    -> Singularity Check
        -> First N Records
            -> Filter
                -> Table "D" Full Scan
Select Expression
    -> Union
        -> Table "C" Full Scan

           X           Y2                     Z
============ ============ =====================
           1            2                     4
           2       <null>                <null>
- 'Union' означает: "вычисли `y2` один раз на каждую строку, результат R сохрани в памяти, и сколько бы раз "снаружи" не было упомянуто имя `y2`, используй именно этот результат R".
?
...
Рейтинг: 0 / 0
FB-3: 'Union' в extended-плане при наличии скалярного подзапроса. Зачем это слово ?
    #38482406
Таблоид
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
PS. И если на предыдущий мой вопрос ответ "да", то нельзя ли распространить эту же "идеологию" (закрепления результатов, полученных в DT) на те случаи, когда обращений к таблицам нету, а есть просто вызов "чего-то там недетерминированного":
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
SQL> select x,y2 rnd, y2*2 dup_rnd from (select c.x,cast(rand()*10 as int) y2 from t c);

Select Expression
    -> Table "C" Full Scan

           X          RND               DUP_RND
============ ============ =====================
           1            3                    20
           2            4                    14

SQL> select x,y2 rnd, y2*2 dup_rnd from (select c.x,cast(rand()*10 as int) y2 from t c);

Select Expression
    -> Table "C" Full Scan

           X          RND               DUP_RND
============ ============ =====================
           1            8                     2
           2            3                     4
...
Рейтинг: 0 / 0
FB-3: 'Union' в extended-плане при наличии скалярного подзапроса. Зачем это слово ?
    #38482410
dimitr
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Таблоидвычисли `y2` один раз на каждую строку, результат R сохрани в памяти, и сколько бы раз "снаружи" не было упомянуто имя `y2`, используй именно этот результат R".?
верно

Таблоиднельзя ли распространить эту же "идеологию" (закрепления результатов, полученных в DT) на те случаи, когда обращений к таблицам нету, а есть просто вызов "чего-то там недетерминированного"
теоретически можно. Но для этого надо уметь находить недетерминированность в произвольно сложном выражении.
...
Рейтинг: 0 / 0
FB-3: 'Union' в extended-плане при наличии скалярного подзапроса. Зачем это слово ?
    #38482422
Фотография Симонов Денис
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
dimitrтеоретически можно. Но для этого надо уметь находить недетерминированность в произвольно сложном выражении.
если есть хоть одна недетерминированная функция в выражении, то и всё выражение недетерминированное. Тут правда придётся всем встроенным функциям указать являются ли они детерминированными. Интересно сейчас эта информация есть?
...
Рейтинг: 0 / 0
FB-3: 'Union' в extended-плане при наличии скалярного подзапроса. Зачем это слово ?
    #38482426
dimitr
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Симонов Денис,

нет. Как и в принципе нет информации о детерминированности селективных ХП, которые могут вызываться в выражении.
...
Рейтинг: 0 / 0
FB-3: 'Union' в extended-плане при наличии скалярного подзапроса. Зачем это слово ?
    #38482429
dimitr
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
dimitr,

хотя пока процедуры без подзапросов нельзя вызывать, так что они пофиг :-)
...
Рейтинг: 0 / 0
FB-3: 'Union' в extended-плане при наличии скалярного подзапроса. Зачем это слово ?
    #38482434
Фотография Симонов Денис
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
dimitrdimitr,

хотя пока процедуры без подзапросов нельзя вызывать, так что они пофиг :-)

А что это планируется изменить?
...
Рейтинг: 0 / 0
FB-3: 'Union' в extended-плане при наличии скалярного подзапроса. Зачем это слово ?
    #38482449
dimitr
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
очень надеюсь, что нет :-)
...
Рейтинг: 0 / 0
FB-3: 'Union' в extended-плане при наличии скалярного подзапроса. Зачем это слово ?
    #38482712
Таблоид
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
dimitrТаблоиднельзя ли распространить эту же "идеологию" (закрепления результатов, полученных в DT) на те случаи, когда обращений к таблицам нету, а есть просто вызов "чего-то там недетерминированного"теоретически можно. Но для этого надо уметь находить недетерминированность в произвольно сложном выражении.А мну кажется, что достаточно делать материализацию там, где о ней явно просят. Почти вопят.

Пример-1 . Выдаёт в столбе `rdup` явно не то, о чём многие могли бы подумать:
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
SQL> select r, r*2 rdup from (select cast(rand()*100 as int) r from rdb$database group by 1 having count(*)>0)t;          
Select Expression
    -> Filter
        -> Aggregate
            -> Sort
                -> Table "T RDB$DATABASE" Full Scan

           R                  RDUP
============ =====================
          27                    32

Пример-2. Выдаёт уже нормальное значение (удвоенное `r`):
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
SQL> select r, r*2 rdup from(select r from (select cast(rand()*100 as int) r from rdb$database group by 1 having count(*)>0)t group by 1)t;

Select Expression
    -> Aggregate
        -> Sort
            -> Filter
                -> Aggregate
                    -> Sort
                        -> Table "T T RDB$DATABASE" Full Scan

           R                  RDUP
============ =====================
          26                    52

Почему такие танцы с бубном нужны (я про две сортировки), чтобы не дать rand-значению выскочить наверх ?

PS. Дайте уже хинт типа
Код: sql
1.
/*+ materialize */

- ы ? Изабэлло в GTT'шки запихивать (я про промежуточные результаты для сложносочинённых запросов).
...
Рейтинг: 0 / 0
FB-3: 'Union' в extended-плане при наличии скалярного подзапроса. Зачем это слово ?
    #38482903
Таблоид
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
dimitrТаблоидвычисли `y2` один раз на каждую строку, результат R сохрани в памяти, и сколько бы раз "снаружи" не было упомянуто имя `y2`, используй именно этот результат R".?
верноТут "усиленная" формулировка родилась.
Вычисли для каждой строки derived-таблицы все поля (а не только те, по которым идёт обращение к таблицам!) , сохрани их значения, и сколько бы раз снаружи они не упоминались, используй сохраненные значения.

В примере ниже обращение к таблице идёт только для поля `r1`, а остальные два поля - обычные рандомы. Но их значения, как выясняется, также сохраняются, как и `r1`:
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
SQL> set list on;
SQL> select r1,r1*2 r1dup, r2, r2*2 r2dup, r3, r3*2 r3dup from (select rand()+0*(select 1 from rdb$database) r1, rand() r2, rand() r3 from rdb$database);

Select Expression
    -> Singularity Check
        -> Table "RDB$DATABASE" Full Scan
Select Expression
    -> Union
        -> Table "RDB$DATABASE" Full Scan

R1                              0.3938861820143024
R1DUP                           0.7877723640286048 -- r1dup / r1 = 2
R2                              0.5531059524636754
R2DUP                           1.106211904927351 -- r2dup / r2 = 2 - также, как r1, хотя по нему обращение в таблицу отсутствует.
R3                              0.1867382367974523
R3DUP                           0.3734764735949046 -- r3dup / r3 = 2
...
Рейтинг: 0 / 0
14 сообщений из 14, страница 1 из 1
Форумы / Firebird, InterBase [игнор отключен] [закрыт для гостей] / FB-3: 'Union' в extended-плане при наличии скалярного подзапроса. Зачем это слово ?
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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