powered by simpleCommunicator - 2.0.61     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / Firebird, InterBase [игнор отключен] [закрыт для гостей] / Выборка по rdb$dbkey: добавл-е второго условия по этому "полю" приводит к NATURAL-чтениям
21 сообщений из 21, страница 1 из 1
Выборка по rdb$dbkey: добавл-е второго условия по этому "полю" приводит к NATURAL-чтениям
    #38694988
Таблоид
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
DDL:
Код: plaintext
1.
2.
3.
4.
recreate table t1(id int primary key, x int); 
commit;
insert into t1 values(1, 100);
commit;

Test-1:
Код: plaintext
1.
2.
3.
4.
SQL> select count(*) from t1 where rdb$db_key = ( select rdb$db_key from t1 where id=1 );

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

Trace-1:
Код: plaintext
1.
2.
3.
4.
5.
6.
select count(*) from t1 where rdb$db_key = ( select rdb$db_key from t1 where id=1 )
1 records fetched
      0 ms, 6 fetch(es)

Table                             Natural     Index    Update    Insert    Delete  
***********************************************************************************
T1                                                 2 
(Ok, все чтения - индексные)

Test-2:
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
SQL> select count(*) from t1 
CON> where rdb$db_key = 
CON> ( select rdb$db_key from t1 where id=1 ) 
CON>  or  
CON>  rdb$db_key = ( select rdb$db_key from t1 where id=2 ); 

                COUNT
=====================
                    2

Trace-2:
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
select count(*) from t1 where rdb$db_key = ( select rdb$db_key from t1 where id=1 ) or rdb$db_key = ( select rdb$db_ke
y from t1 where id=2 )
1 records fetched
      0 ms, 16 fetch(es)

Table                             Natural     Index    Update    Insert    Delete   Backout     Purge   Expunge
***************************************************************************************************************
T1                                       2          2

Добавление во where-предикат еще одного условия по rdb$db_key привело к natural'ам. То же самое при замене "=" на "in(...)".
Поведение одинаковое в 2.5 и 3.0.

Это так и должно быть ?
...
Рейтинг: 0 / 0
Выборка по rdb$dbkey: добавл-е второго условия по этому "полю" приводит к NATURAL-чтениям
    #38694992
Фотография kdv
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Таблоид(Ok, все чтения - индексные)
что, правда чтоль, where rdb$db_key = ... ищет по индексу? :-)
...
Рейтинг: 0 / 0
Выборка по rdb$dbkey: добавл-е второго условия по этому "полю" приводит к NATURAL-чтениям
    #38694993
Таблоид
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
PS.
Код: plaintext
SQL> select count(*) from t1 where rdb$db_key = cast('1234' as char(8) character set octets);

Trace:
Код: plaintext
1.
2.
3.
Table                             Natural    
*********************************************
RDB$PAGES                             160

Куда подевалась из статистики 'T1' и причём тут rdb$pages ?!
...
Рейтинг: 0 / 0
Выборка по rdb$dbkey: добавл-е второго условия по этому "полю" приводит к NATURAL-чтениям
    #38694995
Таблоид
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
kdvТаблоид(Ok, все чтения - индексные)
что, правда чтоль, where rdb$db_key = ... ищет по индексу? :-)Не, он просто так *показывается*, типа "скорость такая же шустрая, как по индексу" :-)
Там колонки нет соотв-щей, вот и затокано в IR.
...
Рейтинг: 0 / 0
Выборка по rdb$dbkey: добавл-е второго условия по этому "полю" приводит к NATURAL-чтениям
    #38695005
Гаджимурадов Рустам
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Таблоид> Это так и должно быть ?

С т.з. by design - думаю, да.
Можно "оптимизировать",
конечно, но смысла нет.
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
Выборка по rdb$dbkey: добавл-е второго условия по этому "полю" приводит к NATURAL-чтениям
    #38695011
Таблоид
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Гаджимурадов Рустамсмысла нет.Смысл есть. Как минимум ввиду того, что доступ по rdb$db_key быстрее, чем что либо.
И вот что еще нарылось.

DDL:
Код: plaintext
1.
2.
3.
4.
5.
recreate table t1(id int primary key, x int); commit;
recreate table t2(id int primary key, x int); commit;
insert into t1 values(1, 100);
insert into t1 values(2, 200);
commit;

Test:
Код: 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.
execute block returns(t2_id int, t2_x int)
as
    declare v_dbkey1 char(8) character set octets collate octets;
    declare v_dbkey2 char(8) character set octets collate octets;
    declare v_id int;
    declare v_x int;
