Гость
Форумы / Firebird, InterBase [игнор отключен] [закрыт для гостей] / Странное поведение запроса / 11 сообщений из 11, страница 1 из 1
27.08.2021, 17:21
    #40093524
demon1992
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Странное поведение запроса
Скрипт:
Код: sql
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.
create table t1 (id bigint not null, primary key(id));
create table t2 (id bigint not null, primary key(id));
create table t3 (id bigint GENERATED BY DEFAULT AS IDENTITY not null, id_t1 bigint not null, id_t2 bigint not null, flg1 smallint default 0, flg2 smallint default 0,
                 primary key(id), foreign key (id_t1) REFERENCES t1(id), foreign key (id_t2) REFERENCES t2(id));
create index t3_idx on t3 (id_t2,flg1);
commit work;

set term ^;
execute block
as
declare variable i int=1;
begin
insert into t2(id)
select 1 from rdb$database
union
select 2 from rdb$database;

while (:i<=2000000)
do
begin
insert into t1(id)
values(:i);

insert into t3(id_t1,id_t2)
values(:i, 1);

insert into t3(id_t1,id_t2)
values(:i, 2);

i=:i+1;
end
end^

set term ;^

update t3 set flg1=1 where id<=500000;

commit work;

set statistics index t3_idx;

commit work;



Собственно сам запрос:
Раз
Код: sql
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.
Query
------------------------------------------------
execute block
as
declare variable ID bigint;
begin
  for select ID
      from T3
      where ID_T2 = 1 and
            FLG1 = 0 and
            FLG2 = 0
      into :ID
  do
  begin
    break;
  end
end

Plan
------------------------------------------------
PLAN (T3 INDEX (T3_IDX))

Query Time
------------------------------------------------
Prepare       : 0,00 ms
Execute       : 156,00 ms
Avg fetch time: 0,00 ms

Memory
------------------------------------------------
Current: 1 120 421 232
Max    : 1 157 990 336
Buffers: 65 536

Operations
------------------------------------------------
Read   : 0
Writes : 0
Fetches: 253 075
Marks  : 0


Enchanced Info:
+-------------------------------+-----------+-----------+-------------+---------+---------+---------+----------+----------+----------+
|          Table Name           |  Records  |  Indexed  | Non-Indexed | Updates | Deletes | Inserts | Backouts |  Purges  | Expunges |
|                               |   Total   |   reads   |    reads    |         |         |         |          |          |          |
+-------------------------------+-----------+-----------+-------------+---------+---------+---------+----------+----------+----------+
|T3                             |         0 |    250001 |           0 |       0 |       0 |       0 |        0 |        0 |        0 |
+-------------------------------+-----------+-----------+-------------+---------+---------+---------+----------+----------+----------+



Два
Код: sql
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.
Query
------------------------------------------------
execute block
as
declare variable ID bigint;
begin
  for select ID
      from T3
      where ID_T2 = 1 and
            FLG1 = 0 and
            FLG2 = 1
      into :ID
  do
  begin
    break;
  end
end

Plan
------------------------------------------------
PLAN (T3 INDEX (T3_IDX))

Query Time
------------------------------------------------
Prepare       : 0,00 ms
Execute       : 1 139,00 ms
Avg fetch time: 0,00 ms

Memory
------------------------------------------------
Current: 1 120 421 232
Max    : 1 157 990 336
Buffers: 65 536

Operations
------------------------------------------------
Read   : 0
Writes : 0
Fetches: 2 016 331
Marks  : 0


Enchanced Info:
+-------------------------------+-----------+-----------+-------------+---------+---------+---------+----------+----------+----------+
|          Table Name           |  Records  |  Indexed  | Non-Indexed | Updates | Deletes | Inserts | Backouts |  Purges  | Expunges |
|                               |   Total   |   reads   |    reads    |         |         |         |          |          |          |
+-------------------------------+-----------+-----------+-------------+---------+---------+---------+----------+----------+----------+
|T3                             |         0 |   2000000 |           0 |       0 |       0 |       0 |        0 |        0 |        0 |
+-------------------------------+-----------+-----------+-------------+---------+---------+---------+----------+----------+----------+



Почему при добавление в условие третьего и последующего полей такое поведение? Причем не только наличие самого условия, так еще и значение влияет.

Тестил и на винде и на линуксе, 3.0.7 SS

