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

Народ, объясните крестьянину, плз: каким образом наличие descend-индекса (и, след., возможность быстро хапать по нему max(id)) может влиять на.... рандом-распределение выводимых значений ?!

DDL:
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
Database:  localhost/3333:/var/db/fb30/oltp30.fdb
SQL> recreate table tmp(id int not null);
SQL> insert into tmp select row_number()over() from rdb$types,rdb$types;
 -- NB! индекса пока что НЕТ. 
SQL> commit;
SQL> select count(*) from tmp;

                COUNT
=====================
                63001

SQL> commit;

Теперь ввожу на выполнение:

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
SQL> set term ^;
SQL> execute block returns(id int) as
CON> declare n int = 20;
CON> begin
CON>   while (n>0) do
CON>   begin
CON>     select id from tmp u
CON>     where id > rand()*(select max(id) from tmp)
CON>     rows 1
CON>     into id;
CON>     suspend;
CON>     n=n-1;
CON>   end
CON> end^

- и получаю всё время какие-то "странно-маленькие" ID'шники:
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
          ID
============
         296
         662
         286
         377
         540
         333
         466
         459
         106
         169
         328
         504
         729
          96
         166
         472
         224
         365
         545
         151
SQL> set term ;^
SQL> commit;

А теперь добавляю индекс:

Код: plaintext
1.
SQL> create descending index tmp_id on tmp(id);
SQL> commit;

- и повторяю ввод этого же кода:
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
SQL> execute block returns(id int) as
CON> declare n int = 20;
CON> begin
CON>   while (n>0) do
CON>   begin
CON>     select id from tmp u
CON>     where id > rand()*(select max(id) from tmp)
CON>     rows 1
CON>     into id;
CON>     suspend;
CON>     n=n-1;
CON>   end
CON> end^

Получаю при это вполне себе нормальное распределение:
Код: 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.
          ID
============
        6928
       25084
       21343
       36673
       28143
        6283
        4878
       33482
       14137
       15715
       32390
       45722
       52252
       32475
       31864
        9774
       44583
       50163
       53328
       35127

SQL> set term ;^
SQL> commit;

Ы ?!

PS.
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
SQL> show version;
ISQL Version: LI-T3.0.0.30889 Firebird 3.0 Alpha 2
Server version:
Firebird/Linux/AMD/Intel/x64 (access method), version "LI-T3.0.0.30889 Firebird 3.0 Alpha 2"
Firebird/Linux/AMD/Intel/x64 (remote server), version "LI-T3.0.0.30889 Firebird 3.0 Alpha 2/tcp (oel64)/P13"
Firebird/Linux/AMD/Intel/x64 (remote interface), version "LI-T3.0.0.30889 Firebird 3.0 Alpha 2/tcp (oel64)/P13"
on disk structure version 12.0
...
Рейтинг: 0 / 0
Отсутствие descend-индекса влияет на распределение random-значений. Как это ?!
    #38578136
Таблоид
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
то же самое вижу на
Код: plaintext
1.
2.
3.
4.
5.
6.
ISQL Version: LI-V2.5.3.26744 Firebird 2.5
Server version:
Firebird/linux AMD64 (access method), version "LI-V2.5.3.26744 Firebird 2.5"
Firebird/linux AMD64 (remote server), version "LI-V2.5.3.26744 Firebird 2.5/tcp (oel64)/P12"
Firebird/linux AMD64 (remote interface), version "LI-V2.5.3.26744 Firebird 2.5/tcp (oel64)/P12"
on disk structure version 11.2
(только там, ес-сно, заполнял таблицу через генератор)
...
Рейтинг: 0 / 0
Отсутствие descend-индекса влияет на распределение random-значений. Как это ?!
    #38578140
Фотография Симонов Денис
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Таблоид,

а если вот так
Код: sql
1.
2.
3.
4.
5.
.................................
select id from tmp u
where id > rand()*(select max(id) from tmp)
order by id desc rows 1
into id;
...
Рейтинг: 0 / 0
Отсутствие descend-индекса влияет на распределение random-значений. Как это ?!
    #38578153
Таблоид
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Симонов ДенисТаблоид,

а если вот так
Код: sql
1.
2.
3.
4.
5.
.................................
select id from tmp u
where id > rand()*(select max(id) from tmp)
order by id desc rows 1
into id;