begin
    select rdb$db_key from t1 where id=1 into v_dbkey1;
    select rdb$db_key from t1 where id=2 into v_dbkey2;

    --- . . .
    --- . . . тут много всякого нужного кода . . . ---
    --- . . .

    insert into t2(id,x)
    select id,x
    from t1
    join (
        select :v_dbkey1 as xdbkey from rdb$database
        union all
        select :v_dbkey2 as xdbkey from rdb$database
    ) n
    on t1.rdb$db_key = n.xdbkey;

    delete from t1 where rdb$db_key = :v_dbkey1;
    delete from t1 where rdb$db_key = :v_dbkey2;

    for select id, x from t2 into t2_id, t2_x do suspend;
end

Result in FB 3.0 (LI-T6.3.0.31208):
T2_IDT2_X11002200 - т.е. всё Ок.

Result in FB 2.5 (LI-V6.3.3.26737): в таблице T2 - нет строк. Т.е. из T1 они "ушли", а в Т2 так и не "пришли".
...
Рейтинг: 0 / 0
Выборка по rdb$dbkey: добавл-е второго условия по этому "полю" приводит к NATURAL-чтениям
    #38695022
Гаджимурадов Рустам
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Таблоид> Смысл есть

Когда я говорю "смысла нет", я имею
в виду "практического смысла нет".
А практического смысла нет.
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
Выборка по rdb$dbkey: добавл-е второго условия по этому "полю" приводит к NATURAL-чтениям
    #38695034
Dimitry Sibiryakov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ТаблоидДобавление во where-предикат еще одного условия по rdb$db_key привело к
natural'ам. То же самое при замене "=" на "in(...)".
Потому что ты там подзапросы использовал. Используй константы или JOIN - возможно увидишь
другую картину.
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
Выборка по rdb$dbkey: добавл-е второго условия по этому "полю" приводит к NATURAL-чтениям
    #38695037
Таблоид
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Dimitry SibiryakovТаблоидДобавление во where-предикат еще одного условия по rdb$db_key привело к
natural'ам. То же самое при замене "=" на "in(...)".
Потому что ты там подзапросы использовал. Используй константы или JOIN - возможно увидишь другую картину.с константами то же самое, проверял уже.
С джойном тоже: - "проверил, "получил", см выше.
...
Рейтинг: 0 / 0
Выборка по rdb$dbkey: добавл-е второго условия по этому "полю" приводит к NATURAL-чтениям
    #38695046
Гаджимурадов Рустам
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
DS> Потому что ты там подзапросы использовал.

Ну и какая логика в твоём утверждении?
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
Выборка по rdb$dbkey: добавл-е второго условия по этому "полю" приводит к NATURAL-чтениям
    #38695057
dimitr
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ТаблоидЭто так и должно быть ?
твои индексные чтения во втором примере - это выполнения подзапросов. Опять сношаешь нам мозг?

ТаблоидКуда подевалась из статистики 'T1'
а откуда ей там взяться? Ты не прочитал из нее ни одной записи.
...
Рейтинг: 0 / 0
Выборка по rdb$dbkey: добавл-е второго условия по этому "полю" приводит к NATURAL-чтениям
    #38695066
Фотография kdv
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
dimitr,

я бы рассуждал так. Допустим, индексные чтения есть в подзапросе, да. Но основная часть (Пример 1, 2)
select count(*) from t1 where rdb$db_key
в любом случае содержит натуральные чтения (прямое обращение по rdb$db_key), раз там
1 records fetched
а раз нам статистика даже при фетче натуралом не выдает натуральные чтения, то, или
- статистика выдает неверную информацию
- чтение по rdb$db_key не совсем "натурально" для статистики.
...
Рейтинг: 0 / 0
Выборка по rdb$dbkey: добавл-е второго условия по этому "полю" приводит к NATURAL-чтениям
    #38695075
dimitr
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
kdv,

чтения через dbkey исторически отображаются как индексные. В первом примере имеем один IR в подзапросе (настоящий) и один в основном запросе (чтение через dbkey). Во втором примере имеем два IR в подзапросе (настоящие) и два NR в основном запросе (фуллскан). Вывод - Таблоид таки прав, а я погорячился с наездом :-)
...
Рейтинг: 0 / 0
Выборка по rdb$dbkey: добавл-е второго условия по этому "полю" приводит к NATURAL-чтениям
    #38695081
Гаджимурадов Рустам
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
dimitr> два NR в основном запросе (фуллскан).

Собсно, это и есть неправильно, недочёт оптимизатора или ещё чего-то.
Хотя повторюсь, править тут что-то *в данном конкретном примере*
(если это не аукается где-то ещё) - никакого смысла не вижу.
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
Выборка по rdb$dbkey: добавл-е второго условия по этому "полю" приводит к NATURAL-чтениям
    #38695084
dimitr
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Гаджимурадов Рустам,