P.S. Статистику по по всем индексам не забудьте пересчитать.
...
Рейтинг: 0 / 0
27.08.2021, 17:27
    #40093526
Мимопроходящий
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Странное поведение запроса
странные запросы, странные индексы, сервер неизвестен...
...
Рейтинг: 0 / 0
27.08.2021, 17:31
    #40093528
demon1992
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Странное поведение запроса
Мимопроходящий
странные запросы, странные индексы, сервер неизвестен...

Сервер дописал уже.
Запрос не странный, просто накидал побырому чтобы показать суть.

В реале запрос такой:
Код: sql
1.
2.
3.
4.
5.
update t3
set flg1=1
where flg1=0 and 
id_t2=? and 
flg2=1;
...
Рейтинг: 0 / 0
27.08.2021, 17:42
    #40093531
Мимопроходящий
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Странное поведение запроса
покажи, сколько записей попадают в это условие.
сделай COUNT().
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
27.08.2021, 18:03
    #40093533
demon1992
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Странное поведение запроса
Мимопроходящий,
Я хз как корректно ответить на твой вопрос. В любой момент времени может быть разное кол-во, как оно на это влияет?
Смысл в том, что приведенная таблица это некая очередь, и мне нужно все лишь помечать отправленные пакеты флагом принят, т.е. flg1 это принят, flg2 отправлен.
Смысл в том что и в первом и втором случае скан таблицы идет по индексу, понятное дело что в нем содержится 2кк записей, но почему тогда в одном случае читает 250к, а в другом все строки индекса?

Я понимаю что решить эту проблему можно будет включив в индекс третье поле, но как то хотел обойтись без этого.
...
Рейтинг: 0 / 0
27.08.2021, 18:07
    #40093535
hvlad
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Странное поведение запроса
demon1992
Статистику по по всем индексам не забудьте пересчитать.
А ыт по всем пересчитал ? И по FK тоже ?
...
Рейтинг: 0 / 0
27.08.2021, 18:29
    #40093542
kdv
kdv
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Странное поведение запроса
demon1992,

после апдейтов мусор собран? кроме того вдуплять сколько там каких записей в пятницу вечером - ну ваще не аллё.
Насколько я понял, в результате манипуляций скрипта
- в t3 - 4 млн записей (по 2 млн с id_t2=1 и с id_t2=2)
- в t3 в результате апдейта update t3 set flg1=1 where id<=500000; получаем 500к записей с flg1=1. Причем, 250к из них это id_t2=1, и 250к id_t2=2

в первом запросе выбираем - ID_T2 = 1 два миллиона, flg1=0 750 тысяч, и ... тут уже не стыкуется. Где-то я ошибся.
И - специально сделал поиск по топику, в запросах мы имеем flg2=0 или flg2=1, а апдейта или заполнения столбца flg2 нигде нет.
Вот зачем людям голову морочить...
...
Рейтинг: 0 / 0
27.08.2021, 19:51
    #40093550
demon1992
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Странное поведение запроса
hvlad,
По всем.
...
Рейтинг: 0 / 0
27.08.2021, 19:53
    #40093551
hvlad
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Странное поведение запроса
demon1992,

если по всем, то картинка уже другая будет.
Хотя... я на fb4 проверял, но не думаю, что есть разница.
...
Рейтинг: 0 / 0
27.08.2021, 19:55
    #40093552
hvlad
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Странное поведение запроса
Дюбавлю - смотри на explained plan, а не на обычный.
...
Рейтинг: 0 / 0
27.08.2021, 20:28
    #40093557
kdv
kdv
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Странное поведение запроса
demon1992,

короче, гражданин. Манипулируешь в where
Код: plaintext
1.
2.
3.
      from T3
      where ID_T2 = 1 and
            FLG1 = 0 and
            FLG2 = 1

- ну так дай и себе и нам
Код: plaintext
1.
2.
select count(id), id_t2, flg1, flg2
from t3
group by  id_t2, flg1, flg2
И не надо было морочить голову с начальным скриптом, там половина не используется в вопросе, а другую половину на селедку наматывали.
...
Рейтинг: 0 / 0
Форумы / Firebird, InterBase [игнор отключен] [закрыт для гостей] / Странное поведение запроса / 11 сообщений из 11, страница 1 из 1
Целевая тема:
Создать новую тему:
Автор:
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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