то же самое.
БЕЗ индекса "спасает" от перекоса только вот этот вариант:
Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
set term ^;
execute block returns(id int) as
declare n int = 20;
begin
  while (n>0) do
  begin
    select id from tmp u
    where id > (select rand()*max(id) from tmp)
    --where id > (rand()*(select max(id) from tmp))
    --where id > rand()*(select max(id) from tmp)
    rows 1
    into id;
    suspend;
    n=n-1;
  end
end^
set term ;^
commit;
...
Рейтинг: 0 / 0
Отсутствие descend-индекса влияет на распределение random-значений. Как это ?!
    #38578161
Фотография Симонов Денис
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Таблоид,

я имел ввиду, что rows 1 без order by может выдать не совсем желаемое, но в случае с rand конечно пофиг.

а с индексом этот вариант как себя ведёт?

Код: sql
1.
2.
3.
4.
5.
.................................
select id from tmp u
where id > rand()*(select max(id) from tmp)
order by id desc rows 1
into id;
...
Рейтинг: 0 / 0
Отсутствие descend-индекса влияет на распределение random-значений. Как это ?!
    #38578162
Таблоид
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Сабж не совсем корректен: это вообще индекс влияет, неважно какой: asc / desc.
Добавление ascend-индекса также приводит выборку в норму.
...
Рейтинг: 0 / 0
Отсутствие descend-индекса влияет на распределение random-значений. Как это ?!
    #38578164
Таблоид
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Симонов Денис
Код: sql
1.
2.
where id > rand()*(select max(id) from tmp)
order by id desc rows 1

Он выдаёт 20 строк с одним и тем же значением, равным max(id) (в моём случае - 20 строк с 63001 :))
...
Рейтинг: 0 / 0
Отсутствие descend-индекса влияет на распределение random-значений. Как это ?!
    #38578170
Таблоид
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ТаблоидСимонов Денис
Код: sql
1.
2.
where id > rand()*(select max(id) from tmp)
order by id desc rows 1


Он выдаёт 20 строк с одним и тем же значением, равным max(id) (в моём случае - 20 строк с 63001 :))да и все прочие варианты - то же.
...
Рейтинг: 0 / 0
Отсутствие descend-индекса влияет на распределение random-значений. Как это ?!
    #38578207
Dimitry Sibiryakov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
"Ну, вы, блин, даёте..." (с)

Поставьте себя на место сервера и учтите, что подзапрос он традиционно выполняет для
каждой проверяемой записи в таблице. Вот проверяет он запись 1, выполняет подзапрос.
Проверяет запись 2, выполняет подзапрос. Какая вероятность того, что тервер сдастся и к
200-й попытке таки сгенерит случайное значение меньшее чем текущий номер?..
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
Отсутствие descend-индекса влияет на распределение random-значений. Как это ?!
    #38578229
Таблоид
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Хорошо, вот то же самое, но через джойны:
Код: sql
1.
2.
3.
4.
-- выдаёт нормальное распреление (что с индексом, что без него):
select id from tmp u join (select r from (select rand()*max(id) r from tmp) group by 1) m on u.id > m.r
rows 1
--  PLAN JOIN (SORT (M TMP NATURAL), U NATURAL)


== vs ==
Код: sql
1.
2.
3.
4.
-- если БЕЗ индекса, то выдаёт данные "возле нуля":
select id from tmp u join (select r from (select rand()*max(id) r from tmp) order by 1 rows 1) m on u.id > m.r
rows 1
-- PLAN JOIN (SORT (M TMP NATURAL), U NATURAL)



Отличия в планах я не вижу (видать, опять что-то не показывает), отличие в результате - разительное.

При создании индекса план будет:PLAN JOIN (SORT (M TMP ORDER TMP_ID), U INDEX (TMP_ID)) - и результат станет уже нормальным.
Но ведь это всё равно JOIN, и в нём опять на каждой итерации поля в каждом источнике должны "перевычисляться" для каждой записи.
Я не догоняю, почему при индексе всё становится на свои места.
...
Рейтинг: 0 / 0
10 сообщений из 10, страница 1 из 1
Форумы / Firebird, InterBase [игнор отключен] [закрыт для гостей] / Отсутствие descend-индекса влияет на распределение random-значений. Как это ?!
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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