дык я не спорю. Кому сильно надо, занесет в трекер.
...
Рейтинг: 0 / 0
Выборка по rdb$dbkey: добавл-е второго условия по этому "полю" приводит к NATURAL-чтениям
    #38695088
Гаджимурадов Рустам
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Это ты зря сказал, занесет ведь. :)

P.S. А в чём суть бага? Косяк оптимизатора или
ограничение на допустимые операции с rdb$db_key?
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
Выборка по rdb$dbkey: добавл-е второго условия по этому "полю" приводит к NATURAL-чтениям
    #38695095
dimitr
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Гаджимурадов РустамP.S. А в чём суть бага? Косяк оптимизатора или
ограничение на допустимые операции с rdb$db_key?
оптимизатор, судя по всему
...
Рейтинг: 0 / 0
Выборка по rdb$dbkey: добавл-е второго условия по этому "полю" приводит к NATURAL-чтениям
    #38695210
Таблоид
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
dimitrКому сильно надо, занесет в трекер.Да, припёрло тут слегка... А потому - CORE-4492
...
Рейтинг: 0 / 0
Выборка по rdb$dbkey: добавл-е второго условия по этому "полю" приводит к NATURAL-чтениям
    #38695328
dimitr
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ТаблоидА потому - CORE-4492
как обычно не читаешь, что я пишу. Было же выше про статистику для T1, так нет же - захреначил в трекер :-(
...
Рейтинг: 0 / 0
Выборка по rdb$dbkey: добавл-е второго условия по этому "полю" приводит к NATURAL-чтениям
    #38695337
Таблоид
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
dimitrкак обычно не читаешь, что я пишу. Было же выше про статистику для T1, так нет же - захреначил в трекер :-(я как раз всё прочитал:dimitrТаблоидКуда подевалась из статистики 'T1'
а откуда ей там взяться? Ты не прочитал из нее ни одной записи.
И не понял твоего ответа.
И поскольку в трекере этого примера уже нету (грохнул ты его), то повторю вопрос сюда:
Test-a:
======
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
SQL> out /dev/null;
SQL> select count(*) from rdb$database  where rdb$db_key is null; 

Trace:
=====
1 records fetched
      0 ms, 6 fetch(es)

Table                             Natural   
********************************************
RDB$DATABASE                            1

(несмотря на то, что тут count = 0, ФБ *делает* 1 натуральный скан таблицы rdb$database, и это видно по фетчам)

Test-b:
=======
Код: plaintext
1.
2.
3.
4.
5.
6.
SQL> select count(*) from rdb$database where rdb$db_key =  cast(null as char(8) character set octets); 

Trace:
=====
select count(*) from rdb$database where rdb$db_key = cast(null as char(8) character set octets)
1 records fetched
      0 ms

В этом примере я всего лишь поменял 'is null' на '=', а также значение в правой части условия для rdb$db_key. Левую часть условия - не менял, это всё тот же 'rdb$db_key.

Куда пропала статистика по RDB$DATABASE и почему вдруг ФБ её перестал вообще читать ?
(и такой же результат будет для вот этого: select count(*) from rdb$database where rdb$db_key = cast( 'ABC' as char(8) character set octets); )

Test-c:
=======
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
SQL> select count(*) from rdb$database where rdb$db_key = cast( '1234'  as char(8) character set octets);

Statement 6835:
-------------------------------------------------------------------------------
select count(*) from rdb$database where rdb$db_key = cast('1234' as char(8) character set octets)
1 records fetched
      0 ms, 302 fetch(es)

Table                             Natural     Index    Update    Insert    Delete   Backout     Purge   Expunge
***************************************************************************************************************
RDB$PAGES                             148

По таблице rdb$database статистики нет, но откуда-то теперь вылезла статистика по rdb$pages. Которая вообще непонятно, каким боком сюда пришла.

Можно получить ответ на эти вопросы (я про test-b & test-c) ?
...
Рейтинг: 0 / 0
Выборка по rdb$dbkey: добавл-е второго условия по этому "полю" приводит к NATURAL-чтениям
    #38695357
dimitr
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
test-a: фуллскан, поэтому одно чтение из таблицы есть всегда (даже когда предикат ложный)
test-b: чтение по dbkey (псевдо-индексный скан), но т.к. ищется мура, то запись не найдена, отсюда нулевая статистика
test-с: аналогично предыдущему

чтения из rdb$pages - это что-то внутреннее/служебное попадает в статистику. Почему они только в третьем примере - ХЗ, видимо внутри этот пример чем-то отличается от остальных, копать не вижу смысла.
...
Рейтинг: 0 / 0
21 сообщений из 21, страница 1 из 1
Форумы / Firebird, InterBase [игнор отключен] [закрыт для гостей] / Выборка по rdb$dbkey: добавл-е второго условия по этому "полю" приводит к NATURAL-чтениям
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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