Гость
Целевая тема:
Создать новую тему:
Автор:
Форумы / Firebird, InterBase [игнор отключен] [закрыт для гостей] / Выборка по rdb$dbkey: добавл-е второго условия по этому "полю" приводит к NATURAL-чтениям / 21 сообщений из 21, страница 1 из 1
12.07.2014, 15:20
    #38694988
Таблоид
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Выборка по rdb$dbkey: добавл-е второго условия по этому "полю" приводит к NATURAL-чтениям
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
12.07.2014, 15:27
    #38694992
kdv
kdv
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Выборка по rdb$dbkey: добавл-е второго условия по этому "полю" приводит к NATURAL-чтениям
Таблоид(Ok, все чтения - индексные)
что, правда чтоль, where rdb$db_key = ... ищет по индексу? :-)
...
Рейтинг: 0 / 0
12.07.2014, 15:27
    #38694993
Таблоид
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Выборка по rdb$dbkey: добавл-е второго условия по этому "полю" приводит к NATURAL-чтениям
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
12.07.2014, 15:28
    #38694995
Таблоид
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Выборка по rdb$dbkey: добавл-е второго условия по этому "полю" приводит к NATURAL-чтениям
kdvТаблоид(Ok, все чтения - индексные)
что, правда чтоль, where rdb$db_key = ... ищет по индексу? :-)Не, он просто так *показывается*, типа "скорость такая же шустрая, как по индексу" :-)
Там колонки нет соотв-щей, вот и затокано в IR.
...
Рейтинг: 0 / 0
12.07.2014, 15:40
    #38695005
Гаджимурадов Рустам
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Выборка по rdb$dbkey: добавл-е второго условия по этому "полю" приводит к NATURAL-чтениям
Таблоид> Это так и должно быть ?

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

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

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

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

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

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

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

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

P.S. А в чём суть бага? Косяк оптимизатора или
ограничение на допустимые операции с rdb$db_key?
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
12.07.2014, 19:23
    #38695095
dimitr
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Выборка по rdb$dbkey: добавл-е второго условия по этому "полю" приводит к NATURAL-чтениям
Гаджимурадов РустамP.S. А в чём суть бага? Косяк оптимизатора или
ограничение на допустимые операции с rdb$db_key?
оптимизатор, судя по всему
...
Рейтинг: 0 / 0
13.07.2014, 01:55
    #38695210
Таблоид
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Выборка по rdb$dbkey: добавл-е второго условия по этому "полю" приводит к NATURAL-чтениям
dimitrКому сильно надо, занесет в трекер.Да, припёрло тут слегка... А потому - CORE-4492
...
Рейтинг: 0 / 0
13.07.2014, 14:49
    #38695328
dimitr
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Выборка по rdb$dbkey: добавл-е второго условия по этому "полю" приводит к NATURAL-чтениям
ТаблоидА потому - CORE-4492
как обычно не читаешь, что я пишу. Было же выше про статистику для T1, так нет же - захреначил в трекер :-(
...
Рейтинг: 0 / 0
13.07.2014, 15:18
    #38695337
Таблоид
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Выборка по rdb$dbkey: добавл-е второго условия по этому "полю" приводит к NATURAL-чтениям
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
13.07.2014, 16:05
    #38695357
dimitr
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Выборка по rdb$dbkey: добавл-е второго условия по этому "полю" приводит к NATURAL-чтениям
test-a: фуллскан, поэтому одно чтение из таблицы есть всегда (даже когда предикат ложный)
test-b: чтение по dbkey (псевдо-индексный скан), но т.к. ищется мура, то запись не найдена, отсюда нулевая статистика
test-с: аналогично предыдущему

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


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